ブート可能なLinux USBスティックを作成するとき、なぜ同期がそれほど重要なのですか?


15

Arch Linux Wikiから:https : //wiki.archlinux.org/index.php/USB_flash_installation_media

# dd bs=4M if=/path/to/archlinux.iso of=/dev/sdx status=progress && sync

[...]ドゥないミス同期は、USBドライブを引っ張って前に完了します。

私が知りたいのですが

  • それは何をするためのものか?
  • 省略した場合、どのような結果がありますか?

ノート

ddオプションで使用されるコマンドstatus=progress

tar -xzOf archlinux-2016-09-03-dual.iso | dd of=/dev/disk2 bs=4M status=progress && sync

またはpv進行中に使用する

tar -xzOf archlinux-2016-09-03-dual.iso | pv | dd of=/dev/disk2 bs=4M && sync

回答:


19

ddデータの一部がにまだ書かれていませんすることができるので、それは、デバイスへの書き込み時にカーネルのディスクキャッシュバイパスないUSB時にスティックdd完了。USBその時点でスティックのプラグを抜くと、スティックの内容にUSB一貫性がなくなります。したがって、システムはこのUSBスティックからの起動に失敗することさえあります。

Sync キャッシュに残っているデータをデバイスにフラッシュします。

を呼び出す代わりに、の変換オプションをsync使用できfdatasync ddます。

fdatasync

終了する前に出力ファイルデータを物理的に書き込む

あなたの場合、コマンドは次のようになります。

tar -xzOf archlinux-2016-09-03-dual.iso | \
dd of=/dev/disk2 bs=4M status=progress conv=fdatasync

conv=fdatasync作るdd効果的に呼び出しfdatasync()直前に転送の終了時にシステムコールdd終了(私はこれを確認dd源さん)。

これにより、dd明示的に指示されない限り、キャッシュをバイパスまたはフラッシュしないことが確認されます。


あなたの貢献のためのおかげで、しかし、私がいないことを確認この文は正しいことをしていないのには、デバイスへの書き込みカーネルのディスクキャッシュのバイパス。ファイルに書き込むとき(カーネルのファイルシステムレイヤー上)、物事はキャッシュされます。ただし、デバイスへの書き込みが心配です。それがこの質問の要であるため、可能であれば、そのステートメントのソースを提供してください。trueの場合、-to-device操作後に実行する有効な理由が提供されます。ddsyncdd
ジョナサンKomar

はい、キャッシュされます。キャッシングは、カーネルのブロックデバイスインフラストラクチャ内で行われます。ファイル操作自体はキャッシュされません。基盤となるブロックデバイスインターフェイスはキャッシュを行います。ソース:lxr.free-electrons.com/source/block/blk-flush.c
セルジュ

@ macmadness86更新された答えを参照してください
セルジュ

7
私はを使用oflag=syncするので、進行状況はキャッシュされた速度ではなく実際の転送速度を出力します(そのため、1秒100MB / sの代わりに10MB / sで安定し、その後10秒ストールします)。
バートポロット

ブロックデバイスへの書き込みは、VFSを完全にバイパスします。つまり、ファイルへの書き込みはカーネルによってキャッシュできます(通常はキャッシュされます)が、デバイスへの書き込みはカーネルによってキャッシュされることはありません(できません)。
エリック

0

sync(1)のマニュアルページから:「sync-キャッシュされた書き込みを永続ストレージに同期する」。基本的にsync、すべてのデータがキャッシュからスティックに書き込まれるようにします。


私はあなたの質問のどこにライトが上がっているかについての部分が表示されません。
-schaiba
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.