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は使われていないとしてビットマップを修正するだろう。