我有一个由 ZFS 处理的文件系统,大约 8 GB。
我尝试通过运行以下命令将文件系统清零:
dd if=/dev/zero of=/EMPTY bs=1M | true
rm -f /EMPTY
通常在 ext4 文件系统上,它会在几秒钟内完成。
但这一次它只是继续下去。
我能够启动第二个终端并查看其大小/EMPTY
。运行后ll -h
,显示/EMPTY
是800GB!显然800GB不适合8GB。
此外,通过运行df -h
,它表明文件系统没有被填满。
然而 dd 消耗了 50% 的 CPU.. 等等,使我的笔记本电脑发热。我假设它做了很多工作但一无所获。
那么为什么 dd 会永远运行并创建一个不占用任何大小的文件呢?在 ext4 上,它应该完成并给我一个错误,以便我可以继续。
答案1
我不知道你想要实现什么,所以我只能描述你的命令实际上在做什么。
dd if=/dev/zero
您正在从一个特殊设备读取数据,该设备返回无限数量的零(或 NUL)字节。
of=/EMPTY
您正在使用上述(无限)输入创建一个新文件。
bs=1M
您可以以兆字节块的形式读取和写入无限数据流。你永远不应该做这样的事情,因为你可能会填满文件系统,并且许多工具无法应对这种情况。虽然外部4文件系统被有效填满并且命令结束,压缩文件系统能够积极压缩零字节流。
| true
这是无稽之谈,因为dd
withof=
没有任何输出。您可能打算中|| true
和 的状态代码,dd
但这并不是很有用,因为单个命令失败不会杀死整个脚本。
的一种典型用途dd if=/dev/zero
是将整个设备归零,例如/dev/sdb
.正如另一个答案中所述,您可能想改用shred
。在这两种情况下,您都希望将系统中呈现的整个系统分区称为块设备,而不是单个文件(可能不再存在)。有很多关于 linux 块设备的书籍和在线资源以及 的手册页,shred
也dd
非常有用。
当您删除文件时,其块立即可用。你不需要施展任何黑魔法。如果您想清除文件的内容以防止取证技术,只需使用schred --delete
删除文件而不是普通删除即可。清除已删除文件的块并不那么容易,您不能简单地依赖于创建一个大的空文件。您需要一个专门的文件系统特定工具来安全地完成此操作。
答案2
您正在遇到 ZFS 的压缩问题。如果您试图清除文件系统,那么您不能在 ZFS 中这样做。如果您尝试清除底层磁盘,最好的办法是在 zfs 池上使用“zpool destroy”,然后在物理设备本身上使用 dd。 (“dd if=/dev/zero of=/dev/....”)。完成后,只需使用 zpool create 重新创建池。
答案3
我不知道,ZFS
但如果您的目的是将文件系统归零,那么dd
我会建议
撕碎
我没有回答为什么 dd 处于无限循环中,但你的最终目标已经解决