xfs で inode(iノード)が足りなくなったときの対応

RedHat Enterprise Linux 7 になってから、デフォルトのファイルシステムがxfsになりました。

# 1. xfs ってinode を気にしなくていいんでしょ？
昔の ext4 とかのように inode を気にしなくても足りなくなることがなくなり、放置でOKと思っていました。「まさか足りなくなる」なんて夢にも思っておりませんでした。
また、xfs は inode自動拡張だとかいう記事も読んだ気がしたもんだからすっかり安心しきっておりました。

しかし、やってしまいましたよ。inode 枯渇...

# 2. xfsでもinode枯渇します

```
# df -i
Filesystem        Inodes     IUsed    IFree IUse% Mounted on
/dev/xvda1      52427584  18726941 33700643   36% /
devtmpfs         8219371       360  8219011    1% /dev
tmpfs            8191502         1  8191501    1% /dev/shm
tmpfs            8191502       376  8191126    1% /run
tmpfs            8191502        16  8191486    1% /sys/fs/cgroup
tmpfs            8191502         1  8191501    1% /run/user/1000
/dev/xvdf1     629145472 629145472        0  100% /home/data2
```

一番下の行を見てください。inodeが全く0です。

こうなると、ファイルは当然書き込みできません。以下のようになります。

```
[root@ip-172-x-x-xxx data2]# touch test.txt
touch: cannot touch ‘test.txt’: No space left on device
```

「またまた～。ご冗談を」と思っていたらホントでした。

```
[root@ip-172-x-x-xxx data2]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      100G   83G   18G  83% /
devtmpfs         32G     0   32G   0% /dev
tmpfs            32G     0   32G   0% /dev/shm
tmpfs            32G   17M   32G   1% /run
tmpfs            32G     0   32G   0% /sys/fs/cgroup
tmpfs           6.3G     0  6.3G   0% /run/user/1000
/dev/xvdf1      5.9T  2.7T  3.2T  46% /home/data2
```
Disk はこんなに余っています。

# 3. 調査
あまりググってもそれらしい情報がなかったのですが、
Inodes on XFS – timor's site
https://gagor.pl/2013/11/inodes-on-xfs/
を見つけました。

これによると、xfsのinodeはフォーマット時に容量の何パーセントを使うか決めるんだそうです。現在、それが何パーセントかは、xfs_info コマンドで調べることが出来ます。xfsのデフォルトは、25%をinodeに割りあてるのがデフォルトだが、ディストビューションにより、5%もしくは、10%に減らされていることが多いんだそうです。

私の使っているのは、CentOS-7です。どれどれ見てみましょう。

```
[root@ip-172-x-x-xxx data2]#  xfs_info /dev/xvdf1
meta-data=/dev/xvdf1             isize=512    agcount=6, agsize=268435455 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=1572863739, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=521728, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
```

該当項目は、上から5行目のimaxpct です。
`data     =                       bsize=4096   blocks=1572863739, imaxpct=5`
5%ですね。。。。

# 4. xfs の inode を拡張する
増やし方も上記のサイトに書いてありました。
xfs_growfs -m XX にするんだそうです。ちょっと多めで15%に割りあてましょう。

```lang:shell
# xfs_growfs -m 15 /dev/xvdf1
```
さてどうでしょう。

```
[root@ip-172-x-x-xxx data2]#  xfs_info /dev/xvdf1
meta-data=/dev/xvdf1             isize=512    agcount=6, agsize=268435455 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=1572863739, imaxpct=15
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=521728, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
```

`data     =                       bsize=4096   blocks=1572863739, imaxpct=15`
15%になりました。

inodeはどうでしょうか。

```
[root@ip-172-x-x-xxx data2]# df -i
Filesystem         Inodes     IUsed      IFree IUse% Mounted on
/dev/xvda1       52427584  18726941   33700643   36% /
devtmpfs          8219371       360    8219011    1% /dev
tmpfs             8191502         1    8191501    1% /dev/shm
tmpfs             8191502       385    8191117    1% /run
tmpfs             8191502        16    8191486    1% /sys/fs/cgroup
tmpfs             8191502         1    8191501    1% /run/user/1000
/dev/xvdf1     1887436480 629145857 1258290623   34% /home/data2
```
ガッツリ増えましたね。

ファイルも作成出来ました。

フォーマット時には、
` mkfs.xfs -imaxpct=XX `
でパーセントを決めるそうです。

# 5. まとめ

* xfsでもinodeは枯渇する！
* `xfs_growfs -m <割り当てパーセント> <デバイス> `でinodeの領域を増やせ！