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

LPIC201勉強メモ資格勉強

出典: 

4.2 ファイルシステムの作成

  • ファイルシステムごとにコマンドが用意されている
  • mkfsコマンドをフロントエンドとして色々作れる

4.2.1 ext2/ext3/ext4ファイルシステムの作成

mke2fs

名前に反してex2/ext3/ext4 ファイルシステムを作れる

cat /etc/mke2fs.conf

デフォルト値は/etc/mke2fs.confで設定できる

[defaults]
	base_features = sparse_super,filetype,resize_inode,dir_index,ext_attr
	default_mntopts = acl,user_xattr
	enable_periodic_fsck = 0
	blocksize = 4096
	inode_size = 256
	inode_ratio = 16384

[fs_types]
	ext3 = {
		features = has_journal
	}
	ext4 = {
		features = has_journal,extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize,64bit
		inode_size = 256
	}
	ext4dev = {
		features = has_journal,extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize
		inode_size = 256
		options = test_fs=1
	}
	rhel6_ext4 = {
		features = has_journal,extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize
		inode_size = 256
		enable_periodic_fsck = 1
		default_mntopts = ""
	}
	small = {
		blocksize = 1024
		inode_size = 128
		inode_ratio = 4096
	}
	floppy = {
		blocksize = 1024
		inode_size = 128
		inode_ratio = 8192
	}
	big = {
		inode_ratio = 32768
	}
	huge = {
		inode_ratio = 65536
	}
	news = {
		inode_ratio = 4096
	}
	largefile = {
		inode_ratio = 1048576
		blocksize = -1
	}
	largefile4 = {
		inode_ratio = 4194304
		blocksize = -1
	}
	hurd = {
	     blocksize = 4096
	     inode_size = 128
	}

ループバックデバイスで遊ぶ

dd if=/dev/zero of=~/fs/loop0 bs=1M count=100
sudo losetup /dev/loop0 ~/fs/loop0

sudo mke2fs -b 4006 -c -j /dev/loop0
mke2fs 1.42.9 (28-Dec-2013)
Discarding device blocks: done                            
Filesystem label=
OS type: Linux
Block size=2048 (log=1)
Fragment size=2048 (log=1)
Stride=0 blocks, Stripe width=0 blocks
25600 inodes, 51200 blocks
2560 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=52428800
4 block groups
16384 blocks per group, 16384 fragments per group
6400 inodes per group
Superblock backups stored on blocks: 
	16384, 49152

Checking for bad blocks (read-only test): done                                                 
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

マウントする

sudo mount /dev/loop0 /mnt/loop0

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

ファイルシステム確認

grep -e loop0 /etc/mtab
/dev/loop0 /mnt/loop0 ext3 rw,seclabel,relatime,data=ordered 0 0

ext3で生えてる

ext3: ext2 + ジャーナリング

  • ジャーナリング: MySQLのbinログ、PostgresSQLのWALログみたいなやつ
  • クラッシュ後のファイルシステムチェックでジャーナル完了・未破棄のもののみチェックすればよい

ext4ファイルシステムの作成

dd if=/dev/zero of=~/fs/loop1 bs=1M count=100
sudo losetup /dev/loop1 ~fs/loop1

sudo mkfs.ext4 /dev/loop1
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

下記でも同じ

# mke2fs -t ext4 /dev/loop1
# mkfs -t ext4 /dev/loop1

既存のext2をext3にするにはtune2fs -jでジャーナリング追加する

  • ext2で作りなおす
sudo umount /mnt/loop0

sudo mke2fs /dev/loop0
sudo mount /dev/loop0 /mnt/loop0

grep -e loop0 /etc/mtab
/dev/loop0 /mnt/loop0 ext2 rw,seclabel,relatime 0 0

-j: ジャーナリング追加

sudo tune2fs -j /dev/loop0
tune2fs 1.42.9 (28-Dec-2013)
Creating journal inode: done

mount中のext2ファイルシステムにジャーナリングを追加してもmtabのext2はext3にはならない

grep -e loop0 /etc/mtab
/dev/loop0 /mnt/loop0 ext2 rw,seclabel,relatime 0 0

umount, mountするとext3になる

sudo umount /dev/loop0
sudo mount /dev/loop0 /mnt/loop0
grep -e loop0 /etc/mtab
- /dev/loop0 /mnt/loop0 ext2 rw,seclabel,relatime 0 0
+ /dev/loop0 /mnt/loop0 ext3 rw,seclabel,relatime,data=ordered 0 0
  • 既存のext3をext4に移行するにはtune2fs -Oでfeatureを追加する
sudo tune2fs -O extent,uninit_bg,dir_index /dev/loop0
tune2fs 1.42.9 (28-Dec-2013)

