为什么 dd 在 8 GB 驱动器上永远运行

CMC*_*kai 4 zfs dd hard-disk

我有一个由 ZFS 处理的文件系统,大约 8 GB。

我试图通过运行将文件系统归零:

dd if=/dev/zero of=/EMPTY bs=1M | true
rm -f /EMPTY
Run Code Online (Sandbox Code Playgroud)

通常在 ext4 文件系统上,它会在几秒钟内完成。

但这一次它只是继续前进。

我能够启动第二个终端并查看其大小/EMPTY。运行后ll -h,它说/EMPTY是800 GB!显然 800 GB 不适合 8 GB。

此外,通过运行df -h,它表明文件系统没有被填满。

然而,dd 消耗了 50% 的 CPU 等,使我的笔记本电脑升温。我假设它做了很多工作,但一无所获。

那么为什么 dd 永远运行创建一个不占用任何大小的文件?在 ext4 上,它意味着完成并给我一个错误,以便我可以继续。

Pav*_*rda 6

我不知道你想要达到什么目的,所以我只能描述你的命令实际上在做什么。

dd if=/dev/zero
Run Code Online (Sandbox Code Playgroud)

您正在从一个特殊设备读取,该设备返回无限数量的零(或 NUL)字节。

of=/EMPTY
Run Code Online (Sandbox Code Playgroud)

您正在使用上述(无限)输入创建一个新文件。

bs=1M
Run Code Online (Sandbox Code Playgroud)

您以兆字节块为单位读写无限数据流。您永远不应该做这样的事情,因为您可能会填满文件系统,而许多工具无法应对这种情况。当ext4文件系统被有效填满并且命令结束时,压缩文件系统能够积极地压缩零字节流。

| true
Run Code Online (Sandbox Code Playgroud)

这是无稽之谈,因为ddwithof=没有任何输出。您可能打算|| true消除 的状态代码,dd但这无论如何都不是很有用,因为单个命令失败不会杀死整个脚本。

的一种典型用途dd if=/dev/zero是将整个设备归零,例如/dev/sdb。正如另一个答案中所述,您可能想shred改用。在这两种情况下,您都希望将系统中显示的整个系统分区称为块设备,而不是单个文件(可能不再存在)。有很多关于 linux 块设备和手册页的书籍和在线资源shreddd它们也非常有用。

当您删除一个文件时,它的块立即可用。您不需要执行任何黑魔法。如果您想清除文件内容以防止取证技术,只需使用schred --delete删除文件而不是正常删除。清除已删除文件的块并不容易,您不能简单地依赖创建一个大的空文件。您需要一个专门的文件系统特定工具来安全地执行此操作。