概要
あるシステムから別のシステムにディレクトリをコピーするときに、あらかじめ、 du -sh ディレクトリ
を実行し、十分な領域があることを確認してから、コピーをした。
コピーが終わった後、コピー先で du -sh コピーしてきたディレクトリ
をすると、元のサイズより、大きくなった。
原因
ZFS の圧縮機能によるものが大きいような気がしているが、そもそもduコマンドの仕様によるところもあると考えられる。。
ZFS のディスク領域の計上 - Oracle Solaris の管理: ZFS ファイルシステム
そこに以下のような記述があった。
UFS ファイルシステムでは、du コマンドが、ファイル内のデータブロックのサイズを報告します。ZFS ファイルシステムでは、du コマンドが、ディスクに格納されているときのファイルの実際のサイズを報告します。このサイズにはメタデータと圧縮データも含まれます。実際、この報告は「このファイルを削除した場合、どれだけの容量を得られるか」という質問に回答するときに役立ちます。したがって、圧縮がオフになっている場合でも、ZFS と UFS では異なる結果が表示されます。
その後以下のページを教えていただいた
教訓
どこか別のマシンにデータをコピーするときには、管理者には、どのコマンドでサイズを図ったかを伝えておいたほうが良い。
バイオインフォマティクスの場合、圧縮がきくかもしれないファイルを扱うことが多いので、特に注意が必要だろう。
参考
7バイトのファイルを作ったが、 du -sh test
をすると、 1.0K
となっている。
この場合は増えているが、減るケースもあるので、その例を作ることができたら、
$ find ./test -type f -printf "%s\n" |awk '{sum += $1; printf "\r" sum };'
$ du -sh test/
512 test/
$ echo -n "1234567" > test/testfile.txt
$ find ./test -type f -printf "%s\n" |awk '{sum += $1; printf "\r" sum };'
7
$ du -sh test/
1.0K test/
$ tree test
test
└── testfile.txt
0 directories, 1 file
$
ZFSで圧縮がきいていると、du の結果が減っているように見える例
dd
をつかって、 0
を 1G のファイル作ってみた。
$ dd if=/dev/zero of=test/1G.dummy bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 1.51057 s, 694 MB/s
$ du -sh test/
1.5K test/
$ ls -l test
total 1
-rw-r--r-- 1 manabu manabu 1048576000 Aug 31 14:57 1G.dummy
-rw-r--r-- 1 manabu manabu 7 Aug 31 14:52 testfile.txt
$
1Gのファイルがあるのだが、 du -sh
では、 1.5K
となっている。
圧縮が効いていないファイルシステム(ext4)で実行すると、 1001M(1G) となった
$ mkdir test
$ du -sh test
4.0K test
$ dd if=/dev/zero of=test/1G.dummy bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 0.469074 s, 2.2 GB/s
$ du -sh test
1001M test