Как я могу увеличить количество инодов в файловой системе ext4?

61

У меня была проблема (новая для меня) на прошлой неделе. У меня есть файловая система ext4 (Fedora 15). Приложение, которое запускается на сервере, внезапно остановилось. Я не мог найти проблему с первого взгляда.

dfпоказал 50% доступного пространства. После поисков около часа я увидел сообщение на форуме, где парень использовал df -i. Опция ищет использование inode. В системе не было inode, простая проблема, которую я не осознавал. В разделе было только 3.2M inode.

Теперь мои вопросы: Могу ли я сделать так, чтобы в системе было больше инодов? Должен / может ли он быть установлен при форматировании диска? Сколько у меня может быть файлов с инодами 3.2M?

piovisqui
источник
1
Каждый файл или каталог использует один индекс. Жесткая ссылка на файл не создает индекс. ru.wikipedia.org/wiki/Inode
Пол Томблин,

Ответы:

33

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

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

Чтобы создать новую файловую систему с такой огромной таблицей inode, вам нужно использовать опцию '-N' в mke2fs (8).

Я бы рекомендовал сначала использовать опцию -n (которая не создает fs, но отображает полезную информацию), чтобы вы могли получить приблизительное число inode. Затем, если вам нужно, используйте «-N» для создания вашей файловой системы с определенными номерами инодов.

cinsk
источник
11
Вы можете использовать, mke2fs -iчтобы указать количество inode. Его документация указывает, что «невозможно увеличить число inode в файловой системе после ее создания».
Жиль "ТАК - перестань быть злым"
2
@piovisqui: каждый файл использует inode, который является указателем в файловой системе. если файл является жесткой ссылкой на другой файл, он имеет тот же индекс.
Ханан Н.
6
@Gilles В -iпараметрах указывается размер индекса , а не его количество. -NОпция задает номер дескрипторы.
theillien
1
Соотношение между индексами и номерами файлов не обязательно 1: 1. Первый индекс содержит список указателей на блоки, в которых хранится файл. Если список блоков не может уместиться в пределах одного inode, тогда inode содержит список указателей на inode, которые перечисляют блоки, в которых хранится файл. Если он там не помещается, то для этого списка блоков используется 3 набора
инодов
2
@StuWhitby Это не совсем верно. Один индекс имеет несколько прямых указателей и один, двойной и тройной косвенный указатель. Если список блоков не может поместиться в прямых указателях, то единственный косвенный указатель будет указывать на блок данных (НЕ на другой индекс), который содержит больше указателей. Если требуется больше указателей, чем это необходимо, двойной косвенный указатель указывает на блок, который содержит одиночные косвенные указатели, а тройной косвенный указатель - на блок с двойными косвенными указателями. Таким образом, файл фактически использует только один индекс, независимо от его размера.
user125355
11

В качестве другого обходного пути я мог бы предложить упаковывать огромные коллекции файлов в несжатый (!) tarАрхив, а затем использовать его archivemountдля монтирования в качестве файловой системы. Архив tar лучше подходит для общего доступа, чем образ файловой системы, и обеспечивает аналогичную производительность при резервном копировании в облако или другое хранилище.


Если предполагается, что коллекция доступна только для чтения, это squashfsможет быть опция, но она требует определенных опций, включенных в ядре, и xzсжатие доступно и для tar с такой же производительностью.

tijagi
источник
2
Хорошее предложение.
piovisqui
11

С 3,2 миллионами inode вы можете иметь 3,2 миллиона файлов и каталогов, всего (но несколько жестких ссылок на файл используют только один inode).

Да, это можно установить при создании файловой системы на разделе. Опции -T usage-type, -N number-of-inodesили -i bytes-per-inodeвсе могут установить количество inode. Я обычно использую -i, после сравнения выходных данных du -sи find | wc -lдля аналогичной коллекции файлов и учитывая некоторую слабость.

