为什么sync选项与dd命令一起使用?


13

按照页面上的说明,该页面最后显示了dd命令和sync选项。命令如下:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M sync

我知道dd它是什么以及它如何工作,但我从未听说过或使用过该sync选项,它的手动页面输入是这样的:

sync   pad every input block with NULs to  ibs-size;  when  used  with
       block or unblock, pad with spaces rather than NULs

NUL它是什么,为什么要填充到ibs-size,为什么还要填充数据块并syncdd命令中使用该选项?为什么不保持它简单易用?

当我尝试sync使用适当的位置和值运行命令时,出现以下错误:

dd: unrecognized operand ‘sync’
Try 'dd --help' for more information. 

Answers:


21

您误读了该命令。它的:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M 
sync

sync是一个单独的命令,在这里。见man 1 sync

NAME
       sync - flush file system buffers

SYNOPSIS
       sync [OPTION]

DESCRIPTION
       Force changed blocks to disk, update the super block.

Kinda很明显,一旦您想到缓存就使用了它。

至于dd您阅读的选项,它是conv选项的值:

Each CONV symbol may be:
   ascii  from EBCDIC to ASCII
   ...
   sync   pad every input block with NULs  to  ibs-size;  when  used  with
          block or unblock, pad with spaces rather than NULs

如果已使用(未使用),则将这样使用:

dd ... conv=sync

3
很好的答案,非常详细。很高兴您甚至描述了这个dd ... conv=sync论点。
字节指挥官

不要让他们嘲笑你! ;-)好的答案:您发现了我什至没有发现的问题。 > :-) +1
Fabby 2015年

1
conv=sync选项的描述中也可以很清楚地看出为什么不使用该选项。充其量它什么都不做,最坏的情况是它会在复制过程中损坏图像。
kasperd 2015年

5
真的应按说明书要求dd选项oflag=fsync(这刷新输出DD写),而不是一个sync命令(刷新所有的系统上。
psusi

这个答案是误导的。使用dd时,syncconviflagoflag选项的参数。
Dan Loewenherz

3

默认情况下,dd一次读取一个数据块,可能是在文件末尾或由于源设备的行为读取比用户指定的块短的数据;这称为部分记录。然后,它将写出一个与其读取的大小相同的块。

Dd将重复此操作,直到达到指定的计数,或者在输入上看到eof,或者在输入或输出上看到错误。完成后,dd将报告其已读取和写入的全部和部分记录的数量。

对于在文件系统内或通过TCP网络连接复制普通文件的情况,此行为很好,因为这被认为是字节流。但是其他文件系统对象(例如原始DVD和磁带)要求的写大小在一定范围内,并且是某个数量(例如512或2048字节)的整数倍。例如,如果您的磁盘映像是63 512字节扇区的255条磁道,并且想要写入需要1024字节块大小的磁带,则需要执行以下操作

dd if=disk.img of=/dev/rmt0 bs=1k conv=sync

确保dd不会在末尾尝试写出512字节的块。最后的较短块将用零或空白填充。用零填充是一种安全的常见选择。dd使用空格填充的选项在不同情况下很有用-将具有可变长度行的文件转换为具有固定长度行的文件。


0

我发现Linux系统而不是dd会缓存缓冲区。因此,当dd命令完成时,我以

sudo dd if=my.downloaded.iso of=/dev/sd(?) bs=1M && sync

我没有使用任何内部dd选项引起缓冲区刷新。不过,通常情况下,当我创建发行版的USB版本时,我是计算机上唯一的发行版,因此我对发布的命令是否有害没有丝毫疑虑。由于我以&&身份运行同步,因此已使用sudo权限完成了同步,并且我确定我创建的USB已完成。


0

您可以使用符号sync将输出选项包含在dd命令中oflag

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M oflag=sync
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.