为什么“dd”会为同一个 U 盘生成不同的文件?

Ema*_*ele 4 linux usb mount dd

我刚刚将Windows 8.1的还原保存到 U 盘上;现在,我一直在通过执行以下命令在我的硬盘上创建它的低级副本:

sudo dd if=/dev/sdf of=/disk2/Archive/windows8.1-restore.img bs=4M oflag=direct

我想仔细检查我的“dd”命令是否正常,所以我重新运行了两次,同时指定了bs=8Mbs=16M;我检查了大小,它完全相同,但是md5sum为三个文件提供了不同的输出:

c38a2b07b3d473d3f1876331edc2647b windows8.1-restore.img.4M
568e382844431eef63d4ba6dc4c2c5ac windows8.1-restore.img.8M
568e382844431eef63d4ba6dc4c2c5ac windows8.1-restore.img.16M

我相信我已经第二次和第三次卸载了 U 盘。

我应该担心什么吗?

编辑

31024349184在所有情况下,总文件大小都是字节,我的理解bs=xxx是控制速度以防万一有人想转储整个 USB 设备/驱动器。

gro*_*taj 8

将少量数据写入驱动器很慢,因此系统缓冲区写入以在以后一次性提交所有数据。当缓冲区包含足够的数据以进行有效的写入操作或某些进程使用sync系统调用时,缓冲区将刷新到设备。

dd执行低级复制,即。它读取物理上存在于设备上的数据。它不考虑缓冲区。

如果在您运行时挂载了驱动器dd bs=4M,则可能已经缓冲了某些写入,但尚未提交。您已在没有缓冲更改的情况下转储驱动器。

umountsync内部调用以确保数据完整性。除非您明确要求某个进程执行此操作,否则通常不会访问已卸载的设备,因此卸载后驱动器不太可能更改。

然后你dd在驱动器上运行了两次,中间没有安装它。这就是为什么bs=8Mbs=16M调用产生相同结果的原因。

但是,驱动器在bs=4Mbs=8M调用之间进行了修改,因此第一个转储是不同的。bs=没关系,打电话umount就行。

在使用之前,您应该始终卸载设备dd,否则其他一些进程可能会在dd执行其工作时修改其内容并破坏文件完整性。

  • 当我第一次执行`dd`时,我认为我第一次_mounted_有点傻。我想我会保留与设备 _unmounted_ 一起拍摄的文件。害怕! (2认同)