容量をとらない巨大なファイル

Linux/Unixでは、lsコマンドで表示されるファイルサイズが実際にはディスク上にとられないことがあります。

ファイルシステムサイズ以上のファイルサイズ?

以下の例を見てみましょう。

# df -h .
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/sdb1             966M   18M  899M   2% /mnt/sdb1
# ls -al
合計 76
drwxr-xr-x 2 root root       4096  1月 14 15:38 .
drwxr-xr-x 4 root root       4096  1月 14 15:38 ..
-rw-r--r-- 1 root root 1000000001  1月 14 15:38 test1.dat
-rw-r--r-- 1 root root 1000000001  1月 14 15:38 test2.dat
-rw-r--r-- 1 root root 1000000001  1月 14 15:38 test3.dat
-rw-r--r-- 1 root root 1000000001  1月 14 15:38 test4.dat
#

このようにファイルシステムのサイズが966Mと1Gに満たないのに、test~.dat のファイルが1G × 4個もできています。

どうやって作ったか?

test~.dat をどうやって作ったかですが、以下のプログラムにて作成しました。

#!/usr/bin/perl
 
open(FD, "> " . $ARGV[0]) || die "open error";
seek FD,1000000000,0;
print FD "T";
close(FD);

このプログラムでは、1GByte分 seekして1バイトを書き込んでいます。このように、
seekしてとびとびのファイルを作成すると実容量を取らずに大きいファイルが作成
されてしまいます。

ファイルを消しても容量に変化なし

さて、ここで巨大なファイルを削除してファイルシステム容量を見てみましょう。

# df -h .
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/sdb1             966M   18M  899M   2% /mnt/sdb1
# ls -l
合計 64
-rw-r--r-- 1 root root 1000000001  1月 14 15:38 test1.dat
-rw-r--r-- 1 root root 1000000001  1月 14 15:38 test2.dat
-rw-r--r-- 1 root root 1000000001  1月 14 15:38 test3.dat
-rw-r--r-- 1 root root 1000000001  1月 14 15:38 test4.dat
# rm test?.dat
rm: remove 通常ファイル `test1.dat'? y
rm: remove 通常ファイル `test2.dat'? y
rm: remove 通常ファイル `test3.dat'? y
rm: remove 通常ファイル `test4.dat'? y
# df -h .
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/sdb1             966M   18M  899M   2% /mnt/sdb1
#

巨大なファイル(test~.dat)を消してもファイルシステム容量に変化はありません。

まとめ

この例のように実容量を取らない巨大なファイルがある場合、もし、消したとしても
ファイルシステムのサイズが減りません。lsコマンド等で表示されるサイズは実は
ファイルシステム容量に影響がない場合もあります。
ファイルシステム容量が100%に近くなって本番環境が停止しそうな状況のとき忘れがちです。
頭のどこかにおいておきましょう。

確認環境

  • OS: CentOS 5.2
  • kernel: 2.6.18-92.el5xen
  • ファイルシステム: ext3

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-01-14 (水) 17:14:55 (3471d)