为什么制作可引导的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

Answers:


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了除非明确指示,否则不会绕过或刷新缓存。


感谢您的贡献,但是我不确定该语句是否正确dd在写入设备时不会绕过内核磁盘缓存。写入文件时(在内核的文件系统层上),将缓存内容。但是,我担心写入设备。如果可以,请提供该声明的来源,因为这是此问题的关键。如果为true,则将提供-to-device操作sync后运行的有效理由。dd
乔纳森·科玛

是的,它已缓存。缓存发生在内核的块设备基础结构内部。文件操作本身不被缓存。基础块设备接口会兑现。来源:lxr.free-electrons.com/source/block/blk-flush.c
Serge

@ macmadness86查看更新的答案
Serge

7
我倾向于使用oflag=sync,因此进度会输出实际的传输速度,而不是已缓存的速度(因此,稳定的速度为10MB / s,而不是一秒钟的100MB / s,然后是10秒的停顿)。
巴特·波洛

写入块设备将完全绕开VFS。换句话说:写入文件可以被内核缓存(通常是),但是写入设备绝不会被内核缓存(并且不能)。
埃里克

0

在sync(1)手册页上:“同步-将缓存的写入同步到持久性存储”。基本上sync确保所有数据都已从缓存写入存储棒。


我看不到您的问题在哪里出现,有关点亮的部分。
schaiba
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.