如果ext4分区中超过40亿个文件限制,会发生什么情况?


46

如果在ext4分区中超过了40亿个文件的限制,例如传输了50亿个文件,会发生什么情况?

Answers:


79

大概,您会看到“设备上没有剩余空间”错误的味道:

# truncate -s 100M foobar.img
# mkfs.ext4 foobar.img
Creating filesystem with 102400 1k blocks and 25688 inodes
---> number of inodes determined at mkfs time ^^^^^
# mount -o loop foobar.img loop/
# touch loop/{1..25688}
touch: cannot touch 'loop/25678': No space left on device
touch: cannot touch 'loop/25679': No space left on device
touch: cannot touch 'loop/25680': No space left on device

实际上,您达到此限制的时间比“ 40亿个文件”要早得多。两者都检查您的文件系统,df -hdf -i找出剩余的空间。

# df -h loop/
Filesystem      Size  Used Avail Use% Mounted on
/dev/loop0       93M  2.1M   84M   3% /dev/shm/loop
# df -i loop/
Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/loop0      25688 25688     0  100% /dev/shm/loop

在此示例中,如果平均文件大小不是4K,则inode空间用完的时间比存储空间快得多。这是可能的,以指定另一比率(mke2fs -N number-of-inodes-i bytes-per-inode-T usage-type如所定义/etc/mke2fs.conf)。


1
谢谢您的回答,有时候我很担心,我的主分区(RAID 50)中有超过4亿个文件,我有很多git信息库,如果
要这样做

5
@ensuperpc:如果很多文件不经常使用-只是出于备份目的-您可以考虑将每个项目放在其自己的tar文件中。如果您使用压缩选项,那将大大减少文件数量,并减少占用的空间。
jamesqf

27
@jamesqf(如果尚未使用),请尝试git repack在每个git存储库中运行,以将所有单独的对象组合成一个包文件。
user253751

13
+1因为您只是在使用touch,没有什么花哨的地方echo,所以您还显示了一个要点和一个经常引起的误解:可以用空文件填充磁盘。
rexkogitans

6
@jamesqf git repack不会释放任何功能,它在功能上仍然是相同的git repo,tar使得它对于期望有项目或git存储库的许多程序不可读
Ferrybig

52

一旦达到限制,后续创建文件的尝试将以失败ENOSPC,表明目标文件系统没有空间容纳新文件。

在您描述的情况下,一旦达到限制,通常会导致传输中止。

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.