iSCSIの実験中に気がついたこと。
iscsi-target を動かすと、指定した大きさファイルが即座に作成されます。Windowsのインストールを行うにはそこそこの空き容量が必要ですが、作成場所のファイルシステムの空きは30GB弱でした。
toriyu# df /var/smb Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/ad1s1e 50777034 17653268 29061604 38% /var/smb
そこで、iSCSIのドライブを25GBで指定してファイル iscsi-target を起動しました。
toriyu# ls -l total 48 -rw-r--r-- 1 root wheel 26843545600 Jan 11 14:26 iscsi-target0
念のために空き容量を確認するために df コマンドを再度実行してみました。
toriyu# df /var/smb Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/ad1s1e 50777034 17653316 29061556 38% /var/smb
えーと、えーと、48KBしか減ってません。
あり? 操作を間違えたのでしょうか? 桁を間違えてないか、単位を間違えてないか何度も何度も確認しました。でも間違っていませんでした。別の方法でも確認してみました。
toriyu# ls -s total 48 48 iscsi-target0 toriyu# du -ks /var/smb/iscsi 50 /var/smb/iscsi
ファイルシステムが壊れてるのでしょうか? 一度 umount して fsck してみましたが、特にエラーは表示されません。はて? なんじゃこりゃ? と困っていたのですが、調べてみるとこういうのは穴あきファイル(sparse file)というのだそうです。
穴あきファイルとは、内部に NULL データを含むファイルで、なおかつディスク上には一部データの実体が存在しないファイル、である。
だそうで、ファイルサイズを超えてシークしたあと書き込みすれば作成されるとか。そんなとこにシークしたらエラーにになったり、書き込み出来たとしたら間のデータは不定になるような気がしますが、「何もない」ことがちゃんと管理されてるのですな。
てことで実験。
toriyu# dd if=/dev/zero of=Hugefile seek=1 bs=1000G count=0 0+0 records in 0+0 records out 0 bytes transferred in 0.000019 secs (0 bytes/sec) toriyu# ls -l total 64 -rw-r--r-- 1 root wheel 1073741824000 Jan 11 14:55 Hugefile toriyu# ls -s total 64 64 Hugefile
ほほぉ、こんなのがあったのですねー。知っててもあまり得することは無いかもしれませんが、知らないとおもっきりハマるわけで(←経験者)、良い勉強になりました。