等待 dd 命令完全写入磁盘

等待 dd 命令完全写入磁盘

我正在使用 dd 命令从 iso 文件创建可启动 usb:

sudo dd if=~/Desktop/ubuntu.iso of=/dev/sdx bs=1M

按下回车键后,它会暂时退出并显示:

915+0 records in 915+0 records out 959447040 bytes (959 MB) copied,
0.539375 s, 1.8 GB/s

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

答案1

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

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

sudo dd if=~/Desktop/ubuntu.iso of=/dev/sdx bs=1M; sync

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

dd请注意,您可以使用来代替tee。这有两个优点:由于拼写错误而颠倒源和目标的风险较小,而且可能稍微快一点

<~/Desktop/ubuntu.iso sudo tee /dev/sdx >/dev/null; sync

¹至少在“普通”的 Ubuntu 系统或更普遍的 Linux 上是如此。在其他类 Unix 系统上或 Linux 在虚拟环境(Cygwin、WSL、虚拟机等)中运行时,情况可能并非如此。在虚拟环境中,刷新对持久存储的写入可能需要主机系统的配合。

答案2

尝试这个:

sudo dd if=~/Desktop/ubuntu.iso of=/dev/sdx conv=fdatasync bs=1m

告诉使用特殊选项conv=fdatasyncdd确保数据写入物理设备。

相关内容