xfsのファイルシステムでは、利用可能なinode数が可変になっています。これ、知りませんでした。ファイルシステムのクラスターサイズ(アロケーションユニットサイズ)内で、inode領域として確保されるサイズ・領域を変更することが可能となっており、これにより、利用可能なinode数を変更できます。
その方法を、AWSのEC2にて、RHEL7のOSで試しています。実行ユーザは全てrootとなります。
新規EBS Volumeのアタッチ
新しくEBSのVolumeを作成して、対象のEC2インスタンスにアタッチします。詳しくは以下の公式マニュアルにて。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-attaching-volume.html
アタッチしたVolumeのマウント
lsbk コマンドにて、アタッチされたデバイスを確認します。今回は xvdf という名前のデバイスがそれになります。
# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202:0 0 10G 0 disk tqxvda1 202:1 0 1M 0 part mqxvda2 202:2 0 10G 0 part / xvdf 202:80 0 10G 0 disk
file コマンドにて、フォーマットされていないことを確認。
# file -s /dev/xvdf /dev/xvdf: data
mkfs コマンドにて、xfsファイルシステムにフォーマット。この時出力される imaxpct という値が、inode領域で利用できる割合です。25%となっていますね。
# mkfs -t xfs /dev/xvdf
meta-data=/dev/xvdf isize=512 agcount=4, agsize=655360 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=2621440, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
尚、このファイルシステムのフォーマット時に、以下のように-iオプションを付与して実行してあげると、inode領域をデフォルトから変更してフォーマットできます。
# mkfs -t xfs -i maxpct=30 /dev/xvdf
mkfsのMANのページはこちら。
https://www.systutorials.com/docs/linux/man/8-mkfs.xfs/
今回は、フォーマット後に変更する方法について下記に記載しています。
もう1回 file コマンドを打って、フォーマットされていることを確認して、
# file -s /dev/xvdf /dev/xvdf: SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs)
マウントします。
# mount /dev/xvdf /data/tmp1
で、fstabにも設定を入れたいから、ディスクのUUIDを確認します。今回は c4933054-90d1-408e-ac56-a4ac37180000 という値ですね。
# ls -al /dev/disk/by-uuid/ total 0 drwxr-xr-x. 2 root root 80 Sep 4 01:41 . drwxr-xr-x. 4 root root 80 Sep 4 01:22 .. lrwxrwxrwx. 1 root root 11 Sep 4 01:22 50a9826b-3a50-44d0-ad12-28f2056e9927 -> ../../xvda2 lrwxrwxrwx. 1 root root 10 Sep 4 01:41 c4933054-90d1-408e-ac56-a4ac37180000 -> ../../xvdf
fstabに設定情報を入れてあげます。こんな感じ。
UUID=50a9826b-3a50-44d0-ad12-28f2056e9927 / xfs defaults 0 0 UUID=c4933054-90d1-408e-ac56-a4ac37180000 /data/tmp1 xfs defaults 0 0
OSを再起動してみて、ちゃんとマウントされたままであることを確認します。
inode領域の拡張
続いてinode領域を拡張します。まずは現在のinode数の確認。
# df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/xvda2 6290176 27866 6262310 1% / devtmpfs 121187 284 120903 1% /dev tmpfs 126737 1 126736 1% /dev/shm tmpfs 126737 375 126362 1% /run tmpfs 126737 16 126721 1% /sys/fs/cgroup /dev/xvdf 5242880 3 5242877 1% /data/tmp1 tmpfs 126737 1 126736 1% /run/user/1000
df コマンドの他、 xfs_info コマンドでも確認できます。imaxpctの値がinode領域となります。
# xfs_info /data/tmp1/
meta-data=/dev/xvdf isize=512 agcount=4, agsize=655360 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=2621440, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
xfs_growfs コマンドに-mオプションを利用することで、inode領域を変更することができます。
# xfs_growfs -m 30 /data/tmp1/
meta-data=/dev/xvdf isize=512 agcount=4, agsize=655360 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=2621440, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
inode max percent changed from 25 to 30
実行後の確認です。inode数が増えていますね。
# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/xvda2 6290176 27866 6262310 1% /
devtmpfs 121187 284 120903 1% /dev
tmpfs 126737 1 126736 1% /dev/shm
tmpfs 126737 392 126345 1% /run
tmpfs 126737 16 126721 1% /sys/fs/cgroup
/dev/xvdf 6291456 3 6291453 1% /data/tmp1
tmpfs 126737 1 126736 1% /run/user/1000
tmpfs 126737 1 126736 1% /run/user/0
#
# xfs_info /data/tmp1
meta-data=/dev/xvdf isize=512 agcount=4, agsize=655360 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=2621440, imaxpct=30
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0