为什么同步选项与“dd”命令一起使用?

为什么同步选项与“dd”命令一起使用?

按照说明进行操作页面,页面最后显示了一个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. 

答案1

您误读了该命令。它是:

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.

一旦您想到缓存,就会明白为什么使用它。

至于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

答案2

Dd 将一次读取一个块的数据(块大小由用户指定)。Dd 可能会读取比用户指定的更短的块,无论是在文件末尾,还是由于源设备的属性;这被称为部分记录默认情况下,dd 将写出一个与其读取的数量相同大小的块。

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

这种行为对于在文件系统内或通过 TCP 网络连接复制普通文件没有问题,因为这被视为字节流。但其他文件系统对象(如原始 DVD 和磁带)要求写入大小在特定范围内,并且是某个数量的整数倍(例如 512 或 2048 字节)。例如,如果您有一个磁盘映像,该映像有 255 个磁道,每个磁道有 63 个 512 字节扇区,并且想要写入需要 1024 字节块大小的磁带,则需要执行类似

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

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

答案3

您可以使用包含在命令sync中的符号选项进行输出:ddoflag

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

答案4

我发现 Linux 系统(而不是 dd)会缓存缓冲区。因此,当 dd 命令完成后,我会运行 sync 命令

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

我没有使用任何内部 dd 选项来导致缓冲区刷新。但通常情况下,当我创建发行版的 USB 版本时,我是计算机上唯一的用户,因此我并不担心我发布的命令会造成危害。由于我以 && 的身份运行同步,因此同步是通过 sudo 权限完成的,我确信我创建的 USB 是完整的。

相关内容