如何在 Linux 中填充硬盘驱动器

Use*_*er1 25 linux hard-drive

我正在对一段代码进行一些测试,我想用数据填充硬盘驱动器。我发现dd可以立即制作大文件,但df不同意。这是我尝试过的:

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

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

psm*_*ars 26

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

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

dd if=/dev/zero of=filename bs=$((1024*1024)) count=$((10*1024))
Run Code Online (Sandbox Code Playgroud)

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


del*_*ray 26

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

yes abcdefghijklmnopqrstuvwxyz0123456789 > largefile
Run Code Online (Sandbox Code Playgroud)


qdo*_*dot 7

您已经创建了所谓的“稀疏文件”——一个文件,因为它的大部分是空的(即读回为 \0),除了实际写入的内容(1B,在 10GB 之后)不占用磁盘空间间隙)。

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

我认为您坚持使用老式的“dd if=/dev/zero of=filename bs=100M count=100”,这受到驱动器顺序写入速度的限制。


小智 6

如果您只是测试文件系统已满的情况,那么 fallocate 可能就足够了。而且速度也更快!例如

fallocate -l 150G

  • 这需要指定一个文件名:`fallocate -l 150G foo`。尽管如此,提到该工具时+1。 (3认同)