我正在对一段代码进行测试,我想用数据填充硬盘驱动器。我发现dd
可以立即制作出大文件,但df
不同意。这是我尝试过的:
dd if=/dev/zero of=filename bs=1 count=1 seek=$((10*1024*1024*1024))
ls -lh
显示一个10G文件。但是,df -h
显示该分区没有缩小。那么,我需要做些什么来df
识别现在已获取数据?我希望可以在单元测试中快速编写代码。
我正在对一段代码进行测试,我想用数据填充硬盘驱动器。我发现dd
可以立即制作出大文件,但df
不同意。这是我尝试过的:
dd if=/dev/zero of=filename bs=1 count=1 seek=$((10*1024*1024*1024))
ls -lh
显示一个10G文件。但是,df -h
显示该分区没有缩小。那么,我需要做些什么来df
识别现在已获取数据?我希望可以在单元测试中快速编写代码。
Answers:
麻烦的seek=<big number>
是文件系统通常很聪明:如果文件的一部分从未被写入过(因此全为零),那么它就不会为它分配任何空间。您已经看到,您可以拥有一个不占用空间的10GB文件(这被称为“稀疏文件”,在某些情况下(例如某些数据库实现)非常有用)。
您可以强制使用以下方式分配空间:
dd if=/dev/zero of=filename bs=$((1024*1024)) count=$((10*1024))
这将花费更长的时间,但实际上会填满磁盘。我建议使块大小远大于1,因为这将确定该dd
进程进行的系统调用数量-块大小越小,系统调用越多,因此运行速度越慢。(尽管超过1MB左右可能不会有太大变化,甚至可能使速度变慢...)
如果您只是在测试文件系统已满的情况,那么fallocate就足够了。而且更快!例如
法洛卡特-l 150G
fallocate -l 150G foo
。不过,+ 1是提及该工具。
停止使用,seek
并使用非常大的bs
和/或count
。因为它是在制作稀疏文件,所以显然您不需要这样做。
如果要从字面上填充硬盘驱动器,请执行以下操作:
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:压缩较大的零文件并将其通过电子邮件发送给所有朋友。告诉他们这真的很酷。