zerofree -v /dev/sda1
戻ってきた123642/1860888/3327744
。
Manページでは、これらの番号が何であるかを説明していません: http://manpages.ubuntu.com/manpages/natty/man8/zerofree.8.html
Githubでいくつかのコードを見つけました: https://github.com/haggaie/zerofree/blob/master/zerofree.c
そして、この行があります:
if ( verbose ) {
printf("\r%u/%u/%u\n", modified, free, fs->super->s_blocks_count);
}
したがって、真ん中の数値は空き領域(kB単位?)であり、最初の数値はゼロで上書きされた量であり、最後の数値は私を失ったと思います。
どう思いますか?
同じツールをFedora19にインストールしましたが、.spec
ファイルで次のタイトルのこのページにつながるURLに気づきました: ファイルシステムイメージをまばらに保つ 。このページには、テストデータを作成するためのいくつかの例が含まれているため、コマンドを実行して対応するファイルを作成しました。
$ dd if=/dev/zero of=fs.image bs=1024 seek=2000000 count=0
$ /sbin/mke2fs fs.image
$ ls -l fs.image
-rw-rw-r--. 1 saml saml 2048000000 Jan 4 21:42 fs.image
$ du -s fs.image
32052 fs.image
zerofree -v
コマンドを実行すると、次のようになりました。
$ zerofree -v fs.image
...counting up percentages 0%-100%...
0/491394/500000
ツールfilefrag
を使用してfs.image
ファイルに問い合わせると、次のようになりました。
$ filefrag -v fs.image
Filesystem type is: ef53
File size of fs.image is 2048000000 (500000 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 620: 11714560.. 11715180: 621:
1: 32768.. 32769: 11716608.. 11716609: 2: 11715181:
2: 32892.. 33382: 11716732.. 11717222: 491: 11716610:
3: 65536.. 66026: 11722752.. 11723242: 491: 11717223:
...
ソースコードで参照されているs_block_count
も、私のバージョンのzerofree.c
のソースコードと一致していました。
if ( verbose ) {
printf("\r%u/%u/%u\n", nonzero, free,
current_fs->super->s_blocks_count) ;
}
これで、s_blocks_count
が4096バイトの500,000ブロックであることがわかりました。
fs.image
を使用して画像ファイルtune2fs
をクエリすることもできます。
$ Sudo tune2fs -l fs.image | grep -i "block"
Block count: 500000
Reserved block count: 25000
Free blocks: 491394
First block: 0
Block size: 4096
Reserved GDT blocks: 122
Blocks per group: 32768
Inode blocks per group: 489
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
この出力から、zerofree
によって報告されている2番目と3番目の数値が実際に次のようになっていることがはっきりとわかります。
Free blocks: 491394
Block count: 500000
報告されている最初の数は、実際にはゼロではないことが検出されたブロックの数です。これは、zerofree
の実際のソースコードを調べることで確認できます。
nonzero
と呼ばれるカウンターがあり、ブロックを分析しているメインループを通過するたびにインクリメントされます。
if ( i == current_fs->blocksize ) {
continue ;
}
++nonzero ;
if ( !dryrun ) {
ret = io_channel_write_blk(current_fs->io, blk, 1, empty) ;
if ( ret ) {
fprintf(stderr, "%s: error while writing block\n", argv[0]) ;
return 1 ;
}
}
したがって、詳細な分析を行うと、これらの数値は次のようになります。
それ以外の場合は非常に詳細な答えに対する小さな修正:最初の数は無料非ゼロブロックの数です。 (つまり、ゼロ以外のファイルブロックはカウントされません)。
そのため、空きブロックの数より大きくなることはありません。
ファイルシステムでzerofree(-nなし)を実行してから、再度実行すると(オプションで、ドライランの場合は-nを使用)、ファイルシステムにゼロ以外のファイルデータがある場合でも、最初の数値が0に変更されていることがわかります。