Нет, его нельзя изменить на месте в существующей файловой системе. Тем не мение:

  • Если вы используете LVM или файловая система находится на LUN SAN (либо непосредственно на LUN, либо в качестве последнего раздела на LUN), либо у вас есть свободное место на диске после раздела, вы можете увеличить раздел, а затем использовать resize2fsдля расширения файловой системы. Это добавляет больше inode пропорционально добавленному пространству, примерно. Если вы хотите избежать исчерпания inode-ов перед пространством, предполагая, что будущие файлы в среднем имеют примерно одинаковый размер, установите достаточно высокий процент зарезервированных блоков, используя tune2fs -m.
  • Если у вас достаточно места и вы можете перевести файловую систему в автономный режим, переведите ее в автономный режим, создайте новую файловую систему с большим количеством инодов и скопируйте все файлы.
  • Если только небольшая часть файлов использует много inode, и у вас достаточно свободного места, создайте файловую систему на устройстве цикла с поддержкой файла в файловой системе, создайте файловую систему с большим количеством inode (и, возможно, меньших блоков) на него, и переместите в него оскорбительные каталоги. Это, вероятно, удар по производительности и техническое обслуживание, но это альтернатива.
  • И, конечно, если вы можете удалить много ненужных файлов, это тоже должно помочь.
Дэвид
источник
6

У меня есть альтернативные решения для этой ситуации. Допустим, у вас есть 1000 inode в разделе 10G. Но из-за ограничения inode вы не должны использовать все пространство раздела . Но в этих решениях вы сможете использовать оставшееся пространство раздела без его форматирования .

$ df -i  # see list ( I need just one free inode here so move just one file into other PARTITION)
/dev/part1  1000 999 1 99.9%     /data

$ dd if=/dev/zero of=/data/new_data
$ mkfs.ext4 /data/new_data
$ mkdir /data1
$ mount /data/new_data /data1

для постоянного монтажа

$ echo "/data/new_data /data1 ext4 defaults 0 1" >> /etc/fstab
Санджит
источник
2
Добро пожаловать в U & L. Я позволил себе переформатировать ваш ответ для более обычного представления кода здесь, вставив подсказку ( $), чтобы четко различать команды и выходные данные (если они были только командой, подсказка обычно пропускается). Я также изменил SHOUTING в выделении жирным шрифтом, что, как я думаю, вы и хотели. Вы можете откатить изменения, если я исказил вещи
Anthon
Я думаю, что это решение имеет логику, но вам нужно управлять размером при запуске dd.
piovisqui
3
Детали неверны, вам нужно было бы использовать петлевое устройство, и, возможно, даже unionfs, в зависимости от приложения, но это единственное решение, позволяющее избежать форматирования и восстановления из резервной копии, что бесполезно, если вы спешите с миллионами файлов. Есть обстоятельства, когда это может спасти день!
Медок
6

Недавно столкнулся с этой проблемой при использовании apt или aptitude upgrade.

df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  5.1G  2.3G  70% /

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 521497   2791  100% /

Выданная команда:

du /|sort -k1 -n

Выявлено, что большинство файлов были в подпапках для нескольких версий ядра:

/usr/src/linux-headers

Удалил эти подпапки и проблема с inode была исправлена.

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 104986 419302   21% /
kph0x1
источник
"du / | sort -k1 -n" показывает иноды?
Сироты
Нет. Это было для сортировки каталогов, показывающих, в каких из них было больше всего файлов, папок, которые потребляли много inode, но меньше фактического использования пространства: ситуация с 30% свободного места на диске и 100% использованием inode, показанная выше.
kph0x1
Я, честно говоря, не понимаю, как "du" показывает, сколько файлов с любым флагом? Не могли бы вы объяснить подробнее?
Сироты
Нет флагов для duкоманды. Использование для корня файловой системы в приведенном выше примере, глядя только на пространство. Выходные данные передаются по конвейеру, чтобы показать, какие каталоги содержат больше всего файлов. В приведенном выше примере для файлов нет подсчета, часть вашего вопроса «сколько файлов». Исходники ядра были виновником, показанным в duвыводе все же; например, множество небольших файлов, подпапок из прошлых компиляций, именно то, что идеально подходит для удаления, чтобы освободить inode. Там до сих пор остается руководство, человеческий обзор duрезультатов, /usr/src/linux-headersбыл тогда очевиден.
kph0x1
1
du показывает ТОЛЬКО байты, а не файлы. И вы отправляете выход только из команды du в сортировку. Так как же сортировать -k1 -n сортировать вывод так, как вы предложили? Единственное, что я вижу, это то, что "du / | sort -k1 -n" сортирует только каждую строку на основе размера в байтах. Ничего другого
сироты
2

попробуйте du -s --inodes * 2>/dev/null |sort -gкомпакт-диск в последний каталог в выходе и повторите.

Полное раскрытие: не все --inodesфлаги поддержки ОС для команды du (моя Mac OS нет), но есть во многих ОС Linux.

Отто Лейхлитер
источник