众所周知,空文本文件的字节数为零:
然而,它们每一个都包含元数据,根据我的研究,它存储在索引节点, 和确实利用空间。
鉴于此,对我来说,通过纯粹创建空文本文件来填充磁盘是可能的,这似乎是合乎逻辑的。它是否正确?如果是这样,我需要多少个空文本文件来填充一块 1GB 的磁盘?
为了进行一些检查,我运行了df -i
但这显然显示了正在使用的索引节点的百分比(?)而不是它们的重量。
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
答案1
此输出建议28786688
总体索引节点,之后下次尝试在根文件系统(设备/dev/sda2
)中创建文件将返回ENOSPC
(“设备上没有剩余空间”)。
说明:在原始的 *nix 文件系统设计中,最大 inode 数量是在文件系统创建时设置的。为他们分配了专用空间。在用完数据空间之前,您可能会用完 inode,反之亦然。最常见的默认 Linux 文件系统ext4
仍然存在此限制。有关 ext4 上 inode 大小的信息,请参阅 mkfs.ext4 的联机帮助页。
Linux 支持其他文件系统而没有此限制。在 上btrfs
,空间是动态分配的。 “inode结构相对较小,并且不会包含嵌入的文件数据或扩展属性数据。” (外部3/4在索引节点内为扩展属性分配一些空间)。当然,您仍然可能因创建过多的元数据/目录条目而耗尽磁盘空间。
想想看,tmpfs 是动态分配 inode 的另一个例子。很难知道所报告的最大索引节点数df -i
在实践中对于这些文件系统意味着什么。我不会对显示的值赋予任何意义。
“XFS 也动态分配 inode。JFS 也是如此。reiserfs 也是如此。F2FS 也是如此。传统的 Unix 文件系统在 mkfs 时静态分配 inode,像 ext4 这样的现代 FS 也是如此,它们的传统可以追溯到它,但现在情况已经是这样了。例外,而不是规则。
“顺便说一句,XFS 确实允许您对 inode 使用的最大空间百分比设置限制,因此您可以在无法追加到现有文件之前用完 inode。(对于 FS,默认值为 25%) 1TB以下,50TB以下的文件系统为5%,大于50TB的文件系统为1%。)无论如何,元数据(索引节点和范围映射)上的空间使用情况将反映在常规df -h
“ –彼得·科德斯在对此答案的评论中
答案2
创建空文件涉及使用以下内容:
- inode,每个文件一个;
- 附加目录条目,也是每个文件一个,但已聚合。
可用 inode 的数量通常在创建文件系统时确定,并且无法更改(某些文件系统(例如 Btrfs 或 XFS)动态分配 inode )。这就是用 来衡量的df -i
。当索引节点用完时,即使有可用磁盘空间,也无法创建新文件或目录。
目录条目也会占用可用磁盘空间中的空间。您可以通过查看目录的大小来看到这一点:它始终是块大小的倍数,并且当目录包含大量文件时,其大小会增加。如果磁盘空间不足,您可能无法在“已满”的目录中创建新文件或目录(IE,其中添加新文件将涉及分配新块),即使您有可用的索引节点。
所以,是的,仅使用空文件可能会耗尽磁盘空间。
答案3
纯逻辑论证:
文件名由非零字节数组成。即使在假设的文件系统中采用理论最大压缩(设计为允许绝对最大数量的文件名),每个文件名仍将消耗至少一位某处在您的物理磁盘上。可能更多,但“每个文件 1 位”是最低限度。
计算您的盘片上可能容纳的位数,这是理论上您可以在其上存储的最大文件数(空或非空)。
所以,答案是肯定的。如果您不断添加空文件,最终,无论您使用什么存储,您都会耗尽空间。显然,你会比以这种方式计算的最大值更快地用完,但你会用完的。
答案4
您无法通过创建空文件来填满磁盘 - 磁盘仍然有足够的空间用于新文件。但是,是的,您可以耗尽文件系统有限的可用 inode 供应 - 此时您无法创建新文件(即使您的磁盘 - 就已使用的空间而言 - 实际上是空的)。这只是文件系统的索引节点列表已全部使用,而不是磁盘......因此文件系统已满,而磁盘实际上是空的。索引节点表使用磁盘上的空间,但当您添加文件时,该表不会增长 - 就像在一张纸上书写时不会增长一样。
(Baard Kopperud 在评论中的回答)