unixでファイルをつくってからrmするとどうなるかテスト。OSはFreeBSDでファイルシステムはUFS2。
前準備で空っぽなファイルbokeをつくる。
catコマンドをバックグラウンドで実行してオープンした状態を維持する。
guriandgura# df / Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/ad4s2a 507630 352502 114518 75% / guriandgura# mkdir /hoge guriandgura# cd /hoge guriandgura# cat >boke& [1] 56133 guriandgura# ls -al total 4 drwxr-xr-x 2 root wheel 512 2月 13 00:17 . drwxr-xr-x 32 root wheel 1024 2月 13 00:17 .. -rw-r--r-- 1 root wheel 0 2月 13 00:17 boke guriandgura# ls -i /hoge/boke 49952 /hoge/boke
inode番号は49952で、まだ書き込んでいないのでファイルサイズは0。
fsdbでinodeをのぞいてみる。
-rオプションをつけてread onlyでのぞき。
guriandgura# fsdb -r /dev/ad4s2a ** /dev/ad4s2a (NO WRITE) Examining file system `/dev/ad4s2a' Last Mounted on / current inode: directory I=2 MODE=40755 SIZE=1024 BTIME=Apr 25 04:11:35 2007 [0 nsec] MTIME=Feb 13 00:17:04 2011 [0 nsec] CTIME=Feb 13 00:17:04 2011 [0 nsec] ATIME=Jul 20 23:54:57 2010 [0 nsec] OWNER=root GRP=wheel LINKCNT=32 FLAGS=0 BLKCNT=4 GEN=694ba5aa fsdb (inum: 2)> inode 49952 current inode: regular file I=49952 MODE=100644 SIZE=0 BTIME=Feb 13 00:17:03 2011 [0 nsec] MTIME=Feb 13 00:17:03 2011 [0 nsec] CTIME=Feb 13 00:17:03 2011 [0 nsec] ATIME=Feb 13 00:17:03 2011 [0 nsec] OWNER=root GRP=wheel LINKCNT=1 FLAGS=0 BLKCNT=0 GEN=18996b66 fsdb (inum: 49952)> quit
LINKCNT=1となっていてディレクトリからちゃんと参照されているのがわかる。
ファイルをrmしたらinodeはどうなるか?
rmというのはディレクトリからの参照を消すこと。
guriandgura# ls -li boke 49952 -rw-r--r-- 1 root wheel 0 2月 13 00:17 boke guriandgura# rm boke guriandgura# ls -li boke ls: boke: そのようなファイルまたはディレクトリはありません guriandgura# sync guriandgura# fsdb -r /dev/ad4s2a ** /dev/ad4s2a (NO WRITE) Examining file system `/dev/ad4s2a' Last Mounted on / current inode: directory I=2 MODE=40755 SIZE=1024 BTIME=Apr 25 04:11:35 2007 [0 nsec] MTIME=Feb 13 00:17:04 2011 [0 nsec] CTIME=Feb 13 00:17:04 2011 [0 nsec] ATIME=Jul 20 23:54:57 2010 [0 nsec] OWNER=root GRP=wheel LINKCNT=32 FLAGS=0 BLKCNT=4 GEN=694ba5aa fsdb (inum: 2)> inode 49952 current inode: regular file I=49952 MODE=100644 SIZE=0 BTIME=Feb 13 00:17:03 2011 [0 nsec] MTIME=Feb 13 00:17:03 2011 [0 nsec] CTIME=Feb 13 00:19:28 2011 [0 nsec] ATIME=Feb 13 00:17:03 2011 [0 nsec] OWNER=root GRP=wheel LINKCNT=0 FLAGS=0 BLKCNT=0 GEN=18996b66 fsdb (inum: 49952)> quit
リンク数が0になったのがわかる。つまりファイルシステム上ではどのディレクトリにも名前がないということ。
ファイルにデータをかきこんだらどうなるか?
guriandgura# fg cat > boke hoge hoge ^Z 中断 guriandgura# sync guriandgura# fsdb -r /dev/ad4s2a ** /dev/ad4s2a (NO WRITE) Examining file system `/dev/ad4s2a' Last Mounted on / current inode: directory I=2 MODE=40755 SIZE=1024 BTIME=Apr 25 04:11:35 2007 [0 nsec] MTIME=Feb 13 00:17:04 2011 [0 nsec] CTIME=Feb 13 00:17:04 2011 [0 nsec] ATIME=Jul 20 23:54:57 2010 [0 nsec] OWNER=root GRP=wheel LINKCNT=32 FLAGS=0 BLKCNT=4 GEN=694ba5aa fsdb (inum: 2)> inode 49952 current inode: regular file I=49952 MODE=100644 SIZE=10 BTIME=Feb 13 00:17:03 2011 [0 nsec] MTIME=Feb 13 00:20:36 2011 [0 nsec] CTIME=Feb 13 00:20:36 2011 [0 nsec] ATIME=Feb 13 00:17:03 2011 [0 nsec] OWNER=root GRP=wheel LINKCNT=0 FLAGS=0 BLKCNT=4 GEN=18996b66 fsdb (inum: 49952)> quit
SIZE=10になってファイルが大きくなっているのがわかる。またBLKCNT=4になって実際にデータブロックが割り当てられているのもわかる。
closeしたらinodeはどうなる?
catコマンドをkillしてcloseする。
guriandgura# fg cat > boke ^C guriandgura# sync guriandgura# fsdb -r /dev/ad4s2a ** /dev/ad4s2a (NO WRITE) Examining file system `/dev/ad4s2a' Last Mounted on / current inode: directory I=2 MODE=40755 SIZE=1024 BTIME=Apr 25 04:11:35 2007 [0 nsec] MTIME=Feb 13 00:17:04 2011 [0 nsec] CTIME=Feb 13 00:17:04 2011 [0 nsec] ATIME=Jul 20 23:54:57 2010 [0 nsec] OWNER=root GRP=wheel LINKCNT=32 FLAGS=0 BLKCNT=4 GEN=694ba5aa fsdb (inum: 2)> inode 49952 current inode 49952: unallocated inode fsdb (inum: 49952)> quit guriandgura#
inodeビットマップがクリアされてしまったのだろう、unallocatedと表示されてしまいディスク上のinodeがどうクリアされたかは見えず。
まとめ
openしたままrmするとリンク数は0になるが、inodeが再利用されないようにinodeビットマップは使用中のままである。
もしopenしたままrmしたあとにシステムクラッシュすると、fsckはこのinodeは使われていないとしてビットマップを修正するだろう。