4.1 ファイルシステムの操作
column: VFS
VFS: Virtual File System (仮想ファイルシステム)
-
実際のファイルシステムの上位の抽象化層
- ext2/ext3/ext4/isofs/vfat等を隠蔽
- システムコールはVFSを叩く
4.1.1 ファイルシステムの情報
cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue Nov 10 18:06:00 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=24481a5c-eda4-4815-b7e5-9d86ef6e4320 / xfs defaults 0 0
UUID=6879-2FAF /boot/efi vfat defaults,uid=0,gid=0,umask=0077,shortname=winnt 0 0
/etc/fstab
の書式
UUID=24481a5c-eda4-4815-b7e5-9d86ef6e4320 / xfs defaults 0 0
-
UUID=24481a5c-eda4-4815-b7e5-9d86ef6e4320
- パーティションのデバイスファイル名 or
LABEL=${LABEL}
orUUID=${UUID}
/dev/sda1
とかcloudimg-rootfs
とか
- パーティションのデバイスファイル名 or
-
/
- マウントポイント
-
xfs
- ファイルシステムの種類
-
defaults
- マウントオプション
-
0
- dumpコマンドの対象とするか
-
0
- fsckの対象とするか・その順序(1,2,…の順番)
Column: UUIDの確認
-
パーティションへのラベル付け・確認はファイルシステム別コマンドを使用する
- ext2なら
e2label
とか
- ext2なら
sudo xfs_admin -u /dev/sda2
UUID = 24481a5c-eda4-4815-b7e5-9d86ef6e4320
一覧するにはblkid
sudo blkid
/dev/sda1: SEC_TYPE="msdos" UUID="6879-2FAF" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="28483af6-b921-45a7-88cc-6684862860b8"
/dev/sda2: LABEL="root" UUID="24481a5c-eda4-4815-b7e5-9d86ef6e4320" TYPE="xfs" PARTUUID="6f45911c-0283-4ab5-9118-615ebbf4e314"
/dev/disk/
で各種値からデバイスファイルをルックアップすることもできる
ls -l /dev/disk/
total 0
drwxr-xr-x. 2 root root 160 Dec 12 00:37 by-id
drwxr-xr-x. 2 root root 60 Dec 12 00:37 by-label
drwxr-xr-x. 2 root root 60 Dec 12 00:37 by-partlabel
drwxr-xr-x. 2 root root 80 Dec 12 00:37 by-partuuid
drwxr-xr-x. 2 root root 100 Dec 12 00:37 by-path
drwxr-xr-x. 2 root root 80 Dec 12 00:37 by-uuid
ls -l /dev/disk/by-uuid/
total 0
lrwxrwxrwx. 1 root root 10 Dec 12 00:37 24481a5c-eda4-4815-b7e5-9d86ef6e4320 -> ../../sda2
lrwxrwxrwx. 1 root root 10 Dec 12 00:37 6879-2FAF -> ../../sda1
UUIDを変更するときは(普通しないが)uuidgen
で生成してtune2fs
で変更
uuidgen
70110f92-ac21-40f6-ba52-aa32cdfe2d80
使用可能なファイルシステム
cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev ramfs
nodev bdev
nodev proc
nodev cgroup
nodev cpuset
nodev tmpfs
nodev devtmpfs
nodev debugfs
nodev securityfs
nodev sockfs
nodev dax
nodev bpf
nodev pipefs
nodev configfs
nodev devpts
nodev hugetlbfs
nodev autofs
nodev pstore
nodev efivarfs
nodev mqueue
nodev selinuxfs
xfs
vfat
疑似ファイルシステムも含まれる
マウント状況確認
cat /etc/mtab
rootfs / rootfs rw 0 0
sysfs /sys sysfs rw,seclabel,nosuid,nodev,noexec,relatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
devtmpfs /dev devtmpfs rw,seclabel,nosuid,size=498768k,nr_inodes=124692,mode=755 0 0
securityfs /sys/kernel/security securityfs rw,nosuid,nodev,noexec,relatime 0 0
tmpfs /dev/shm tmpfs rw,seclabel,nosuid,nodev 0 0
devpts /dev/pts devpts rw,seclabel,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs /run tmpfs rw,seclabel,nosuid,nodev,mode=755 0 0
tmpfs /sys/fs/cgroup tmpfs ro,seclabel,nosuid,nodev,noexec,mode=755 0 0
cgroup /sys/fs/cgroup/systemd cgroup rw,seclabel,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd 0 0
pstore /sys/fs/pstore pstore rw,nosuid,nodev,noexec,relatime 0 0
efivarfs /sys/firmware/efi/efivars efivarfs rw,nosuid,nodev,noexec,relatime 0 0
cgroup /sys/fs/cgroup/cpuset cgroup rw,seclabel,nosuid,nodev,noexec,relatime,cpuset 0 0
cgroup /sys/fs/cgroup/pids cgroup rw,seclabel,nosuid,nodev,noexec,relatime,pids 0 0
cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,seclabel,nosuid,nodev,noexec,relatime,cpuacct,cpu 0 0
cgroup /sys/fs/cgroup/freezer cgroup rw,seclabel,nosuid,nodev,noexec,relatime,freezer 0 0
cgroup /sys/fs/cgroup/devices cgroup rw,seclabel,nosuid,nodev,noexec,relatime,devices 0 0
cgroup /sys/fs/cgroup/net_cls,net_prio cgroup rw,seclabel,nosuid,nodev,noexec,relatime,net_prio,net_cls 0 0
cgroup /sys/fs/cgroup/blkio cgroup rw,seclabel,nosuid,nodev,noexec,relatime,blkio 0 0
cgroup /sys/fs/cgroup/hugetlb cgroup rw,seclabel,nosuid,nodev,noexec,relatime,hugetlb 0 0
cgroup /sys/fs/cgroup/perf_event cgroup rw,seclabel,nosuid,nodev,noexec,relatime,perf_event 0 0
cgroup /sys/fs/cgroup/memory cgroup rw,seclabel,nosuid,nodev,noexec,relatime,memory 0 0
configfs /sys/kernel/config configfs rw,relatime 0 0
/dev/sda2 / xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0
selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0
systemd-1 /proc/sys/fs/binfmt_misc autofs rw,relatime,fd=26,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=12488 0 0
debugfs /sys/kernel/debug debugfs rw,relatime 0 0
hugetlbfs /dev/hugepages hugetlbfs rw,seclabel,relatime 0 0
mqueue /dev/mqueue mqueue rw,seclabel,relatime 0 0
/dev/sda1 /boot/efi vfat rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=ascii,shortname=winnt,errors=remount-ro 0 0
tmpfs /run/user/1000 tmpfs rw,seclabel,nosuid,nodev,relatime,size=101380k,mode=700,uid=1000,gid=1001 0 0
書籍曰く:
/etc/mtab
は不用意に編集しないこと/proc/mounts
とほぼ同じ内容なので、書き換えてしまったら/proc/mounts
から復旧可能
とあるが、勉強環境(centos7,ubuntu18.04)ではsymlinkでそもそも同じものを指していた
ls -l /etc/mtab
lrwxrwxrwx. 1 root root 17 Nov 10 18:06 /etc/mtab -> /proc/self/mounts
ls -l /proc/mounts
lrwxrwxrwx. 1 root root 11 Dec 12 02:04 /proc/mounts -> self/mounts
マウントオプション
上記/etc/mtab
で使われてたやつ
cat /etc/mtab | cut -d ' ' -f 4 | tr ',' '\n' | sed 's/=.*/=/' | sort -u
attr2
blkio
codepage=
cpu
cpuacct
cpuset
devices
direct
dmask=
errors=
fd=
fmask=
freezer
gid=
hugetlb
inode64
iocharset=
maxproto=
memory
minproto=
mode=
name=
net_cls
net_prio
nodev
noexec
noquota
nosuid
nr_inodes=
perf_event
pgrp=
pids
pipe_ino=
ptmxmode=
relatime
release_agent=
ro
rw
seclabel
shortname=
size=
timeout=
uid=
xattr
めっちゃある
defaults
を指定すると下記の太字のものが設定される
-
async/sync
- I/Oが非同期/同期
-
atime/noatime
- アクセスごとにiノードのアクセス時刻(atime)を更新する/しない
-
relatime/norelatime
- atimeを(デフォルトで)日に一度更新/しない
-
auto/noauto
mount -a
による自動マウント可能/不可能
-
dev/nodev
- キャラクタスペシャルデバイスorブロックスペシャルデバイスを利用可能にする/しない
-
exec/noexec
- バイナリ実行許可/不許可
-
user/nouser
- 管理者でない一般ユーザにマウント許可/不許可
- user: マウントしたユーザのみアンマウント許可
-
users
- 管理者でない一般ユーザにマウント許可
- マウントしたユーザ以外のユーザによるアンマウント許可
-
rw/ro
- 書き込み許可/不許可
-
suid/nosuid
- SUID,SGIDビット有効/無効
4.1.2 マウントとアンマウント
パラメータなしでmount
コマンドを実行すると/etc/mtab
とそっくりな情報を得る
mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=498768k,nr_inodes=124692,mode=755)
...
パーティション切るの面倒なのでループバックデバイスで遊ぶ
100MBディスクイメージを作成
dd if=/dev/zero of=loop1.img bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.196444 s, 534 MB/s
作成したイメージを/dev/loop0と関連付ける
sudo losetup /dev/loop0 loop1.img
ls -l /dev/loop0
ブロックデバイス /dev/loop0
ができている
brw-rw----. 1 root disk 7, 0 Dec 12 02:46 /dev/loop0
ext4ファイルシステム構築
sudo mkfs.ext4 /dev/loop0
mke2fs 1.42.9 (28-Dec-2013)
Discarding device blocks: done
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
25688 inodes, 102400 blocks
5120 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=33685504
13 block groups
8192 blocks per group, 8192 fragments per group
1976 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
fstab記述のためにラベルを付ける
sudo e2label /dev/loop0 loop0
sudo e2label /dev/loop0
loop0
ラベルloop0
によるルックアップができること確認
ls -l /dev/disk/by-label/
total 0
lrwxrwxrwx. 1 root root 11 Dec 12 03:03 loop0 -> ../../loop0
lrwxrwxrwx. 1 root root 10 Dec 12 00:37 root -> ../../sda2
/etc/fstab
に追記
echo 'LABEL=loop0 /mnt/loop0 ext4 defaults 0 0' | sudo tee -a /etc/fstab
cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue Nov 10 18:06:00 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=24481a5c-eda4-4815-b7e5-9d86ef6e4320 / xfs defaults 0 0
UUID=6879-2FAF /boot/efi vfat defaults,uid=0,gid=0,umask=0077,shortname=winnt 0 0
LABEL=loop0 /mnt/loop0 ext4 defaults 0 0
自動マウント
マウントポイントは掘っておく必要がある
sudo mkdir /mnt/loop0
sudo mount -a
ファイルを書き込めること確認(defaults
はrw
をふくむ)
- マウントオプション
sudo touch /mnt/loop0/foo
ls -l /mnt/loop0/foo
-rw-r--r--. 1 root root 0 Dec 12 03:11 /mnt/loop0/foo
ro
にして再マウントしてみる
#
# /etc/fstab
# Created by anaconda on Tue Nov 10 18:06:00 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=24481a5c-eda4-4815-b7e5-9d86ef6e4320 / xfs defaults 0 0
UUID=6879-2FAF /boot/efi vfat defaults,uid=0,gid=0,umask=0077,shortname=winnt 0 0
- LABEL=loop0 /mnt/loop0 ext4 defaults 0 0
+ LABEL=loop0 /mnt/loop0 ext4 defaults,ro 0 0
sudo mount -o remount /mnt/loop0
sudo touch /mnt/loop0/bar
書き込めなくなる。OK
touch: cannot touch '/mnt/loop0/bar': Read-only file system
/etc/fstab
のマウントオプションをオーバライドしてマウントすることもできる
-w
: 書き込み可能
sudo umount /mnt/loop0
sudo mount -w /mnt/loop0
grep -e loop0 /etc/mtab
/dev/loop0 /mnt/loop0 ext4 rw,seclabel,relatime,data=ordered 0 0
sudo touch /mnt/loop0/baz
(エラー出ない)
4.1.3 syncコマンド
Dirtyなディスクバッファをディスクに書き戻す
4.1.4 スワップ
専用のパーティション上に確保する
パーティション切るの面倒くさいので、ファイル/tmp/swapfile
を使ってループバックデバイス/dev/loop1
を作って遊ぶ
dd if=/dev/zero of=/tmp/swapfile bs=1M count=500
500+0 records in
500+0 records out
524288000 bytes (524 MB) copied, 0.644626 s, 813 MB/s
sudo losetup /dev/loop1 /tmp/swapfile
ls -l /dev/disk/by-uuid/
デバイスファイルが追加されていること確認
total 0
lrwxrwxrwx. 1 root root 10 Dec 12 00:37 24481a5c-eda4-4815-b7e5-9d86ef6e4320 -> ../../sda2
lrwxrwxrwx. 1 root root 10 Dec 12 00:37 6879-2FAF -> ../../sda1
lrwxrwxrwx. 1 root root 11 Dec 12 03:03 d09a5767-36d4-44ee-a383-9cb33dcd0648 -> ../../loop0
lrwxrwxrwx. 1 root root 11 Dec 12 10:04 fc3ed7db-d405-43e3-b36b-700842849510 -> ../../loop1
ループバックデバイス上にスワップ作成
-c
: checkdisk
sudo mkswap -c /dev/loop1
0 bad pages
Setting up swapspace version 1, size = 511996 KiB
no label, UUID=fc3ed7db-d405-43e3-b36b-700842849510
ブロックデバイス一覧確認
- マウントポイントは
[SWAP]
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
|-sda1 8:1 0 200M 0 part /boot/efi
`-sda2 8:2 0 19.8G 0 part /
loop0 7:0 0 100M 0 loop /mnt/loop0
loop1 7:1 0 500M 0 loop [SWAP]
スワップ確認
swapon -s
Filename Type Size Used Priority
/dev/loop1 partition 511996 0 -2
ファイルに直接確保する
ファイルを直接スワップ領域として利用することもできる
dd if=/dev/zero of=/tmp/swapfile2 bs=1M count=500
500+0 records in
500+0 records out
524288000 bytes (524 MB) copied, 0.526585 s, 996 MB/s
mkswap /tmp/swapfile2
Setting up swapspace version 1, size = 511996 KiB
no label, UUID=8b195571-0093-441b-a298-46883ebc00ea
sudo swapon /tmp/swapfile2
swapon: /tmp/swapfile2: insecure permissions 0664, 0600 suggested.
swapon: /tmp/swapfile2: insecure file owner 1000, 0 (root) suggested.
アクティブなスワップが追加されている
swapon -s
Filename Type Size Used Priority
/dev/loop1 partition 511996 0 -2
/tmp/swapfile2 file 511996 0 -3
ブロックデバイスを作ったわけではないのでlsblk
結果には出てこない
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
|-sda1 8:1 0 200M 0 part /boot/efi
`-sda2 8:2 0 19.8G 0 part /
loop0 7:0 0 100M 0 loop /mnt/loop0
loop1 7:1 0 500M 0 loop [SWAP]
スワップ全てアンマウント
sudo swapoff -a
cat /proc/swaps
Filename Type Size Used Priority
後始末
作ったループバックデバイスを一旦後始末しておく
losetup -D
: detach
sudo losetup -D /dev/loop{0,1}
rm /tmp/swapfile
rm /tmp/swapfile2