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

Chi*_*a B 21 dd

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

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M sync
Run Code Online (Sandbox Code Playgroud)

我知道dd它是什么以及它是如何工作的,但我从来没有听说过或使用过sync它的选项,它的手册页条目是这样的:

sync   pad every input block with NULs to  ibs-size;  when  used  with
       block or unblock, pad with spaces rather than NULs
Run Code Online (Sandbox Code Playgroud)

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

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

dd: unrecognized operand ‘sync’
Try 'dd --help' for more information. 
Run Code Online (Sandbox Code Playgroud)

mur*_*uru 30

您误读了命令。它的:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M 
sync
Run Code Online (Sandbox Code Playgroud)

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

NAME
       sync - flush file system buffers

SYNOPSIS
       sync [OPTION]

DESCRIPTION
       Force changed blocks to disk, update the super block.
Run Code Online (Sandbox Code Playgroud)

一旦您想到缓存,就很明显为什么要使用它。

至于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
Run Code Online (Sandbox Code Playgroud)

如果它被使用(它不是),它将被这样使用:

dd ... conv=sync
Run Code Online (Sandbox Code Playgroud)

  • 实际上,指令应该调用 dd 选项 `oflag=fsync`(它刷新输出 dd 已写入)而不是 `sync` 命令(它刷新系统上的*一切*。 (7认同)
  • 很好的答案,很详细。很高兴你甚至描述了 `dd ... conv=sync` 参数。 (4认同)
  • 这个答案具有误导性。对于 dd,“sync”是“conv”和“iflag”或“oflag”选项的参数。 (2认同)

Mar*_*ick 7

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
Run Code Online (Sandbox Code Playgroud)

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