如何在Linux中填充硬盘


24

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

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

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


如果您在serverfault.com上询问,将会更加幸运

顺便说一句,10 * 1024 * 1024 * 1024与10 * 2 ** 30相同,有点简单。
deltaray

Answers:


26

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

您可以强制使用以下方式分配空间:

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

这将花费更长的时间,但实际上会填满磁盘。我建议使块大小远大于1,因为这将确定该dd进程进行的系统调用数量-块大小越小,系统调用越多,因此运行速度越慢。(尽管超过1MB左右可能不会有太大变化,甚至可能使速度变慢...)


我通常使用bs =(无论高速缓存大小的一半在我正在写的驱动器上)。迄今为止,当将分区映像到较大的硬盘驱动器上以供以后调整大小时,此方法一直很好。ETA:关键词HALF。
2011年

20

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

yes abcdefghijklmnopqrstuvwxyz0123456789 > largefile

令人惊讶的是,这与使用dd if = / dev / zero of = filename bs = 1M一样快。
bhinesley

语法也很容易记住。
2015年

7

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

我不认为您可以立即制作大量文件,而立即占用实际的磁盘空间-占用物理空间意味着文件系统需要为文件分配磁盘块。

我认为您受制于老式的“ dd if = / dev / zero of =文件名bs = 100M count = 100”,它受驱动器顺序写入速度的限制。


6

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

法洛卡特-l 150G


3
这需要指定一个文件名:fallocate -l 150G foo。不过,+ 1是提及该工具。
卡米尔Maciorowski


3

如果要从字面上填充硬盘驱动器,请执行以下操作:

dd if=/dev/zero of=zeros bs=1M

如果要限制大小,可以选择指定count,但是如果省略count,它将一直运行到磁盘空间不足为止。

dd if=/dev/zero of=zeros bs=1M count=10240

如psmears所述,如果将块大小设置为1 MB(bs = 1M)而不是1 B(bs = 1),将会获得更好的性能。这仍然需要一段时间,但是如果您要检查命令的进度,请打开一个单独的控制台并运行以下命令:

ps aux | grep dd

在此命令中使用dd的PID(用dd的PID替换PID):

kill -USR1 PID

然后去看看你的dd终端。当然,当您只是试图填充驱动器时,这是有限的用途(可以分别使用df或du来检查可用磁盘空间或文件大小)。但是,在其他情况下,使dd输出其进度很方便。

额外的功劳:将可用空间归零的一种实际用途是,之后,您可以删除“归零”文件,然后将整个分区(或磁盘,如果已将所有分区归零)dd到磁盘映像文件(例如,disk-backup.dd),然后压缩文件。现在,可用空间具有高度可压缩性,因此压缩后的dd映像将比包含其内容的原始块设备小得多。

Shenanigans:压缩较大的零文件并将其通过电子邮件发送给所有朋友。告诉他们这真的很酷。


2

使用以下命令创建一个非稀疏1 TB文件:

dd if=/dev/zero of=bigfile1 bs=10000000000 count=512

这对于测试超出配额或文件系统已满时发生的情况很有用。

df -h 显示可用空间越来越小。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.