Linux에서 파일을 생성하려면 두 가지 조건을 충족해야 한다. 첫째, 디스크에 사용 가능한 블록 공간이 있어야 하고, 둘째, inode 번호가 남아 있어야 한다. 디스크 공간이 충분함에도 파일 생성이 실패한다면 inode 고갈을 의심해봐야 한다.
xfs 파일시스템
xfs 파일시스템에서는 mkfs.xfs에 -N 옵션이 없다. 대신 -i maxpct 파라미터로 inode 영역이 파티션에서 차지하는 비율을 조정할 수 있다. 기본값은 25%이다.
-i size는 inode 크기를, maxpct는 inode 영역의 비율을 지정한다.
위 예제에서 1GB 파티션의 inode 영역 비율을 25%에서 30%로 변경했다. inode 크기가 512바이트일 때, inode 수는 다음과 같이 계산된다:
사용량 확인 방법
디스크 공간과 inode 사용량은 각각 다른 명령어로 확인할 수 있다.$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 10G 4.7G 5.4G 47% /
devtmpfs 975M 0 975M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 11M 980M 2% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/sr0 4.2G 4.2G 0 100% /mnt
/dev/sda1 197M 179M 19M 91% /boot
tmpfs 199M 8.0K 199M 1% /run/user/42
tmpfs 199M 28K 199M 1% /run/user/1000
$ df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda2 5242880 168213 5074667 4% /
devtmpfs 249532 410 249122 1% /dev
tmpfs 253514 1 253513 1% /dev/shm
tmpfs 253514 956 252558 1% /run
tmpfs 253514 16 253498 1% /sys/fs/cgroup
/dev/sr0 0 0 0 - /mnt
/dev/sda1 38176 347 37829 1% /boot
tmpfs 253514 7 253507 1% /run/user/42
tmpfs 253514 18 253496 1% /run/user/1000
inode 고갈 해결 방법
inode가 고갈된 파티션에서 inode를 확보하는 방법은 여러 가지가 있다.- 사용하지 않는 파일이나 디렉토리를 삭제하여 inode 번호를 확보한다
- 일부 파일을 다른 파티션으로 백업한 후 원본을 삭제하고, 해당 파티션을 원래 위치에 마운트한다
- 심볼릭 링크를 활용하여 inode가 여유 있는 파티션으로 연결한다
- 새 파티션 /dev/sdb1을 생성하고 마운트
- /data/cache의 파일을 새 파티션으로 백업
- 원본 파일 삭제 후 inode 확보
- 새 파티션을 /data/cache에 마운트
파일시스템별 inode 설정
ext4/ext3/ext2 파일시스템 전통적인 ext"系列 파일시스템에서는 파일시스템 생성 시 inode 수가 고정된다. mkfs.ext4 명령어에서 -N 옵션으로 inode 개수를 지정할 수 있다.# mkfs.ext4 -N 1000000 /dev/sdb1
# mkfs.xfs -i size=512,maxpct=30 /dev/sdb1
xfs_growfs로 inode 영역 확장
이미 생성된 xfs 파티션에서 inode 영역 비율을 조정하려면 xfs_growfs 명령어를 사용하면 된다. 이 명령어는 파티션을 다시 포맷하지 않고 inode 영역을 확장할 수 있어 매우 유용하다.[root@server ~]# mount /dev/sdb1 /mnt/data
[root@server ~]# df -i /mnt/data
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdb1 524288 3 524285 1% /mnt/data
[root@server ~]# touch /mnt/data/test.txt
[root@server ~]# echo "sample content" >> /mnt/data/test.txt
[root@server ~]# cat /mnt/data/test.txt
sample content
[root@server ~]# xfs_growfs -m 30 /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=262144, 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
[root@server ~]# df -i /mnt/data
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdb1 629144 4 629140 1% /mnt/data
[root@server ~]# ls /mnt/data/
test.txt
[root@server ~]# cat /mnt/data/test.txt
sample content
- 기존 (25%): 1024MB × 1024 × 1024 × 25% ÷ 512 = 524,288개
- 변경 후 (30%): 1024MB × 1024 × 1024 × 30% ÷ 512 ≈ 629,145개