为什么 dd 读取和写入同一磁盘?

为什么 dd 读取和写入同一磁盘?

我一直dd在 Linux 中使用来覆盖外部 USB 硬盘。

当我使用 512 字节的默认块大小时,使用以下命令:

# dd if=/dev/zero of=/dev/sdb

在整个操作过程中,硬盘驱动器 (/dev/sdb) 会交替读取和写入,每次大约 1GB。即read 1GB…………等等。从硬盘驱动器读取的数据与写入硬盘的数据一样多write 1GBread 1GBwrite 1GB

我知道这种情况正在发生,因为它显示在我的自定义 Conky 面板 ( diskio_readdiskio_write) 中,我知道这是磁盘 I/O 活动 100% 可靠的指示器。

我在另一台计算机上使用不同的外部硬盘驱动器重复了此操作。它通过 USB 2.0 和 USB 3.0 发生。

相反,当我执行相同的操作,但使用 1MB 的块大小时,使用以下命令:

# dd if=/dev/zero of=/dev/sdb bs=1M

除了开始时有少量读取外,在操作过程中根本不读取硬盘。

鉴于这种现象发生在我的两台不同的计算机和两个不同的硬盘上,使用标准的 Linux 发行版(Xubuntu 14.04),任何想要的人都应该能够在自己的计算机上复制它。

有人可以解释一下这里发生了什么吗?

答案1

如果指定的块大小(512 字节)小于磁盘的块大小(通常为 4096 字节,但现在可能更多),则该块将被部分写入,因此必须保留块其余部分的内容在写作之前。

这是因为磁盘块无法仅写入 512 字节,而必须一次写入完整块(4096 或更大)。当您写入此(4096)个或更多数量时,不存在部分写入,因此不必读取。

答案2

这基本上是 Linux 系统上缓冲 I/O 的症状。与该命令相关的一个很好的概述dd位于有没有办法确定 dd 的 bs 参数的最佳值?这支持 ctrl-d 的答案。然而,这也表明更大的块大小(即大于 1M)可能会进一步提高性能。

相关内容