如何立即填满/使用大量磁盘空间?


45

在Linux VM上,我想更深入地测试NAGIOS监视,而不仅仅是关闭VM或断开虚拟NIC的连接。我想通过在短时间内占据百分之几的可用空间来测试或“强制执行磁盘空间警报”。

我知道我可以使用

dd if=/dev/zero of=/tmp/hd-fillup.zeros bs=1G count=50

或类似的东西...但这会花费时间并加载系统,并且在使用rm删除测试文件时需要再次的时间。

是否有一种快速(几乎即时)的方法来填充不会导致系统负载大且需要大量时间的分区?我正在思考分配空间但不会“填充”空间的东西。


抱歉,忘记提及它的>> ext3文件系统。
Axel Werner

您需要将其升级到ext4以支持fallocate。
Rui F Ribeiro

1
拉链炸弹始终有效
galois

1
@jaska回答一下。这是我读标题时的第一个主意...
Crowley

你为什么不使用/dev/full?(假设它存在)。尝试echo 'test' > /dev/full使用Debian。
伊斯梅尔·米格尔

Answers:


63

在Linux系统中创建文件的最快方法是使用fallocate

fallocate -l 50G file 

来自人:

fallocate用于操纵为文件分配的磁盘空间,以取消分配或预分配文件。
对于支持fallocate系统调用的文件系统,可通过分配块并将其标记为未初始化来快速完成预分配,而无需对数据块进行任何IO操作。这比通过用零填充文件来创建文件要快得多。
支持XFS(自Linux 2.6.38起),ext4(自Linux 3.0起),Btrfs(自Linux 3.7起)和tmpfs(自Linux 3.5起)。


1
为什么要运行它sudo
杰里特

1
@gerrit在答案中添加了这一点。
Rui F Ribeiro

3
fallocate需要root特权”不在我的系统上(Linux Mint 17.3,Ubuntu的下游,因此是Debian)。(ext4文件系统)
TJ Crowder

1
+1尽管OP明确提到他的文件系统是ext3。
syneticon-dj

1
@RuiFRibeiro,谢谢!因为sles11sp4 ive能够创建文件,使用ext4对其进行格式化,但是无法在RW模式下挂载它。后来我在/ var / log / messages中发现了一条内核消息,说ext4仅以只读方式受支持。:/
Axel Werner

13

其他替代方案包括:

  1. 将警报阈值更改为接近或低于当前使用量,或
  2. 创建一个具有有限的inode,大小或其他属性的非常小的测试分区。

能够测试诸如达到根保留百分比(如果有的话)之类的东西可能也很方便。


除非您进行调整,否则根保留百分比通常为10%-这样做会导致在大分区/现代磁盘中浪费过多的系统资源。在定义警报时,最好已经将其考虑在内。
Rui F Ribeiro

+1为第一件事。一百次正确。为什么我该在机器磁盘上实际创建东西呢?如果在我进行测试时发生了什么事情(例如coredump,批处理作业,生成大的临时文件,...),并且整个磁盘被意外吞噬了怎么办?
Fiisch

2
@Fisch-为什么?为了确保您的警报阈值正确无误,并且您没有在做类似意外设置inode可用百分比而不是磁盘空间可用百分比(我之前已经看过)的事情。如果由于您已将磁盘装满而达到警报阈值而导致某些故障,则警报阈值太低-警报的全部意义在于,它应该事情开始破裂之前就向您发出警报。
约翰尼

猫,好点。但是对我来说没有解决办法。我没有控制VM配置(不能更改分区或虚拟磁盘),也没有控制NAGIOS服务器。
Axel Werner

2
@AxelWerner可以将文件作为“假”分区进行回送吗?那仍然可以让您进行测试而不会严重影响任何事情。使用受支持的文件系统之一对其进行格式化,然后您也可以使用fallocate。
托尼

9
  1. fallocate -l 50G big_file

  2. truncate -s 50G big_file

  3. dd of=bigfile bs=1 seek=50G count=0

由于这三种方式都可以快速填充分区。

如果您喜欢使用dd,通常可以尝试使用seek。刚设置seek=file_size_what_you_needcount=0。这将告诉系统有一个文件文件大小是您设置的大小,但是系统实际上不会创建它。并以这种方式使用,您可以创建一个大于分区大小的文件。


例如,在可用的少于3G 的ext4分区上。使用dd创建一个5T文件,该文件作为元数据存在-几乎不需要块空间。

df -h . ; dd of=biggerfile bs=1 seek=5000G count=0 ; ls -log biggerfile ; df -h .

输出:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda9        42G   37G  2.8G  94% /home
0+0 records in
0+0 records out
0 bytes copied, 4.9296e-05 s, 0.0 kB/s
-rw-rw-r-- 1 5368709120000 Jun 29 13:13 biggerfile
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda9        42G   37G  2.8G  94% /home

1
您可以在答案中添加更多信息吗?

对于那些以其他方式搜索相同问题的人,我只想在完成的问题中添加更多思考。忽略它,如果不是。
2016年

count=0方法非常有趣,我添加了一个示例。
agc

7
请注意,dd上面的示例可能会分配一个稀疏文件。在这种情况下,文件大小为50G,实际上它仅使用一个块(甚至不使用),因此磁盘未满。YMMV。
MAP

2
我在ext3文件系统上测试了您的建议。它没有按预期工作。truncate和dd确实创建了一个具有大文件大小的文件,但是“ df -h”无法识别它。仍然显示相同的可用高清空间。
Axel Werner

0

您还可以利用许多基于Linux的系统所支持的Stress-ng工具:

stress-ng --fallocate 4 --fallocate-bytes 70% --timeout 1m --metrics --verify --times
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.