web-dev-qa-db-ja.com

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

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
15
Jonathan Komar

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

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

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

fdatasync

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

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

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

_conv=fdatasync_は、ddが終了する直前の転送の終わりにddを効果的にfdatasync()システムコールに呼び出します(ddのソースでこれを確認しました)。

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

19
Serge

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

0
schaiba