是否可以通过创建大量空文件来耗尽磁盘空间?


35

众所周知,空文本文件的字节数为零:

在此处输入图片说明

但是,它们每个都包含元数据,根据我的研究,该元数据存储在inode中,并且确实使用space

鉴于此,在我看来,可以通过纯粹创建空的文本文件来填充磁盘。它是否正确?如果是这样,我需要多少个空白文本文件来填充1GB的磁盘?


为了进行一些检查,我运行了,df -i但这显然显示了正在使用的inode的百分比(?),而不是它们的重量。

Filesystem             Inodes  IUsed    IFree IUse% Mounted on
udev                   947470    556   946914    1% /dev
tmpfs                  952593    805   951788    1% /run
/dev/sda2            28786688 667980 28118708    3% /
tmpfs                  952593     25   952568    1% /dev/shm
tmpfs                  952593      5   952588    1% /run/lock
tmpfs                  952593     16   952577    1% /sys/fs/cgroup
/dev/sda1                   0      0        0     - /boot/efi
tmpfs                  952593     25   952568    1% /run/user/1000
/home/lucho/.Private 28786688 667980 28118708    3% /home/lucho

Answers:


40

此输出建议28786688总体上使用inode,之后将再次尝试在根文件系统(device /dev/sda2)中创建文件ENOSPC(“设备上没有剩余空间”)。

说明:在原始的* nix文件系统设计中,在文件系统创建时设置了最大索引节点数。为它们分配了专用空间。数据空间不足之前,您可以先用完inode,反之亦然。最常见的默认Linux文件系统ext4仍然具有此限制。有关ext4上inode大小的信息,请参见mkfs.ext4的联机帮助页。

Linux支持其他文件系统,但没有此限制。在上btrfs,空间是动态分配的。“ inode结构相对较小,不会包含嵌入式文件数据或扩展属性数据。” (ext3 / 4 在inode内为扩展属性分配了一些空间)。当然,通过创建过多的元数据/目录条目,您仍然会用完磁盘空间。

考虑一下,tmpfs是动态分配inode的另一个示例。df -i在实践中,很难知道这些文件系统所报告的最大索引节点实际上意味着什么。我不会对显示的值赋予任何含义。


“ XFS还会动态分配索引节点。JFS也会这样做。reiserfs也是如此。F2FS也是。传统的Unix文件系统在mkfs时静态地分配索引节点,现代FS(例如ext4)也可以静态分配其索引,但是如今,例外,而不是规则。

“顺便说一句,XFS允许您设置inode所使用的最大空间百分比的限制,因此,在无法附加到现有文件之前,您可以用尽inode。(对于FS,默认值为25% 1TB下,5%的文件系统到50TB,用于产生大于1%)无论如何,对元数据(索引节点和程度映射)这个空间的使用将被反映在规则的。df -h“ - 彼得科尔德在此答案评论


那么,您是在说如果我创建28786688-667980=28118708空文件,实际上将耗尽inode并“破坏我的系统”?
luchonacho

1
XFS还动态分配inode。JFS也是如此。reiserfs也这样做。F2FS也是如此。传统的Unix文件系统在mkfs时静态分配inode,现代FS(例如ext4)也是如此,它们可以追溯其遗产,但是如今,这已成为例外,而不是常规。(除非您按已安装的基础加权,否则可以准确地说当前* nix系统上磁盘上的大多数文件系统都是静态分配的inode。)
Peter Cordes

顺便说一句,XFS允许您设置inode所使用的最大空间百分比的限制,因此,在无法附加到现有文件之前,您可以用尽inode。(对于小于1TB的FS,默认值为25%,对于最大容量为50TB的文件系统,默认值为5%,对于大于10TB的文件系统,默认值为1%。)无论如何,元数据(节点和范围图)上的空间使用情况将反映在常规df -h@luchonacho中。
彼得·科德斯

26

创建空文件涉及使用以下内容:

  • 索引节点,每个文件一个;
  • 其他目录条目,每个文件也包含一个,但已聚合。

可用索引节点的数量通常在创建文件系统时确定,并且无法更改(某些文件系统(例如Btrfs或XFS)动态分配索引节点)。这是由衡量的df -i。当索引节点用尽时,即使有可用磁盘空间,也无法创建新文件或目录。

目录条目也占用可用磁盘空间中的空间。通过查看目录的大小可以看到这一点:它总是块大小的倍数,并且当目录包含许多文件时,其大小会增大。如果磁盘空间不足,即使您有可用的inode ,也可能无法在“完整”目录(,在其中添加新文件将涉及分配新块)的目录中创建新文件或目录。

所以可以,仅使用空文件就有可能用完磁盘空间。


因此,我需要创建足够的空文件来达到100%使用inode的目的?
luchonacho

@luchonacho是的,每个inode有效地有一个空文件。
史蒂芬·基特

还要注意扩展属性,这些属性可以在上面添加空间。例如,如果目录中有许多默认ACL,则在其中创建文件将需要空间来存储这些ACL。
斯特凡Chazelas

好的,我纠正了。问题是,浏览器上的渲染字体和固定宽度字体对我来说都很奇怪。出于好奇,您如何插入它们?您的键盘上的那个键和U + 0022上的键是否不同?
斯特凡Chazelas

谢谢,出于好奇,我检查了它们是否在我的英国键盘布局上,以及确实在AltGr + Shift + V / B上(双引号而不移位)。我会坚持使用U + 0022。
斯特凡Chazelas

7

纯逻辑参数:

文件名由非零字节组成。即使在设计为允许绝对最大数量的文件名的假设文件系统中进行理论上的最大压缩,每个文件名仍将在物理磁盘上的某处消耗至少一位。可能更多,但是“每个文件1位”是最小的最小值。

计算可能适合盘片的位数,这是理论上可以存储的(空或非空)文件的最大数量。

因此,答案是肯定的。最终,如果您继续添加空文件,无论使用什么存储空间,都将用完空间。显然,用尽的时间比用这种方式计算出的最大值要快得多,但是用尽了。


0

完全没有,但是您可以用完Linux上的inode,这与空间用完一样。

你可以在shell中尝试这样的事情 n=0; while :; do touch $n; let n=n+1; done

只需确保在虚拟机中运行它,否则您将很快失去inode。


该命令在做什么?
luchonacho

它从真正的无限循环开始,每次循环都会创建一个文件名,该文件名是一个从0到1 2 3的整数...它将最终创建足够的文件以使用文件系统的所有inode。
in1t3r

1
如果在/ home分区上运行该命令(如果它是独立的),则/分区将不会有问题,只是无法再写入/ home分区。我的建议是在其中找到一个名为inodetest cd的目录,然后在看到无法再在文件系统中创建文件的错误后运行命令,按ctrl + C并运行rm -fr inodetest以清除所有这些空文件,然后再次正常工作。:)
in1t3r

0

您无法通过制作空文件来填充磁盘-磁盘仍将有足够的空间容纳新文件。但是,是的,您可能会耗尽文件系统的免费inode数量,这时您无法创建新文件(即使磁盘-占用的空间已经很大-几乎是空的)。只是所有已使用的文件系统的inode列表,而不是磁盘...因此文件系统已满,而磁盘实际上是空的。索引节点表使用磁盘上的空间,但添加文件时表不会增长-就像在行上书写时纸不会增长一样。

(Baard Kopperud的回答)


不确定我们是否需要另一个回答说同样的事情
杰夫·谢勒
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.