dd コマンド oflag 直接および同期フラグ

dd コマンド oflag 直接および同期フラグ

次のシェルスクリプトがありますが、これが正しいかどうかを知りたいです。超過分~の直接〜これ同期自動的にまたは明示的に要求されました:

dd bs=10M oflag=direct,sync of=ofile.bin

違いは何ですか?oflag=同期そして変換=同期そして変換=fsync

コードを次の行に変更すると、どのような影響がありますか?

dd bs=10M conv=fsync oflag=direct of=ofile.bin

ベストアンサー1

conv=sync私たちはこれを最初から排除することもできます。それはかなり違うことをします。私はあなたがしたくないことを願っています:-).

block または unblock と一緒に使用する場合は、NUL を使用して各入力ブロックを ibs サイズで埋め、NUL の代わりに空白で埋めます。


oflag=direct自動的に同期されません。 [*]

conv=fsyncとは異なりますoflag=syncoflag=sync各出力ブロックの後の効果的な同期。 conv=fsync最後の同期です。

最終結果は同じですが、その過程でのパフォーマンスは異なります:-).

  1. oflag=syncかなり遅くなることがあります。ブロックサイズを増やすことでこの問題を軽減できます。

  2. デバイス固有のキャッシュが大きい場合、[1]オプションによって報告される進行状況に影響しますstatus=progress

  3. そうすればいいえ使用すると、oflag=directシステムページキャッシュに多数の書き込み操作が蓄積される可能性があります。この累積は、表示される進行状況に影響します[2]。さらに、Linuxは時々ビルドに正しく反応せず、パフォーマンスを低下させます。みんなデバイス[3]。


[1]「明らかに、あなたのハードウェアには何百メガバイトのキャッシュがあります...私の場合、カーネルは[実際には仮想マシンの内部で実行されているからです]」。https://unix.stackexchange.com/a/420300/29483

[2]ddパイプラインのgunzipが遅くなるのはなぜですか?

[サム]外部ディスクで過度の読み取りおよび書き込み操作を実行すると、システムが遅延します。

[*]ブロックデバイスノードに直接書き込む場合、Linuxはブロックデバイスが閉じられたとき(そして他のプログラムで開かないとき)、ブロックデバイスを同期します。望むより:ブロックデバイスのキャッシュとファイルシステム。ブロックデバイスに書き込むときに明示的な同期を使用していない人を時折見てください。しばしばうまく機能しているようですが…そうでないまで。したがって、少なくともconv=fsync

おすすめ記事