按照说明进行操作这页面,页面最后显示了一个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
,为什么要费心填充数据块并sync
在dd
命令中使用选项?为什么不让它变得简单易行?
当我尝试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
中的符号选项进行输出:dd
oflag
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 是完整的。