web-dev-qa-db-ja.com

zerofree verboseは何を返しますか?

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単位?)であり、最初の数値はゼロで上書きされた量であり、最後の数値は私を失ったと思います。

どう思いますか?

7
plamtrue

同じツールを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に問い合わせる

ツール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ブロックであることがわかりました。

Tune2fsで問い合わせる

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 ;
                    }
            }

結論

したがって、詳細な分析を行うと、これらの数値は次のようになります。

  • 検出されたゼロ以外のブロックの数
  • ファイルシステム内の空きブロックの数
  • ファイルシステム内のブロックの総数
13
slm

それ以外の場合は非常に詳細な答えに対する小さな修正:最初の数は無料非ゼロブロックの数です。 (つまり、ゼロ以外のファイルブロックはカウントされません)。

そのため、空きブロックの数より大きくなることはありません。

ファイルシステムでzerofree(-nなし)を実行してから、再度実行すると(オプションで、ドライランの場合は-nを使用)、ファイルシステムにゼロ以外のファイルデータがある場合でも、最初の数値が0に変更されていることがわかります。

1