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文字拡張子
- ファイル名は8.3形式 — 8文字+
この厳しい制限を解消するためのもの
-
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
ちゃんと復号できた