Inode linux что это

Обновлено: 04.07.2024

В одной из прошлых статей мы говорили о том, что у каждого файла и папки в файловой системе есть так называемая структура Inode в которой хранятся метаданные этого объекта. Там хранится владелец, группа владельца, время изменения, создания и доступа к файлу, а также другая информация. Её можно увидеть не только с помощью инструментов отладки файловой системы.

Часть из этой информации показывает утилита ls, но если вам нужно больше, то можно воспользоваться командой stat. В этой статье мы рассмотрим как пользоваться этой командой в Linux.

Команда stat в Linux

Синтаксис команды очень простой. Ей надо передать опции и путь к файлу, для которого надо посмотреть информацию:

$ stat опции /путь/к/файлу

Опции передавать не обязательно и их совсем не много:

  • -L, dereference - показывать информацию о файле вместо символической ссылки;
  • -f, --file-system - показывать информацию о файловой системе в которой расположен файл;
  • -c, --format - позволяет указать формат вывода вместо стандартного, каждый файл выводится с новой строки;
  • --printf - аналогично --format, только для новой строки надо использовать \n;
  • -t, --terse - показ информации в очень кратком виде, в одну строку;
  • --version - показать версию утилиты.

Это все опции команды. Теперь давайте разберемся с примерами использования. Чтобы посмотреть информацию о файле достаточно запустить программу без опций передав ей путь к файлу, например /etc/passwd:


Рассмотрим что означает вывод программы:

  • Файл (File) - путь к файлу по которому показывается информация;
  • Размер (Size) - размер файла в байтах;
  • Блок В/В (IO Block) - размер блока файловой системы в байтах;
  • Блоков (Blocks) - количество блоков файловой системы, занятых файлом;
  • Устройство (Device) - идентификатор устройства, например HDD, на котором сохранён файл;
  • Inode - уникальный номер Inode этого файла;
  • Ссылки (Links) - количество жестких ссылок на этот файл;
  • Доступ (Access) - права доступа к файлу;
  • Uid - идентификатор и имя пользователя-владельца файла;
  • Gid - идентификатор и имя группы файла;
  • Доступ (Access) - время последнего доступа к файлу;
  • Модифицирован (Modify) - время когда в последний раз изменялся контент файла;
  • Изменен (Change) - время, когда в последний раз изменялись атрибуты файла или контент файла;
  • Создан (Birth) - зарезервировано для отображения первоначальной даты создания файла, но пока ещё не реализовано.

Надо ещё немного поговорить про формат времени. Например, время последнего доступа к файлу - 2020-12-02 18:25:01.043831739 +0200. Это время показывается с учётом временной зоны. А цифры +0200 показывают, что временная зона на компьютере, который создал или модифицировал этот файл на два часа больше чем UTC, то есть Europe/Kiev в зимнее время.

Если попробовать передать утилите символическую ссылку, то она покажет информацию только из Inode самой ссылки:


Для того чтобы увидеть информацию о файле, на который указывает ссылка надо использовать опцию -L:

stat -L /etc/passwdlink


Утилите можно передать не один файл, а несколько:

stat /etc/passwd /etc/group


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

  • %A - права доступа;
  • %b - количество занятых блоков;
  • %F - тип файла;
  • %g - идентификатор группы файла;
  • %G - имя группы файла;
  • %i - идентификатор Inode;
  • %n - имя файла;
  • %s - размер файла;
  • %u - идентификатор владельца файла;
  • %U - имя владельца файла;
  • %x - время последнего доступа;
  • %y - время последней модификации контента;
  • %z - время последнего изменения контента или атрибутов.

Это далеко не все возможные последовательности, больше вы моете найти в справке по утилите:

Например, давайте выведем только имя, файла, и время последней модификации его содержимоего:

stat --printf "File %n has been modified %y\n" /etc/passwd /etc/group


Если вы хотите посмотреть информацию о файловой системе, в которой расположен файл, то надо использовать опцию -f:

stat -f /etc/passwd


Давайте рассмотрим что означают поля, которые выводит утилита:

  • Файл (File) - имя файла;
  • Тип (Type) - тип файловой системы;
  • ID - идентификатор файловой системы;
  • Длина имени (Namelen) - максимальная длина имени в файловой системе;
  • Размер блока (Block size) - объем данных при запросе на чтение или запись для оптимальной скорости работы;
  • Базисный размер блока (Fundamental block size) - физический размер блока в файловой системе.

