等待dd命令完全写入磁盘


13

我正在使用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命令不等待复制完成。为什么它在后台运行。我该如何等待?


4
你试过了sync吗?
choroba 2013年

1
@choroba如果系统已经将数据写入闪存驱动器,则运行“同步”是否有意义?
Kir Ivlev 2013年

我不确定,byt sync可能会等待。
choroba

2
dd也有一些同步选项,例如conv=fsync。就是说,我自己从来不必在/dev/sd*驱动器上使用它。如果您真的使用了/dev/sdx我的猜测,那么/dev现在(ramdisk)中将有一个无用的959MB文件...
frostschutz

1
@frostschutz我在闪存驱动器中使用了/ sdc
Kir Ivlev 2013年

Answers:


21

尽管大家普遍认为,这dd是一个非常普通的命令,但它并不比cator 更底层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

1
“弹出”或“安全删除”按钮/图标如何。他们会在发出“确定删除”通知之前也调用同步吗?
user68186

1
您可能想使用sudo tee /dev/sdx >/dev/null,否则由于将数据写入控制台输出,因此复制过程仍然很慢。
Lekensteyn

1
@ user68186他们不调用sync命令,但是在后台执行相同的工作。
吉尔(Gilles)'所以

5
这个答案是错误的。如果不使用conv=fdatasync,则该dd命令不会等到OP要求将数据写入磁盘后才完成。此外,该sync命令安排了一个同步操作,但它立即返回。直到将数据写入磁盘后,它才会等待返回。
vy32

1
@ vy32是正确的,您dd将不会等待不进行其他操作而刷新缓存conv=fdatasync。但是在非古代Linux上,您对sync不等待是不正确的。您可以看到coreutils sync(8)正在进行sync(2)syscall。该sync(2)手册页说:“1.3.20版本之前的Linux没有等待I / O完成后才返回。” 因此sync(8)只有在磁盘确认写入(或触发错误)后才会返回。
匿名,

13

尝试这个:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.