これも同様、umount, mountするとmtabがext4になる

sudo umount /dev/loop0
sudo mount /dev/loop0 /mnt/loop0
grep -e loop0 /etc/mtab
- /dev/loop0 /mnt/loop0 ext3 rw,seclabel,relatime,data=ordered 0 0
+ /dev/loop0 /mnt/loop0 ext4 rw,seclabel,relatime,data=ordered 0 0

-m: rootによる作業用の予約領域のパーセンテージ指定

2560 blocks (5.00%) reserved for the super user

これ。デフォルト5%

sudo tune2fs -m 1 /dev/loop0
tune2fs 1.42.9 (28-Dec-2013)
Setting reserved blocks percentage to 1% (1024 blocks)

増やすもできる

sudo tune2fs -m 10 /dev/loop0
tune2fs 1.42.9 (28-Dec-2013)
Setting reserved blocks percentage to 10% (10240 blocks)

4.2.2 XFSファイルシステムの作成

モジュールを読み込んでおく

sudo modprobe xfs
grep xfs /proc/filesystems
nodev	selinuxfs

mkfs.xfsコマンドで作成

sudo mkfs.xfs /dev/loop0

親切

mkfs.xfs: /dev/loop0 appears to contain an existing filesystem (ext4).

既存のファイルシステムを上書きするときは-f (force)オプションをつける

sudo mkfs.xfs -f /dev/loop0
meta-data=/dev/loop0             isize=512    agcount=4, agsize=6400 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=25600, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=855, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

XFSの特徴

https://wiki.archlinux.jp/index.php/XFS

IRIX(シリコングラフィックス社のUNIX)用のファイルシステム

  • ジャーナリング
  • エクステント方式

    • 後述
  • アロケーショングループ

    • 並列化I/Oに強い

4.2.3 Btrfsファイルシステムの作成

sudo mkfs.btrfs -f -d single /dev/loop0 /dev/loop1
btrfs-progs v4.9.1
See http://btrfs.wiki.kernel.org for more information.

ERROR: superblock magic doesn't match
ERROR: superblock magic doesn't match
Performing full device TRIM /dev/loop0 (100.00MiB) ...
Performing full device TRIM /dev/loop1 (100.00MiB) ...
Label:              (null)
UUID:               499044ac-5356-4465-a1a3-4c6d7c090ba2
Node size:          16384
Sector size:        4096
Filesystem size:    200.00MiB
Block group profiles:
  Data:             single            8.00MiB
  Metadata:         RAID1            32.00MiB
  System:           RAID1             8.00MiB
SSD detected:       no
Incompat features:  extref, skinny-metadata
Number of devices:  2
Devices:
   ID        SIZE  PATH
    1   100.00MiB  /dev/loop0
    2   100.00MiB  /dev/loop1
  • 複数の物理ボリュームをまとめた1つの仮想的なボリュームを作った(ストレージプール)

Btrfsの特徴

https://btrfs.wiki.kernel.org/index.php/Main_Page

  • Extent based file storage

    • extent: 「範囲」の意。blockに変わるデータ管理単位
    • 連続した任意の数のblock
    • ブロックサイズよりも大きなファイルを扱う際、多段間接参照がなくなりパフォーマンス問題を解消する
    • ext3に対するext4の1機能だったりする
  • 2^64=16EiB
  • CoW
  • ディスク容量の効率的な利用
  • iノード動的割り当て
  • チェックサム
  • 効率的な増分バックアップ
  • オンラインデフラグ

4.2.4 mkfsコマンドによるファイルステム作成

  • mkfs.${ファイルシステムの種類} コマンドが使える
  • mkfs -t ${ファイルシステムの種類}もおなじ

4.2.5 CD/DVDの作成

mkisofs
-bash: mkisofs: command not found

ないので入れる

yum provides mkisofs
Failed to set locale, defaulting to C
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * centos-sclo-rh: ftp.riken.jp
 * centos-sclo-sclo: ftp.riken.jp
 * epel: d2lzkl7pfhq30w.cloudfront.net
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
genisoimage-1.1.11-25.el7.x86_64 : Creates an image of an ISO9660 file-system
Repo        : base
Matched from:
Provides    : mkisofs = 9:2.01-12
sudo yum install -y genisoimage

CDイメージを作ってマウントしてみる

mkdir ~/cd
touch ~/cd/hogehoge
chmod +x ~/cd/hogehoge

mkisofs -o ~/image.iso ~/cd
Total translation table size: 0
Total rockridge attributes bytes: 0
Total directory bytes: 0
Path table size(bytes): 10
Max brk space used 0
174 extents written (0 MB)

マウント

sudo mkdir /mnt/cdrom
sudo mount -o loop ~/image.iso /mnt/cdrom