Дальше идут общее количество блоков в системе и количество свободных блоков.

Выводы

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

Нет похожих записей


Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.

Inode - это структура данных в которой хранится информация о файле или директории в файловой системе. В файловой системе Linux, например Ext4, у файла есть не только само его содержимое, например, тот текст, но и метаданные, такие как имя, дата создания, доступа, модификации и права. Вот эти метаданные и хранятся в Inode. У каждого файла есть своя уникальная Inode и именно здесь указано в каких блоках находятся данные файла.

Это довольно низкоуровневое понятие, но обычным пользователям приходится взаимодействовать с ним когда эти самые Inode заканчиваются. Возможно вы уже встречались с ошибкой когда место на диске ещё есть, но программа не может создать файл, потому что Inode закончились. В этой статье мы подробно разберемся что такое Inode, а также попытаемся выяснить как избежать связанных с ними проблем.

Что такое Inode в Linux?

Как я уже сказал выше, Inode или I-node или индексный дескриптор - это структура данных, в которой хранятся метаданные файла и перечислены блоки с данными файла. Но начать надо с файловой системы. Файловые системы Ext используют блоки для хранения данных. По умолчанию размер одного блока равен 4092 байта. В начале раздела расположен суперблок, в котором находятся метаданные всей файловой системы, а ним идут несколько зарезервированных блоков, а затем размещена таблица Inode и только после неё блоки с данными. Таким образом, все Inode размещены в начале раздела диска.

Директории - это тоже Inode типа директория, в которых вместо содержимого файла содержится список имён файлов и номера их Inode. Корневая папка в Ext4 имеет номер Inode - 2. Вы можете посмотреть информацию о ней с помощью утилиты debugfs. Утилите в параметрах надо передать диск, на котором расположена файловая система:

sudo debugfs /dev/nvme0n1p5

Затем выполните такую команду:


Здесь указано, что эта Inode имеет тип Directory, права 755. Её владелец и группа root, потому что идентификатор пользователя 0. Чуть ниже расположена информация про время создания, модификации и доступа. А в самом низу находятся блоки с данными этой Inode. Именно там хранится список файлов и папок директории. Вы можете посмотреть содержимое блока командой dump_block:

debugfs: block_dump 9238


Утилита выведет данные в HEX и ASCII формате, и в них будет видно имена папок. Но увидеть номера Inode здесь не получится без дополнительных программ. Проще всего их можно посмотреть с помощью команды ls:


Здесь в первом же столбике находится номер Inode для файла или папки. Для примера можно посмотреть ещё информацию про testfile с номером Inode 1128:

debugfs: stat <1128>


В разделе EXTENTS есть номер блока, в котором находятся данные файла. В данном случае это 6596316. В нём можно посмотреть содержимое файла:

debugfs: block_dump 6596316


Вот так это всё работает на уровне файловой системы. Посмотреть Inode идентификаторы файлов можно также с помощью команды ls. Для этого надо передать ей опцию -i:


Здесь они будут тоже в первой колонке. Обратите внимание, что у каждого файла, папки или символической ссылки уникальный номер Inode. Исключение составляют только жесткие ссылки. Количество Inode в файловой системе ограничено, оно определяется при инициализации файловой системы. Посмотреть текущее количество Inode можно командой tune2fs:

sudo tune2fs -l /dev/nvme0n1p5


Нужная информация находится в поле Inode count. Посмотреть Inode можно с помощью утилиты df передав ей опцию -i:


Как видите, на моём корневом разделе использовано 29% Inode, а блоков у меня уже использовано 95%. Но если бы у меня было очень много мелких файлов, то место бы ещё осталось, а доступные Inode закончились. Тогда бы возникла ошибка создания файла, даже несмотря на то, что место ещё есть. Чтобы избежать такой ситуации надо тщательно планировать как вы будете использовать файловую систему.

Вы не можете изменить количество Inode для существующей файловой системы, зато можете указать для новой с помощью опции -N. Например:

mkfs -t ext4 -N 3000000 /dev/nvme0n1p5

В данном случае будет создана файловая система с тремя миллионами индексов Inode. Ещё можно не указывать точное количество Inode, а указать количество байт в одной Inode, это может быть удобно, если вы знаете средний размер ваших файлов, которые будут хранится в файловой системе. Например:

