- http://en.wikipedia.org/wiki/Sparse_file
- http://x68000.q-e-d.net/~68user/unix/pickup?%B7%EA%A4%A2%A4%AD%A5%D5%A5%A1%A5%A4%A5%EB
経験的に、こういうファイルが存在することは知っていたけど、file systemがサポートする一種のファイル構造だということを初めて知った。
Sparse File
a sparse file is a type of computer file that attempts to use file system space more efficiently when blocks allocated to the file are mostly empty. This
ファイルシステムがサポートする場合、データのない(空の)連続している領域にディスクを割り当てないことが可能。仮想化のOSイメージ形式によっては、このSparse Fileを利用して、実際にはディスクの実領域を使用しないまま、ゲストOSに大きな容量を割り当てたりできる。もちろんゲストOSが実際にファイルを使用していけば、ディスクの実領域は増える。しかもこのときになかなかのオーバヘッドがあるようなので、パフォーマンスを重視するなら、Sparse Fileの扱いには注意が必要。
Sparse Fileは見た目の容量のあるファイルだけど、実際にはディスクに割り当てられていないので、ls -l と ls -s,du -s の表示が異なる。
スパースファイルを作る
dd でseek を指定して書き込みするブロックをskipする。
$ dd if=/dev/zero of=./hoge.dat seek=1000 bs=1M count=1
qemu が入ってて、qemu-img (kvm-img) が入ってるならそれでも可能。rawイメージをスパース化して作成するので。
$ qemu-img create hoge.img 1G $ qemu-img info hoge.img image: hoge.dat file format: raw virtual size: 1.0G (1074790400 bytes) disk size: 0
size 調べてみる
ls -l のsize 部分では1G, ls -s, du -s では0byte。
$ ls -lhs hoge.img 0 -rw-r--r-- 1 hoge hoge 1.0G 2011-02-13 01:40 hoge.img $ du -s hoge.img 0 hoge.img
スパースファイルをコピーするとき
"--sparse=WHEN" で指定できる。man cp
auto
デフォルトの動作:入力ファイルがスパースのとき、出力ファイルもスパースにする。always
常に出力ファイルをスパースにする。このオプションは入力ファイルがスパースなファイルをサポートしないファイルシステム上にあるが、出力ファイルはスパースなファイルをサポートするファイルシステム上に置かれる場合に有用である。never
出力ファイルをスパースにしない。このオプションの有意義な利用法を見付けたら筆者に教えてほしい。
とある。man cpにあるように--sparse=never を明示的に指定するcaseはあまりないと思うけど、仮想化用ゲストOSのイメージで、動的に容量拡張時のオーバヘッドが嫌だ、という事情で明示的にスパース化しないファイルを作りたいときとかに。