Что произойдет, если в разделе ext4 было превышено ограничение в 4 миллиарда файлов?

46

Что произойдет, если в разделе ext4 было превышено ограничение в 4 миллиарда файлов, например, при передаче 5 миллиардов файлов?

Bensuperpc
источник

Ответы:

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

И на практике вы достигаете этого предела намного раньше, чем «4 миллиарда файлов». Проверьте ваши файловые системы с обоими df -hи df -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

В этом примере, если ваши файлы в среднем не имеют размера 4 КБ, у вас заканчивается пространство inode намного раньше, чем пространство хранения. Можно указать другое соотношение ( mke2fs -N number-of-inodesили -i bytes-per-inodeили -T usage-typeкак определено в /etc/mke2fs.conf).

frostschutz
источник
1
Спасибо за ваш ответ, иногда я волнуюсь, у меня более 400 миллионов файлов в моем основном разделе (RAID 50), у меня есть много репозитория git, это было для безопасности, если это произойдет
Bensuperpc
5
@ensuperpc: Если многие файлы не используются регулярно - просто для целей резервного копирования - вы можете рассмотреть возможность размещения каждого проекта в отдельном tar-файле. Это значительно уменьшает количество файлов, а также пространство, занимаемое при использовании параметра сжатия.
jamesqf
27
@jamesqf Если вы еще этого не сделали, попробуйте запустить git repackв каждом репозитории git, чтобы объединить все отдельные объекты в файл пакета.
user253751
13
+1 Так как вы просто используете touch, ничего особенного echo, вы также показываете важный момент и часто ошибочное представление: возможно заполнить диск пустыми файлами.
Рекскогитанс
6
@jamesqf git repackне теряет никакой функциональности, он все еще функционально тот же git-репо, tarделает его нечитаемым для многих программ, ожидающих проекта или git-репозитория
Ferrybig
52

Как только предел достигнут, последующие попытки создания файлов будут неудачными ENOSPC, указывая, что в целевой файловой системе нет места для новых файлов.

В описываемом вами сценарии это обычно приводит к прерыванию передачи после достижения предела.

Стивен Китт
источник