Почему ядро ​​Linux сообщает о «нехватке места на диске», когда на самом деле оно выходит за пределы i-узлов

10

Мой друг, который любит программировать в среде Linux, но мало знает об администрировании Linux, недавно столкнулся с проблемой, когда его ОС (Ubuntu) сообщала о «нехватке дискового пространства на томе XXX». Но когда он пошел проверить громкость, осталось еще 700 ГБ. Через много времени он смог сообразить, что у него нет иноды. (Он хранил множество небольших инкрементальных обновлений из системы резервного копирования на этом томе и записывал все свои иноды.)

Он спросил меня, почему ядро ​​Linux сообщило об ошибке («недостаточно места на диске»), а не правильно сообщило («отсутствует inodes»). Я не знал, поэтому я решил спросить StackExchange.

Кто-нибудь знает, почему это происходит? и почему это не было исправлено после всех этих лет? (Я помню другого друга, который рассказывал мне об этой проблеме в 1995 году.)

кренделек
источник

Ответы:

18

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

Для поддержания соответствия с ISO Cи POSIXстандартами, разработчики ядра не имеют никакого выбора , кроме как использовать один номер ошибки для обоих событий. Добавление нового номера ошибки может привести к поломке существующих программ.

Однако, поскольку придерживаться традиционных сообщений об ошибках не является обязательным AFAIK, ничто не должно запрещать разработчику делать одно сообщение более понятным, как, например, out of disk/inode space

Технически, вне зависимости от того, находится ли пространство inode или out of space, одно и то же, то есть это означает, что для успешного выполнения системного вызова недостаточно места на диске.

Я полагаю, вы не будете жаловаться, если ваш диск будет заполнен, пока есть свободные слоты inode.

Обратите внимание , что файловые системы , такие как JFS, XFS, ZFSи btrfsвыделить дескрипторы динамически , так делать не обладают только этим вопросом больше.

jlliagre
источник
Последние файловые системы включают ext4?
Камило Мартин
@CamiloMartin Я не думаю, что это так.
Jlliagre
@CamiloMartin К сожалению, нет, ext4выделяет inode во время создания fs, например ext2 / 3, и не может быть изменен позже.
Мэтт
@mindthemonkey Черт! Наверное, это что-то вроде обратной совместимости. Какая другая файловая система имеет хорошие функции, но достаточно стабильна (стабильна ли btrfs)? ext4, кажется, является своего рода «выбором по умолчанию» (по крайней мере, с моей точки зрения новичка).
Камило Мартин
1
Да, дополнения всегда были расширениями предыдущей версии и были обратно совместимы, поэтому никаких серьезных изменений не произошло, но это означает, что они остались достаточно надежными и стабильными Я лично делаю все мои большие объемы хранения на коробках freebsd с ZFS. BTRFS по-прежнему считается «нестабильной», хотя большинство дистрибутивов, по крайней мере, позволит вам ее использовать.
Мэтт
2

Я предполагаю, что ваш друг использует ext fs, потому что это один из немногих разумных f, которые могут исчерпать inode.

Похоже, ваш друг либо возился со своей файловой системой и сломал ее, либо имеет смехотворно большой объем в несколько ТБ. Иноды - это не одноразовая вещь. Если у него действительно закончились inode-ы, это означает, что у него смехотворно много файлов и каталогов ... что может произойти на томе объемом более 4 ТБ, где «только» 700 ГБ свободно. Для семейства ext fs число inode определяется при создании fs. Со mkfs.ext4страницы руководства :

-i bytes-per-inode
          Specify  the  bytes/inode ratio.  mke2fs creates an inode for every bytes-per-inode
          bytes of space on the disk.  The larger the bytes-per-inode ratio, the fewer inodes
          will  be  created.  This value generally shouldn't be smaller than the blocksize of
          the filesystem, since in that case more inodes would be made than can ever be used.
          Be  warned  that  it is not possible to expand the number of inodes on a filesystem
          after it is created, so be careful deciding the correct value for this parameter.

Чтобы сократить оставшуюся часть этого ответа: это средство mkfsлибо обеспечено таким соотношением, либо оно примет одно. Если ваш друг использует fs не так, как предполагалось, выбранное соотношение может быть неправильным для его варианта использования, и он получает эту ошибку ... заполнение одного тома объемом в несколько ТБ тоннами небольших файлов может считаться таковым.

Использует ли ваш друг какую-либо рабочую среду, которая реализует концепцию «мусорной корзины» для файлов или любых других форм резервных копий, которые могут создавать большие объемы файлов? Возможно, он сможет решить свою проблему, просто избавившись от ненужных файлов.

Я помню эту проблему с ext2 примерно с того времени, когда ядро ​​2.4 было довольно новым. Как правило, я всегда использую XFS для томов, которые очень большие по сравнению с тем, что в настоящее время распространено. В настоящее время я бы назвал все между 250 ГБ до 1 ТБ общим для одного тома, и мы можем купить 4 ТБ жестких дисков. Так что для всего> 3TB я бы лучше использовал XFS, чем ext. Просто эмпирическое правило, но иноды давно не закончились ...

Bananguin
источник
1
Боюсь, вы не отвечаете на заданный вопрос.
Jlliagre
Правда. Я пытался ответить на первый встроенный вопрос, который я задал «Кто-нибудь знает, почему это происходит?», Но не тот, который указан в заголовке.
Bananguin
Правильно. Мой друг знает, что случилось. Он создавал какую-то систему резервного копирования, где она хранила инкрементные изменения в несжатом виде (и не в формате TAR), чтобы все эти крошечные файлы занимали место. Я не думаю, что у него когда-либо была такая большая ФС, поэтому отсутствие инодов было для него чем-то новым. Ergo, он был расстроен, когда набрал «df -h» и подумал: «Да, у меня еще есть тонна свободного места» - честно говоря, я согласен с ним. То, что ядро ​​говорит «из космоса», когда на самом деле должно быть отдельное сообщение «из inode», очень запутанно.
Крендель
@Bananguin - Знаете ли вы, каково соотношение байт / индекс по умолчанию?
Крендель
@Pretzel: Думаю, я помню, что по умолчанию для каждого 4k используется один инод. Я только что проверил свой компьютер ( tune2fs -l /dev/sda1), и я получаю соотношение 1 инод на каждые четыре блока, и каждый блок имеет размер 1 КБ. Насколько это можно считать «дефолтом», однако я не знаю.
Bananguin