等待 dd 命令完全写入磁盘

Kir*_*lev 14 command-line bash

我正在使用 dd 命令从iso文件创建一个可启动的USB:

sudo dd if=~/Desktop/ubuntu.iso of=/dev/sdx bs=1M
Run Code Online (Sandbox Code Playgroud)

按回车后它会暂时退出并给我:

915+0 records in 915+0 records out 959447040 bytes (959 MB) copied,
0.539375 s, 1.8 GB/s
Run Code Online (Sandbox Code Playgroud)

所以这就像在后台运行,因为我可以看到闪存驱动器正在工作。最终它将停止复制,我可以成功移除驱动器,但问题是为什么 dd 命令不等待复制完成。为什么它在后台运行。我怎样才能让它等待?

Gil*_*il' 24

尽管普遍认为,它dd是一个非常普通的命令,但它并不比cat或低级cp。您的命令从磁盘缓存读取并像任何其他命令一样写入磁盘缓冲区。

为了确保数据完全写入物理介质,您需要调用sync. 该命令sync将所有输出缓冲区刷新到磁盘。当sync命令返回时,数据已完全写入。

sudo dd if=~/Desktop/ubuntu.iso of=/dev/sdx bs=1M; sync
Run Code Online (Sandbox Code Playgroud)

大多数情况下,您不需要调用sync,因为卸载文件系统执行相同的工作。当umount命令返回时,或者当您在单击“弹出”后收到确认消息时,缓冲区已写入磁盘。在这里,您直接写入磁盘而不通过安装的文件系统,因此您需要显式刷新缓冲区。

请注意dd,您可以使用tee. 这有两个优点:由于打字错误而反转源和目标的风险较小,而且速度可能稍快一些

<~/Desktop/ubuntu.iso sudo tee /dev/sdx >/dev/null; sync
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是错误的。如果没有 `conv=f​​datasync`,`dd` 命令不会按照 OP 的要求等待数据写入磁盘后完成。此外,`sync` 命令调度同步操作,但它立即返回;它不会等到数据写入磁盘后才返回。 (8认同)
  • @vy32 你是对的,`dd` 不会在没有 `conv=f​​datasync` 等的情况下等待缓存被刷新,但在非古代 Linux 上,你对 `sync` 不等待是不正确的。你可以看到 [coreutils'`sync(8)` 进行 `sync(2)` 系统调用](https://github.com/coreutils/coreutils/blob/86ee5548c186e82f25e1aad9bdae8edda22b7178/src/sync.c#L231)。[`sync(2)` 手册页](http://man7.org/linux/man-pages/man2/sync.2.html#BUGS) 说“在 1.3.20 版之前 Linux 没有等待我/O 在返回之前完成。” 所以在磁盘确认写入(或触发错误)之前,`sync(8)` 不会返回。 (2认同)

vy3*_*y32 16

尝试这个:

sudo dd if=~/Desktop/ubuntu.iso of=/dev/sdx conv=fdatasync bs=1m
Run Code Online (Sandbox Code Playgroud)

conv=fdatasync通知dd使用特殊的选项,以确保数据被写入到物理设备。