mkfs -t ext4 -i 2K /dev/nvme0n1p5

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

Выводы

В этой статье мы рассмотрели что такое Inode в Linux, а также что произойдёт если доступное количество Inodes закончатся. Будьте осторожны при создании файловой системы и думайте какие файлы в ней будут размещены и сколько их там будет чтобы избежать проблем с Inode.

Нет похожих записей


Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.

Периодически, с целью переезда в ЦРС собеседуюсь в разных крупных компаниях, в основном Питера и Москвы на должность DevOps. Обратил внимание, что во многих компаниях (во многих хороших компаниях, например в яндексе) задают два сходных вопроса:

  • что такое inode;
  • по каким причинам можно получить ошибку записи на диск (или например: почему может закончиться место на диске, суть одна).

Начну «снизу», т.е. с жесткого диска (флешки, SSD и прочие современные штуки отбросим, для примера рассмотрим любой 20 или 80 гиговый старый диск, т.к. там размер блока 512 байт).




Как видно из рисунка, блоки LBA я обозначил как уровень HDD. К слову, посмотреть, какой размер блока у вашего диска можно так:


Уровнем выше размечен раздел, один на весь диск (опять же для простоты). Чаще всего используют разметку разделов двух типов: msdos и gpt. Соответственно msdos — старый формат, поддерживающий диски до 2Tb, gpt — новый формат, способный адресовать до 1 зеттабайта 512 байтных блоков. В нашем случае имеем раздел типа msdos, как видно из рисунка, раздел при этом начинается с блока №1, нулевой же используется для MBR.

В первом разделе я создал файловую систему ext2, по умолчанию размер блока у нее 4096 байт, что также отражено на рисунке. Посмотреть размер блока файловой системы можно так:


Нужный нам параметр — «Block size».

Теперь самое интересное, как прочитать файл /home/serp/testfile? Файл состоит из одного или нескольких блоков файловой системы, в которых хранятся его данные. Зная имя файла, как его найти? Какие блоки читать?

Вот тут нам и пригождаются inode. В файловой системе ext2fs есть «таблица», в которой содержится информация по всем inode. Количество inode в случае с ext2fs задается при создании файловой системы. Нужные цифры смотрим в параметре «Inode count» вывода tune2fs, т.е. имеем 65536 штук. В inode содержится нужная нам информация: список блоков файловой системы для искомого файла. Как найти номер inode для указанного файла?

Соответствие имени и номера inode содержится в директории, а директория в ext2fs — это файл особого типа, т.е. тоже имеет свой номер inode. Чтоб разорвать этот порочный круг, для корневой директории назначили «фиксированный» номер inode «2». Смотрим содержимое inode за номером 2:


Как видно, нужная нам директория содержится в блоке с номером 579. В ней мы найдем номер нода для папки home, и так далее по цепочке, пока в директории serp не увидим номер нода для запрошенного файла. Если вдруг кому то захочется проверить, верный ли номер, и есть ли там нужная инфа, это не сложно. Делаем:


В выводе можно прочитать имена файлов в директории.

Вот я и подошел к главному вопросу: «по каким причинам может возникнуть ошибка записи»?

Естественно так случится, если не останется свободных блоков файловой системы. Что можно в этом случае сделать? Кроме очевидного «удалить что-нибудь ненужное», следует помнить, что в файловых системах ext2,3 и 4 есть такая штука, как «Reserved block count». Если посмотреть в листинге выше, то у нас таких блоков «13094». Это блоки доступные для записи только пользователю root. но если нужно оперативно решить вопрос, как временное решение можно сделать их доступными для всех, в результате чего появится немного свободного места:


Т.е. по умолчанию, у вас не доступно для записи 5% дискового пространства, и учитывая объемы современных дисков, это могут быть сотни гигабайт.

Что еще может быть? Еще возможна ситуация, когда свободные блоки есть, а ноды кончились. Такое обычно случается, если у вас в файловой системе куча файлов размером меньше размера блока файловой системы. Учитывая, что на 1 файл или директорию тратится 1 inode, а всего их имеем (для данной файловой системы) 65536 — ситуация более чем реальная. Наглядно это можно увидеть из вывода команды df:


Как хорошо заметно на разделе /var/www, количество свободных блоков файловой системы, и количество свободных нодов сильно различается.

