LPIC201/202 あずき本 ch4 デバイスとファイルシステム (1/3)

LPIC201勉強メモ資格勉強

出典: 

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} or UUID=${UUID}
    • /dev/sda1 とか
    • cloudimg-rootfsとか
  • /

    • マウントポイント
  • xfs

    • ファイルシステムの種類
  • defaults

    • マウントオプション
  • 0

    • dumpコマンドの対象とするか
  • 0

    • fsckの対象とするか・その順序(1,2,…の順番)

Column: UUIDの確認

  • パーティションへのラベル付け・確認はファイルシステム別コマンドを使用する

    • ext2ならe2labelとか
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

ファイルを書き込めること確認(defaultsrwをふくむ)

  • マウントオプション
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