Назад | Перейти на главную страницу

Почему дистрибутивы Linux по умолчанию не монтируют tmpfs с бесконечным числом inode?

В соответствии с этот ответ можно смонтировать хотя бы tmpfs с "бесконечными" inode.

Рассмотрим эту конкретную (числа, выбранные для примера, я знаю, что они нереалистичны):

Это означает, что tmpfs заполнен на 50%, но также что любая попытка записи в него приведет к ошибке нехватки места.

Мне кажется, что настройка nr_inodes=0 (иначе говоря, бесконечные inodes) устранят эту ситуацию.

Обычно (например: ext2, ext3, ext4, ufs), количество inodes, которое может содержать файловая система, устанавливается во время создания, поэтому никакая опция монтирования не может его обойти.

Некоторые файловые системы, такие как xfs иметь настраиваемое соотношение пространства, используемого inodes, чтобы его можно было увеличить в любой момент.

Современные файловые системы, такие как ZFS или btrfs не имеют жестко заданных ограничений на количество файлов, которые файловая система может хранить, inodes (или их эквиваленты) создаются по запросу.


Изменить: сужение ответа на обновленный вопрос.

С участием tmpfs, количество индексных дескрипторов по умолчанию рассчитывается таким образом, чтобы оно было достаточно большим для большинства реальных случаев использования. Единственная ситуация, в которой этот параметр не был бы оптимальным, - это создание большого количества пустых файлов на tmpfs. В таком случае лучше всего отрегулировать nr_inodes параметр на значение, достаточно большое, чтобы все файлы могли поместиться, но не использовать 0 (= без ограничений). tmpfs документация заявляет, что это не должно быть настройкой по умолчанию из-за риска исчерпания памяти пользователями без полномочий root:

if nr_inodes=0, inodes will not be limited.  It is generally unwise to
mount with such options, since it allows any user with write access to
use up all the memory on the machine; but enhances the scalability of
that instance in a system with many cpus making intensive use of it.

Однако неясно, как это могло произойти, учитывая тот факт, что tmpfs Использование ОЗУ по умолчанию ограничено 50% ОЗУ:

size:      The limit of allocated bytes for this tmpfs instance. The 
           default is half of your physical RAM without swap. If you
           oversize your tmpfs instances the machine will deadlock
           since the OOM handler will not be able to free that memory.

Многих больше беспокоит объем памяти по умолчанию, соответствующий тому, что требуется их приложению.

Потребление памяти для inodes tmpfs не учитывается в выделенных блоках монтирования. Не может быть использования tmpfs, которое "90% индексных дескрипторов", учитываются только «реальные» данные.

Монтирование tmpfs любого размера будет оставаться «пустым», пока ни один из его файлов не содержит байтов. Общее потребление памяти для поддержки монтирования может значительно превышать любой предел размера.

$ find /mnt | wc -l
60000
$ df -h /mnt
Filesystem Size Used Avail Use% Mounted on
tmpfs      4.0K    0  4.0K   0% /mnt

Поэтому, чтобы предотвратить истощение памяти, обе size= и nr_inodes= должны быть ограничены. Если по умолчанию установлен очень большой лимит индексных узлов или его нет, неконтролируемый процесс может остановить работу системы, не сделав легко определяемым источник проблемы.

Как сказал Мэдхаттер, inodes занимают некоторое пространство, и это нетривиальное количество, если говорить об использовании бесконечного количества из них.