为什么在制作可启动的 linux usb 时同步如此重要?

Jon*_*mar 24 storage dd bootable removable-storage

来自 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与 optional 一起使用的命令status=progress

tar -xzOf archlinux-2016-09-03-dual.iso | dd of=/dev/disk2 bs=4M status=progress && sync
Run Code Online (Sandbox Code Playgroud)

pv用于进步

tar -xzOf archlinux-2016-09-03-dual.iso | pv | dd of=/dev/disk2 bs=4M && sync
Run Code Online (Sandbox Code Playgroud)

Ser*_*rge 34

dd当其写入设备,所以数据的某些部分可能尚未写入到旁路内核磁盘高速缓存并不USB在坚持dd完成。如果USB在那个时候拔掉你的棒子,棒子上的内容USB就会不一致。因此,您的系统甚至可能无法从该USB棒启动。

Sync 将任何仍在缓存中的数据刷新到设备。

sync您可以使用fdatasync dd's 转换选项,而不是调用:

数据同步

在完成之前物理写入输出文件数据

在您的情况下,命令将是:

tar -xzOf archlinux-2016-09-03-dual.iso | \
dd of=/dev/disk2 bs=4M status=progress conv=fdatasync
Run Code Online (Sandbox Code Playgroud)

conv=fdatasync品牌dd有效地调用fdatasync()系统调用在之前传输结束时dd退出(我选中此dd的来源)。

这确认dd不会绕过或刷新缓存,除非明确指示这样做。

  • 我更喜欢使用`oflag=sync`,所以progress 输出的是真实的传输速度而不是缓存的速度(所以稳定的10MB/s 而不是一秒的100MB/s,然后是10 秒的停顿)。 (12认同)