我正在对一段代码进行一些测试,我想用数据填充硬盘驱动器。我发现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)
您已经创建了所谓的“稀疏文件”——一个文件,因为它的大部分是空的(即读回为 \0),除了实际写入的内容(1B,在 10GB 之后)不占用磁盘空间间隙)。
我不相信你可以制作巨大的文件,瞬间占用实际的磁盘空间 - 占用物理空间意味着文件系统需要为你的文件分配磁盘块。
我认为您坚持使用老式的“dd if=/dev/zero of=filename bs=100M count=100”,这受到驱动器顺序写入速度的限制。
小智 6
如果您只是测试文件系统已满的情况,那么 fallocate 可能就足够了。而且速度也更快!例如
fallocate -l 150G