書き込めないので注意

mount: /dev/loop2 is write-protected, mounting read-only
ls -l /mnt/cdrom
total 0
-r-xr-xr-x. 1 root root 0 Dec 12 14:19 hogehoge

Windowsでも使えるようにする場合、Jolietフォーマットを使用する (-J)

mkisofs -J -o ~/image.iso ~/cd
Warning: creating filesystem with Joliet extensions but without Rock Ridge
         extensions. It is highly recommended to add Rock Ridge.
Total translation table size: 0
Total rockridge attributes bytes: 0
Total directory bytes: 0
Path table size(bytes): 10
Max brk space used 0
180 extents written (0 MB)

Rock Ridgeも有効にしろって言われる (-R)

mkisofs -J -R -o ~/image.iso ~/cd
Total translation table size: 0
Total rockridge attributes bytes: 249
Total directory bytes: 0
Path table size(bytes): 10
Max brk space used 0
181 extents written (0 MB)

manから抜粋:

For greater portability, consider using both Joliet and Rock Ridge extensions.

12/24追記: Rock Ridge/Joliet拡張非対応のシステムのために-Tもつける

  • TRANS.TBLファイル作成

Joliet/Rock Ridge とは

  • ISO9660

    • ファイル名は8.3形式 — 8文字+.+3文字拡張子

この厳しい制限を解消するためのもの

  • Joliet

    • MS開発
    • ISO9660上位互換
    • ファイル名最大64
  • Rock Ridge

    • 主にUnix系OSで使われる
    • ISO9660拡張
    • ロングファイルネーム対応

4.2.6 暗号化ファイルシステムの作成

cryptsetup
-bash: cryptsetup: command not found

ないので入れる

yum provides cryptsetup
Failed to set locale, defaulting to C
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: d2lzkl7pfhq30w.cloudfront.net
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
cryptsetup-2.0.3-6.el7.x86_64 : A utility for setting up encrypted disks
Repo        : base
sudo yum install -y cryptsetup

/dev/loop3を作って遊ぶ

dd if=/dev/zero of=~/fs/loop3 bs=1M count=100
sudo losetup /dev/loop3 ~/fs/loop3

暗号化ファイルシステムを作る

  • 執筆当時アサルトリリィにハマっていたのでそれにちなんだパスフレーズにする
sudo cryptsetup create secret /dev/loop3

Enter passphrase for /home/wand/fs/loop3: assault

/dev/mapper/以下に指定の名前のsymlinkができる

ls -l /dev/mapper/
total 0
crw-------. 1 root root 10, 236 Dec 12 14:46 control
lrwxrwxrwx. 1 root root       7 Dec 12 14:46 secret -> ../dm-0

この上に任意のファイルシステムを作成

sudo mkfs.ext4 /dev/mapper/secret
mke2fs 1.42.9 (28-Dec-2013)
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

あとはマウントして普通のファイルシステムのように使える

sudo mkdir /mnt/secret/
sudo mount /dev/mapper/secret /mnt/secret

sudo touch /mnt/secret/foo
ls -l /mnt/secret/
total 13
-rw-r--r--. 1 root root     0 Dec 12 15:02 foo
drwx------. 2 root root 12288 Dec 12 14:56 lost+found

暗号化前のデバイスloop3にぶら下がる形でタイプcryptのデバイスsecretができる

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  /
loop2      7:2    0  348K  0 loop  /mnt/cdrom
loop3      7:3    0  100M  0 loop  
`-secret 253:0    0  100M  0 crypt /mnt/secret

使い終わったらumountしてmapperを消す

sudo umount /mnt/secret
sudo cryptsetup remove secret

また使いたくなったら再度cryptsetup create

  • パスフレーズを間違えてみる
sudo cryptsetup create secret-revisit /dev/loop3 
Enter passphrase for /home/wand/fs/loop3: lily

マウントで失敗する

sudo mount /dev/mapper/secret-revisit /mnt/secret
mount: /dev/mapper/secret-revisit is write-protected, mounting read-only
mount: wrong fs type, bad option, bad superblock on /dev/mapper/secret-revisit,
       missing codepage or helper program, or other error

       In some cases useful info is found in syslog - try
       dmesg | tail or so.

removeして正しいパスフレーズで作り直してみる

sudo cryptsetup remove secret-revisit
sudo cryptsetup create secret-revisit /dev/loop3 

Enter passphrase for /home/wand/fs/loop3: assault

sudo mount /dev/mapper/secret-revisit /mnt/secret
ls -l /mnt/secret/
total 13
-rw-r--r--. 1 root root     0 Dec 12 15:02 foo
drwx------. 2 root root 12288 Dec 12 14:56 lost+found

ちゃんと復号できた