如何在 Linux 中填充硬盘

如何在 Linux 中填充硬盘

我正在测试一段代码,我想用数据填充硬盘。我发现这dd可以立即生成巨大的文件,但df不同意。以下是我尝试的方法:

dd if=/dev/zero of=filename bs=1 count=1 seek=$((10*1024*1024*1024))

ls -lh显示一个 10G 文件。但是,df -h显示分区没有缩小。那么我需要做什么才能df识别出数据现在已被占用?我希望在单元测试中编写一些快速的代码。

答案1

这个seek=<big number>技巧的麻烦之处在于文件系统(通常)很聪明:如果文件的一部分从未被写入(因此全为零),它就不会为其分配任何空间 - 所以,正如你所看到的,你可以有一个 10GB 的文件不占用任何空间(这被称为“稀疏文件”,在某些情况下非常有用,例如某些数据库实现)。

您可以强制分配空间(例如):

dd if=/dev/zero of=filename bs=$((1024*1024)) count=$((10*1024))

这将花费更长的时间,但实际上会填满磁盘。我建议将块大小设置为远高于 1,因为这将决定进程dd进行多少个系统调用 - 块大小越小,系统调用越多,因此运行速度越慢。(虽然超过 1MB 左右可能不会有太大区别,甚至可能会减慢速度......)

答案2

作为另一个选项,您可以将 yes 与单个字符串一起使用,这比运行 dd if=/dev/urandom of=largefile 快 10 倍左右。像这样

yes abcdefghijklmnopqrstuvwxyz0123456789 > largefile

答案3

您创建了所谓的“稀疏文件” - 由于该文件大部分为空(即读回为 \0),因此除了实际写入的内容(10GB 的间隙后为 1B)之外,它不会占用磁盘空间。

我不相信您可以制作巨大的文件,瞬间占用实际的磁盘空间 - 占用物理空间意味着文件系统需要为您的文件分配磁盘块。

我认为您被困在老式的“dd if=/dev/zero of=filename bs=100M count=100”中,它受到驱动器连续写入速度的限制。

答案4

停止使用seek,并使用非常大的bsand/or count。因为你正在制作一个稀疏文件,显然你不应该这么做。

相关内容