ファイルを消してもディスク使用量が減らない場合の対応方法

Linux/Unixで、ファイルを消したのにディスク使用量(ファイルシステム使用量)が
減らなく、OSをリブートしたら減った経験はないでしょうか?
なぜそうなるのか、対象方法はどうすればよいかをまとめました。

現象確認

以下の例を見てください。ファイルシステム容量が1GByte弱のファイルシステムに、
testfile.datという名前の100MByteのファイルがあります。
このファイルを消しましたが、削除前後で使用量に変化がないことがわかります。

# pwd
/mnt/sdb1
# df -k .
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/sdb1               988212    115412    822600  13% /mnt/sdb1
# find . -ls
     2    4 drwxr-xr-x   3 root     root         4096  1月 19 14:53 .
    12 97760 -rw-r--r--   1 root     root     100000000  1月 19 14:53 ./testfile.dat
    11   16 drwx------   2 root     root        16384  1月 19 13:55 ./lost+found
# rm -i ./testfile.dat
rm: remove 通常ファイル `./testfile.dat'? y
# 
# find . -ls
     2    4 drwxr-xr-x   3 root     root         4096  1月 19 14:54 .
    11   16 drwx------   2 root     root        16384  1月 19 13:55 ./lost+found
#
# df -k .
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/sdb1               988212    115412    822600  13% /mnt/sdb1
#

なんでこうなるのか?

Linux/Unixでは、ls/find等で一覧表示されなくてもプロセスがつかんでいる状況では
実際にはファイルシステムから削除されておらず、見えなくなっているだけなのです。
OSを再起動するとファイルシステム使用量が減るのは、表面上は見えないくプロセスが
つかんでいるファイルを再起動によるプロセスにより、開放してくれるからです。
このような現象はプログラムバグでファイルクローズのしわすれ等の場合に発生する
ことがあります。

対応方法

OSを再起動すればプロセスが終了するので当然開放してくれますが、本番環境等では
OS再起動できない場合も多々あります。
このようなとき以下ように lsof コマンドでどのプロセスがつかんでいるか確認し、
そのプロセスを終了(kill)させることで対応できます。

# df -k .
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/sdb1               988212    115412    822600  13% /mnt/sdb1
# find . -ls
     2    4 drwxr-xr-x   3 root     root         4096  1月 19 14:54 .
    11   16 drwx------   2 root     root        16384  1月 19 13:55 ./lost+found
# lsof | grep /mnt/sdb1
bash      1910      root  cwd       DIR       8,17      4096          2 /mnt/sdb1
fileopen. 1932      root    3r      REG       8,17 100000000         12 /mnt/sdb1/testfile.dat (deleted)
lsof      1938      root  cwd       DIR       8,17      4096          2 /mnt/sdb1
grep      1939      root  cwd       DIR       8,17      4096          2 /mnt/sdb1
lsof      1940      root  cwd       DIR       8,17      4096          2 /mnt/sdb1
# ps auxww | grep 1932  | grep -v grep
root      1932  0.0  0.2   6664  1520 pts/0    S+   14:54   0:00 /usr/bin/perl /root/fileopen.pl
# kill 1932
# find . -ls
     2    4 drwxr-xr-x   3 root     root         4096  1月 19 14:54 .
    11   16 drwx------   2 root     root        16384  1月 19 13:55 ./lost+found
# df -k .
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/sdb1               988212     17652    920360   2% /mnt/sdb1
#

確認環境

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

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