「du -sh」と「du -sb」は、ファイルにアクセスしたときに異なる結果を提供しますか?

「du -sh」と「du -sb」は、ファイルにアクセスしたときに異なる結果を提供しますか?

Sambaを使用してファイルサーバーを設定し、同じLAN上の他のコンピュータからファイルをコピーしました。 SSHサーバーを設定し、電話で接続してプロセスを監視しました。

私の電話のOpenSSHクライアントで実行するものは次のとおりです(サーバーにはGNU Core Utilitiesがインストールされています)。

# while :; do du -sh /media/samba; sleep 1; done
288M    /media/samba
289M    /media/samba
290M    /media/samba
...
^C
# while :; do du -sb /media/samba; sleep 1; done
328267292       /media/samba
328267292       /media/samba
328267292       /media/samba
... ...
(repeated ~30 times)
361334588       /media/samba
361334588       /media/samba
... ...
(repeated ~30 times)
403280532       /media/samba
403280532       /media/samba
^C
#

コンピュータ(Windows 10を実行)はおおよその転送速度を報告します。 1000KB/s、すべてのファイルサイズは30~35MBです。

私の観察によると、報告されたduファイルサイズはですが、-h「占有スペース」はです-b

それでは、duファイルが大きくなるとサイズが異なるように報告されるのはなぜですか?オプションの合計を処理する
方法は? du-h-b

ベストアンサー1

私の観察によると、duは-hでファイルサイズを報告しますが、-bで「占有スペース」を報告します。

GNUの場合、その逆が適用されduますdu --help

-b, --bytes は '--apparent-size --block-size=1' と同じです。

duレポートなしで--apparent-sizeディスク使用量(ディレクトリを含むすべての種類の一意のファイルフィールドの合計、st_blocksディレクトリツリーを参照して計算)を報告し--apparent-size(暗黙的に)、-b合計st_size(一般ファイルから読み取られたデータ量)を報告します。ファイル)。

ディスク使用量が徐々に増加すると、見かけのサイズは大きな塊に大きくなります。 1つの可能な説明は、ファイルの内容が最初から最後まで順番に転送されるのではなく、ランダムに転送されることです。これはチャンクが別のピアで送信されるビットストリーミングでは一般的です。

たとえば、書き込み用に新しいファイルを開き、1GiBオフセットで4KiBブロックを書き込むと、ファイルサイズは1GiB + 4KiBに大きくなりますが、ディスク使用量は4KiBになります。

$ zsh
% zmodload zsh/system
% exec 3> file
% du -h file
0       file
% du -s file
0       file
% sysseek -u3 $((1<<30)) # seek to 1GiB
% head -c 4K < /dev/urandom >&3 # write 4KiB there
% du -h file
4.0K    file
% du -b file
1073745920      file

これはディスク容量を4KiBだけ占める非常に大きなスパースファイルです。

% sysseek -u3 0
% head -c 4K < /dev/urandom >&3
% du -h file
8.0K    file
% du -b file
1073745920      file

4KiBの書き込みを開始した後、ファイルサイズは変わりませんでしたが、ディスク使用量が大幅に増加しました。

% head -c 4M < /dev/urandom >&3
% du -h file
4.1M    file
% du -b file
1073745920      file

別の4MiBを書いた後も同じことが起こりました。


1 BitTorrentクライアントは通常、スペースを事前に割り当ててfallocate()スペースを確保し、システムがディスク割り当てを決定するのに役立ちます。fallocate()サポートされていないSMBファイルにアクセスする必要がある場合は、これを実行できない可能性があります。

おすすめ記事