假设我的驱动器在某个随机位置有一个坏的超级块(或块)。这是一个巨大的驱动器,1-8 TB。它不会格式化为 ext3,所以我把它写满了零,这样我就可以正确地格式化它。lsblk -f
显示它的 FSTYPE 为空字符串。
有什么理由不运行下面的命令吗?
sudo dd if=/dev/zero bs=10G status=progress of=/dev/bad_disk
答案1
我怀疑在程序写入块时您无法中断程序,而写入 10GB 需要很长时间。根据我的经验,块大小的性能改进会很快停滞,因此我会坚持使用更合理的大小(4MB...)。
答案2
我的回答完全符合标题:
有什么理由反对使用
dd
withbs=10G
吗?
但就你的情况来说XY问题。应使用smartctl
和badblocks
而不是来解决根本问题(坏块)。dd
内存使用情况
这是另一个答案提到“块大小的性能改进”:
块大小的性能改进相当快地达到稳定状态
没错,但这只是bs
故事中“接近零”的部分。在问题的背景下,我们应该讲述“bs
趋向无穷大”的部分。
在现实世界中,对于一些大型系统来说,平台期实际上会崩溃bs
。使用bs=10G
该工具将尝试分配 10 GiB 内存。它可能会成功也可能不会成功(内存耗尽)。即使成功了,仍然存在问题:
- 其他进程可能会将其分配的内存交换到磁盘。
- 的缓冲区
dd
可能会被换出到磁盘。该工具会不断使用它,因此操作系统可能会先换出其他(最近未访问的)数据。不过,如果您有 8 GiB RAM 和 16 GiB 交换空间,则无法放入bs=10G
RAM。 - 如果以后需要记忆,OOM 杀手可能会启动。您的进程
dd
可能是第一个被终止的进程。
当然,这一切都取决于您有多少 RAM 和多少交换空间,以及其他进程所做的事情。
提示
我个人的偏好是使用bs
在 0.1-1 秒内传输的大小;bs
如果 RAM 使用率可能是一个问题,则使用更小的大小。这样我就可以dd
几乎立即中断(这是已经提到答案)。如果硬件限制允许dd
超过 10 GiB/s,并且我有超过 40 GiB 的可用 RAM,我会考虑bs=10G
。在家里,我几乎从不超过bs=64M
。
一个bs=10G
可能有用的用例是当你想处理确切地和您使用的一样多的数据count=1
(或者例如5倍:)count=5
。然而在实践中bs
你可能会得到较少的,除非你使用iflag=fullblock
(见这个答案)。由于内存使用问题,我bs
无论如何都会重新计算为一个较小的值。