На случай если кончились inode, заклинаний не подскажу, т.к. их нет (если не прав, дайте знать). Так что для разделов в которых плодятся мелкие файлы следует грамотно выбирать файловую систему. Так например в btrfs inode не могут закончиться, т.к. динамически создаются новые при необходимости.

Периодически, с целью переезда в ЦРС собеседуюсь в разных крупных компаниях, в основном Питера и Москвы на должность DevOps. Обратил внимание, что во многих компаниях (во многих хороших компаниях, например в яндексе) задают два сходных вопроса:

  • что такое inode;
  • по каким причинам можно получить ошибку записи на диск (или например: почему может закончиться место на диске, суть одна).

Начну «снизу», т.е. с жесткого диска (флешки, SSD и прочие современные штуки отбросим, для примера рассмотрим любой 20 или 80 гиговый старый диск, т.к. там размер блока 512 байт).




Как видно из рисунка, блоки LBA я обозначил как уровень HDD. К слову, посмотреть, какой размер блока у вашего диска можно так:


Уровнем выше размечен раздел, один на весь диск (опять же для простоты). Чаще всего используют разметку разделов двух типов: msdos и gpt. Соответственно msdos — старый формат, поддерживающий диски до 2Tb, gpt — новый формат, способный адресовать до 1 зеттабайта 512 байтных блоков. В нашем случае имеем раздел типа msdos, как видно из рисунка, раздел при этом начинается с блока №1, нулевой же используется для MBR.

В первом разделе я создал файловую систему ext2, по умолчанию размер блока у нее 4096 байт, что также отражено на рисунке. Посмотреть размер блока файловой системы можно так:


Нужный нам параметр — «Block size».

Теперь самое интересное, как прочитать файл /home/serp/testfile? Файл состоит из одного или нескольких блоков файловой системы, в которых хранятся его данные. Зная имя файла, как его найти? Какие блоки читать?

Вот тут нам и пригождаются inode. В файловой системе ext2fs есть «таблица», в которой содержится информация по всем inode. Количество inode в случае с ext2fs задается при создании файловой системы. Нужные цифры смотрим в параметре «Inode count» вывода tune2fs, т.е. имеем 65536 штук. В inode содержится нужная нам информация: список блоков файловой системы для искомого файла. Как найти номер inode для указанного файла?

Соответствие имени и номера inode содержится в директории, а директория в ext2fs — это файл особого типа, т.е. тоже имеет свой номер inode. Чтоб разорвать этот порочный круг, для корневой директории назначили «фиксированный» номер inode «2». Смотрим содержимое inode за номером 2:


Как видно, нужная нам директория содержится в блоке с номером 579. В ней мы найдем номер нода для папки home, и так далее по цепочке, пока в директории serp не увидим номер нода для запрошенного файла. Если вдруг кому то захочется проверить, верный ли номер, и есть ли там нужная инфа, это не сложно. Делаем:


В выводе можно прочитать имена файлов в директории.

Вот я и подошел к главному вопросу: «по каким причинам может возникнуть ошибка записи»?

Естественно так случится, если не останется свободных блоков файловой системы. Что можно в этом случае сделать? Кроме очевидного «удалить что-нибудь ненужное», следует помнить, что в файловых системах ext2,3 и 4 есть такая штука, как «Reserved block count». Если посмотреть в листинге выше, то у нас таких блоков «13094». Это блоки доступные для записи только пользователю root. но если нужно оперативно решить вопрос, как временное решение можно сделать их доступными для всех, в результате чего появится немного свободного места:


Т.е. по умолчанию, у вас не доступно для записи 5% дискового пространства, и учитывая объемы современных дисков, это могут быть сотни гигабайт.

Что еще может быть? Еще возможна ситуация, когда свободные блоки есть, а ноды кончились. Такое обычно случается, если у вас в файловой системе куча файлов размером меньше размера блока файловой системы. Учитывая, что на 1 файл или директорию тратится 1 inode, а всего их имеем (для данной файловой системы) 65536 — ситуация более чем реальная. Наглядно это можно увидеть из вывода команды df:


Как хорошо заметно на разделе /var/www, количество свободных блоков файловой системы, и количество свободных нодов сильно различается.

На случай если кончились inode, заклинаний не подскажу, т.к. их нет (если не прав, дайте знать). Так что для разделов в которых плодятся мелкие файлы следует грамотно выбирать файловую систему. Так например в btrfs inode не могут закончиться, т.к. динамически создаются новые при необходимости.

Читайте также: