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

Ben*_*rpc 48 linux ext4

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

fro*_*utz 80

据推测,您会看到一些“设备上没有剩余空间”错误:

# 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
Run Code Online (Sandbox Code Playgroud)

实际上,您比“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
Run Code Online (Sandbox Code Playgroud)

在此示例中,如果您的文件平均不是 4K 大小,那么您会比存储空间更快地耗尽 inode 空间。可以指定另一个比率(mke2fs -N number-of-inodes-i bytes-per-inode-T usage-type中定义的/etc/mke2fs.conf)。

  • @jamesqf 如果您还没有,请尝试在每个 git 存储库中运行 `git repack` 以将所有单独的对象组合成一个包文件。 (27认同)
  • +1 由于您只是使用`touch`,没有花哨的`echo`,因此您还展示了一个重要的观点和一个经常犯的误解:有可能用空文件填满磁盘。 (13认同)
  • @jamesqf `git repack` 没有丢失任何功能,它在功能上仍然是相同的 git repo,`tar` 使得它对于许多需要项目或 git 存储库的程序来说是不可读的 (6认同)
  • @ensuperpc:如果许多文件不经常使用 - 只是为了备份目的 - 您可以考虑将每个项目放在自己的 tar 文件中。如果您使用压缩选项,这会大大减少文件数量,以及占用的空间。 (5认同)

Ste*_*itt 52

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

在您描述的场景中,一旦达到限制,这通常会导致传输中止。