Закончилось место на диске? Или же закончились inode?

Опубликовано 25 авг. 2025 г.
Автор: clovus

Ситуация неприятная и чаще всего выходом служит удаление «ненужных» файлов. Рассмотрим ситуацию, когда все файлы нужны, то есть удалять ничего не будем.

В качестве примера, смоделируем ситуацию, когда в файловой системе закончились inode.

ЧИТАТЬ ПЕРВЫМ В ТЕЛЕГРАМ

Создадим файловую систему с небольшим количеством inode на виртуальном блочном устройстве, позаимствовав немного места с реальной файловой системы:

dd if=/dev/zero of=/home/user/fs.img count=1000 bs=4096K
mkfs.ext4 -N 512 /home/user/fs.img

Монтируем файловую систему:

mkdir newfs
mount /home/user/fs.img newfs/

Забиваем ее до отказа файлами:

touch file{1..501}

Проверяем:

df -i newfs

Вывод:

[root@14 ~] df -i newfs/

/dev/loop6 512 512 0 100% /root/newfs

Все, создавать новые файлы нельзя. Если сильно надо, выход есть. Понадобится свободное место, с файловой системой ext4.

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

dd if=/dev/zero of=/home/user/newfs.img count=1500 bs=4096K
mkfs.ext4  /home/user/newfs.img
mount /home/user/newfs.img freespacefs
mkdir -p freespacefs/{up,service}

Теперь главное:

mount -t overlay overlay -olowerdir=newfs,upperdir=freespacefs/up,workdir=freespacefs/service newfs

Здесь монтируется специальная файловая система overlayfs.

Аргументы:

lowerdir - директория, которую расширяем. Может быть любой файловой системой, может быть смонтирована только на чтение. В терминологии overlayfs - нижний слой.

upperdir - директория на файловой системе с поддержкой d-type (например, ext4).

В терминологии overlayfs верхний слой. В эту папку реально будут попадать результаты деятельности (новые файлы например) workdir- служебная директория, нужна для работы overlayfs. Должна находится на той же файловой системе, что и upperdir.

Проверяем:

[root@14 ~] df -i newfs

overlay 376K 16 376K1% /root/newfs

занято 1 % inode.

[root@14 ~] df -i newfs
[root@14 ~] touch newfs/extrafile
[root@14 ~] ls newfs/
extrafile  file125  file152  file1.....

(вывод обрезан, здесь 501 файл)

Теперь посмотрим в up:

[root@14 ~] ls freespacefs/up
extrafile

Вариант для экстремалов (можно задействовать оперативную память, если свободного места нет совсем):

[root@14 ~] mkdir ramfs
[root@14 ~] mount -t tmpfs tmpfs -osize=4G ramfs
[root@14 ~] mkdir ramfs/{up,work}
[root@14 ~] mount -t overlay overlay -\ olowerdir=newfs,upperdir=ramfs/up,workdir=ramfs/work  newfs
[root@14 ~] df -h newfs/

overlay 7,8G 8,7M 7,8G 1% /root/newfs

Фактически, это tmpfs, которая располагается в оперативной памяти, и стоит об этом помнить.

Теперь пара слов про overlayfs.

Функционал реализован модулем ядра, который, возможно, нужно включить:

[root@14 tmp] lsmod | grep overlay

Если вывод пустой, то:

[root@14 tmp] modprobe overlay

Как видно из вышесказанного, особенность этой файловой системы - она работает с директориями а не с устройствами.

На этом все. Выражаю благодарность за идею статьи @AlexeyVictorovi4

Комментарии