我正在使用 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
低级。您的命令像任何其他命令一样从磁盘缓存中读取并写入磁盘缓冲区。cat
cp
为了确保数据已完全写入物理介质,您需要调用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=fdatasync
来dd
确保数据写入物理设备。