Linux에서 디스크에 여유 공간이 있지만 파일 생성 시 공간 부족 오류가 발생하는 경우

Linux에서 파일을 생성하려면 두 가지 조건을 충족해야 한다. 첫째, 디스크에 사용 가능한 블록 공간이 있어야 하고, 둘째, inode 번호가 남아 있어야 한다. 디스크 공간이 충분함에도 파일 생성이 실패한다면 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가 여유 있는 파티션으로 연결한다
예를 들어, /data/cache 디렉토리에서 과도하게 많은 inode가 사용되고 있다면 다음과 같은 과정을 고려할 수 있다:
  1. 새 파티션 /dev/sdb1을 생성하고 마운트
  2. /data/cache의 파일을 새 파티션으로 백업
  3. 원본 파일 삭제 후 inode 확보
  4. 새 파티션을 /data/cache에 마운트

파일시스템별 inode 설정

ext4/ext3/ext2 파일시스템 전통적인 ext"系列 파일시스템에서는 파일시스템 생성 시 inode 수가 고정된다. mkfs.ext4 명령어에서 -N 옵션으로 inode 개수를 지정할 수 있다.
# mkfs.ext4 -N 1000000 /dev/sdb1
xfs 파일시스템 xfs 파일시스템에서는 mkfs.xfs에 -N 옵션이 없다. 대신 -i maxpct 파라미터로 inode 영역이 파티션에서 차지하는 비율을 조정할 수 있다. 기본값은 25%이다.
# mkfs.xfs -i size=512,maxpct=30 /dev/sdb1
-i size는 inode 크기를, maxpct는 inode 영역의 비율을 지정한다.

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
위 예제에서 1GB 파티션의 inode 영역 비율을 25%에서 30%로 변경했다. inode 크기가 512바이트일 때, inode 수는 다음과 같이 계산된다:
  • 기존 (25%): 1024MB × 1024 × 1024 × 25% ÷ 512 = 524,288개
  • 변경 후 (30%): 1024MB × 1024 × 1024 × 30% ÷ 512 ≈ 629,145개

주의사항

inode 영역 비율을 증가시키면 데이터 저장能用하는 공간이 줄어든다. 반드시 필요한 경우에만 조정하고,事前에 충분한 여유 공간이 있는지 확인해야 한다. 계산 오류로 데이터 저장 공간이 부족해질 수 있으므로 신중하게 결정해야 한다.

7월 5일 02:29에 게시됨