Поиск по inode linux

Обновлено: 04.07.2024

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

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

Структуры inode

Содержимое структуры inode

Inode является структурой данных, содержащей относящиеся к файлу метаданные. При сохранении нового файла на диске в рамках файловой системы происходит сохранение не только самого содержимого файла (данных), но и таких дополнительных параметров файла, как имя, дата создания, права доступа и других. Вся эта информация (за исключением имени файла и его содержимого) сохраняется в рамках структуры inode , соответствующей данному файлу.

Как видно в следующем примере, при использовании команды ls -l выводятся некоторые данные, содержащиеся в структуре inode.

Таблица структур inode

Таблица структур inode содержит информацию о всех структурах inode и создается в момент создания файловой системы (с помощью утилиты mkfs ). Вы можете использовать команду df -i для получения информации о количестве используемых и доступных для использования структур inode в рамках смонтированных файловых систем.

В приведенном выше примере вывода команды df -i вы можете обнаружить процентные показатели использования структур inode для некоторых смонтированных файловых систем . Данный показатель не приводится для устройства /dev/sdb5 ввиду того, что на этом устройстве используется файловая система fat .

Идентификатор структуры inode

Каждая структура inode имеет уникальный идентификатор (идентификатор структуры inode). Вы можете увидеть идентификаторы структур inode в выводе команды ls -li .

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

Структуры inode и содержимое файлов

Давайте запишем немного данных в один из рассматриваемых файлов.

Данные, выводимые при использовании команды cat , содержатся не в структуре inode , а где-то на диске. Структура inode содержит указатель на эти данные.

О директориях

Директория является таблицей

Директория является особым видом файла, который содержит таблицу соответствия между именами файлов и структурами inode. При выводе списка содержимого директории с помощью команды ls -ali на самом деле будет осуществляться вывод содержимого файла директории.

Директории . и ..

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

Жесткие ссылки

Создание жестких ссылок

В момент создания жесткой ссылки с помощью утилиты ln в файл директории добавляется дополнительная запись. Новое имя файла ставится в соответствие существующей структуре inode.

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

Поиск жестких ссылок

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

Символьные ссылки

Символьные ссылки (иногда называемые мягкими ссылками ) не указывают на структуры inode, а являются соответствиями между именами файлов. Символьные ссылки создаются с помощью команды ln -s . Как вы можете увидеть в примере ниже, символьная ссылка имеет собственную структуру inode.

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

Удаление ссылок

Ссылки на файлы могут удаляться с помощью утилиты rm .

Практическое задание: ссылки на файлы

1. Создайте два файла с именами winter.txt и summer.txt, поместите какие-либо текстовые данные в них.

2. Создайте жесткую ссылку на файл winter.txt с именем hlwinter.txt.

3. Выведите информацию об идентификаторах структур inode, соответствующих этим трем файлам, жесткие ссылки должны использовать структуры inode файлов, на которые они ссылаются.

4. Используйте утилиту find для вывода информации о файлах, на которые установлены жесткие ссылки.

5. Все данные файла, помимо двух типов данных, хранятся в соответствующей структуре inode. Назовите эти два типа данных!

6. Создайте символьную ссылку на файл summer.txt с именем slsummer.txt.

7. Найдите все файлы с идентификатором структуры inode, равным 2. Какой вывод вы можете сделать на основе полученной информации?

8. Исследуйте директории /etc/init.d/ /etc/rc.d/ /etc/rc3.d/ . обнаружили ли вы ссылки на файлы в них?

9. Выведите список файлов директории /lib с помощью команды ls -l.

10. Используйте утилиту find для поиска в вашей домашней директории обычных файлов, на которые не установлено (!) ни одной жесткой ссылки.

Корректная процедура выполнения практического задания: ссылки на файлы

1. Создайте два файла с именами winter.txt и summer.txt, поместите какие-либо текстовые данные в них.

2. Создайте жесткую ссылку на файл winter.txt с именем hlwinter.txt.

3. Выведите информацию об идентификаторах структур inode, соответствующих этим трем файлам, жесткие ссылки должны использовать структуры inode файлов, на которые они ссылаются.

4. Используйте утилиту find для вывода информации о файлах, на которые установлены жесткие ссылки.

5. Все данные файла, помимо двух типов данных, хранятся в соответствующей структуре inode. Назовите эти два типа данных!

Имя файла, которое хранится в файле директории и данные файла, которые хранятся где-либо на диске.

6. Создайте символьную ссылку на файл summer.txt с именем slsummer.txt.

7. Найдите все файлы с идентификатором структуры inode, равным 2. Какой вывод вы можете сделать на основе полученной информации?

Можно сделать вывод о том, что в рамках системы существует более одной таблицы структур inode (по одной для каждого отформатированного раздела + виртуальные файловые системы).

8. Исследуйте директории /etc/init.d/ /etc/rc.d/ /etc/rc3.d/ . обнаружили ли вы ссылки на файлы в них?

9. Выведите список файлов директории /lib с помощью команды ls -l.

10. Используйте утилиту find для поиска в вашей домашней директории обычных файлов, на которые не установлено (!) ни одной жесткой ссылки.

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 при копировании материала ссылка на источник обязательна.

Для начала сделаем поиск passwd в корневой директории root и всех поддиректориях. Эта команда проведет поиск во всех каталогах, куда Вам разрешен доступ; если Вы не имеете прав прочесть содержимое каталога, f ind сообщит, что поиск в данном каталоге Вам запрещен.

Теперь ограничим поиск самой корневой директорией root (level 1) и поддиректориями (level 2).

Теперь ограничим поиск корневой директорией и поддиректориями для уровня ниже (level 2, level 3)

Теперь ограничим поис файлов между уровнями level 2 и level 4

Поиск файлов с одновременным выполнением операций над ними

Найдём все файлы MyCProgram.c без учёта регистра букв и одновременно вычислим для каждого из них md5sum. Внутри фигурных скобок будут автоматически подставлять найденные файлы.

md5sum — программа, позволяющая вычислять значения хеш-сумм (контрольных сумм) файлов по алгоритму MD5. В обычном случае вычисленные хеши выводятся (можно сохранить в файле, для последующего использования). В других случаях, программа сверяет вычисленные значения со значениями, сохраненными в файле (это удобно для массовой проверки целостности файлов). Наиболее часто программа используется для проверки правильной загрузки файлов по сети.

Какие действия можно выполнять при поиске:

  • -print Выводит полный путь с именем файла в стандартный вывод
  • -ls Выводит полный листинг файла (эквивалентно команде ls -dils )
  • -delete Удаляет файл
  • -exec command Выполняет указанную команду. Все последующие аргументы до появления; считаются аргументами команды. Строка <> заменяется именем текущего файла

Вот пример, в котором используется действие -exec , которое перемещает все найденные файлы в каталог для резервного копирования. Здесь есть несколько вещей, которые нужно отметить. Обозначение <> будет заменено на полный путь найденного файла, а ; используется для обозначения окончания команды, следующей за -exec . Помните, что ; — это также специальный символ оболочки, и нужно поставить перед ним обратный слэш, чтобы оболочка его не обрабатывала.

Чтобы найти все файлы в каталоге /html/ с расширением .html, и вывести строки из этих файлов, содержащие слово organic, введите:

Чтобы ввести подтверждение выполнения команды для файла, найденного f ind , используйте ключ -ok вместо -exec . Чтобы удалить из Вашего домашнего каталога файлы, доступ к которым осуществлялся более года назад, с подтверждением для каждого файла, введите:

Поиск файлов, не являющихся тем, что указано в условии

Найдем файлы, имя которых не совпадает с MyCProgram.c (регистр букв не учитывается). При этом искать будем только в текущей директории (level 1)

Еще вариант использовать вместо -not обратный слеш с восклицательным знаком:

Найдем файлы в каталоге /bin, владельцем которых не является root:

Поиск файла по уникальному номеру inode

В информатике инодом (или индексным дескриптором) (произносится айнод или инод) называют структуру данных в традиционных файловых системах Unix, таких как UFS. Инод хранит основную информацию о постоянных файлах, каталогах или других объектах файловой системы. А слово node переводится как узел, узловая точка.
При создании файловой системы создаются также и структуры данных, содержащие информацию о файлах. Каждый файл имеет свой инод, идентифицируемый по номеру инода (часто называемый 'i-номером' или инодом), в файловой системе, в которой располагается сам файл.
Иноды хранят информацию о файлах, такую как принадлежность владельцу (пользователю и группе), режим доступа (чтение, запись, запуск на выполнение) и тип файла. Существует определенное числоинодов, которое указывает максимальное количество файлов, допускаемое определенной файловой системой. Обычно, при создании файловой системы примерно 1% ее выделяется под иноды.

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

Теперь с помощью опции –i покажем в листинге их номера inode, они различны:

При поиске файлов тоже можно использовать его номер inode, используя -inum . Найдём файл с inode=16187430 и переименуем его. При последующем листинге увидим, что изменилось имя одного файла с тем самым inode.

Можно пользоваться этой техникой при совершении действий над файлами с малоинформативными названиями. Например, файл f ile?.txt содержит спецсимвол — вопросительный знак, который обычно используется в поиске для указания, что на его месте может быть любо символ. Поэтому если вы попытаетесь удалить этот файл rm file?.txt , то удалятся все три файла, которые похожи на него по имени и содержат в позиции вопросительного знака цифры 1 и 2. Итак, у нас три файла:

Чтобы удалить файл с вопросительным знаком, покажем их inode:

И теперь удалим только файл с inode=804180

С другой стороны, пример надуман, потому что существует более простой способ удаления f ile?.txt


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

Команда find – это невероятно мощный инструмент, позволяющий искать файлы не только по названию, но и по:

  • Дате добавления.
  • Содержимому.
  • Регулярным выражениям.

Данная команда будет очень полезна системным администраторам для:

  • Управления дисковым пространством.
  • Бэкапа.
  • Различных операций с файлами.

Команда find в Linux производит поиск файлов и папок на основе заданных вами критериев и позволяет выполнять действия с результатами поиска.

Синтаксис команды find:

  • directory-to-search (каталог поиска) – это отправной каталог, с которой find начинает поиск файлов по всем подкаталогам, которые находятся внутри. Если не указать путь, тогда поиск начнется в текущем каталоге;
  • criteria (критерий) – критерий, по которым нужно искать файлы;
  • action (действие) – что делать с каждым найденным файлом, соответствующим критериям.

Поиск по имени

Следующая команда ищет файл s.txt в текущем каталоге:

  • . (точка) – файл относится к нынешнему каталогу
  • -name – критерии по которым осуществляется поиск. В данном случае поиск по названию файла.

В данном случае критерий -name учитывает только символы нижнего регистра и файл S.txt не появиться в результатах поиска. Чтобы убрать чувствительность к регистру необходимо использовать –iname.

Для поиска всех изображений c расширением .jpg нужно использовать шаблон подстановки *.jpg:

Можно использовать название каталога для поиска. Например, чтобы с помощью команды find найти все png изображения в каталоге home:

Поиск по типу файла

Критерий -type позволяет искать файлы по типу, которые бывают следующих видов:

  • f – простые файлы;
  • d – каталоги;
  • l – символические ссылки;
  • b – блочные устройства (dev);
  • c – символьные устройства (dev);
  • p – именованные каналы;
  • s – сокеты;

Например, указав критерий -type d будут перечислены только каталоги:

Поиск по размеру файла

Допустим, что вам необходимо найти все большие файлы. Для таких ситуаций подойдет критерий -size.

  • "+" — Поиск файлов больше заданного размера
  • "-" — Поиск файлов меньше заданного размера
  • Отсутствие знака означает, что размер файлов в поиске должен полностью совпадать.

В данном случае поиск выведет все файлы более 1 Гб (+1G).

Единицы измерения файлов:

Поиск пустых файлов и каталогов

Критерий -empty позволяет найти пустые файлы и каталоги.

Поиск времени изменения

Критерий -cmin позволяет искать файлы и каталоги по времени изменения. Для поиска всех файлов, измененных за последний час (менее 60 мин), нужно использовать -60:

Таким образом можно найти все файлы в текущем каталоге, которые были созданы или изменены в течение часа (менее 60 минут).

Для поиска файлов, которые наоборот были изменены в любое время кроме последнего часа необходимо использовать +60.

Поиск по времени доступа

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

Таким образом можно найти файлы, к которым не обращались последние полгода (180 дней).

Поиск по имени пользователя

Опция –user username дает возможность поиска всех файлов и каталогов, принадлежащих конкретному пользователю:

Таким образом можно найти все файлы пользователя tisha в каталоге home, а 2>/dev/null сделает выдачу чистой без ошибок в отказе доступа.

Поиск по набору разрешений

Критерий -perm – ищет файлы по определенному набору разрешений.

Поиск файлов с разрешениями 777.

Операторы

Для объединения нескольких критериев в одну команду поиска можно применять операторы:

Например, чтобы найти файлы размером более 1 Гбайта пользователя tisha необходимо ввести следующую команду:

Если файлы могут принадлежать не только пользователю tisha, но и пользователю pokeristo, а также быть размером более 1 Гбайта.

Перед скобками нужно поставить обратный слеш "\".

Действия

К команде find можно добавить действия, которые будут произведены с результатами поиска.

  • -delete — Удаляет соответствующие результатам поиска файлы
  • -ls — Вывод более подробных результатов поиска с:
    • Размерами файлов.
    • Количеством inode.

    -delete

    Полезен, когда необходимо найти и удалить все пустые файлы, например:

    Перед удалением лучше лишний раз себя подстраховать. Для этого можно запустить команду с действием по умолчанию -print.

    Данное действие является особенным и позволяет выполнить команду по вашему усмотрению в результатах поиска.

    • command – это команда, которую вы желаете выполнить для результатов поиска. Например:
      • rm
      • mv
      • cp

      С помощью –exec можно написать альтернативу команде –delete и применить ее к результатам поиска:

      Другой пример использования действия -exec:

      Таким образом можно скопировать все .jpg изображения в каталог backups/fotos

      Заключение

      Команду find можно использовать для поиска:

      • Файлов по имени.
      • Дате последнего доступа.
      • Дате последнего изменения.
      • Имени пользователя (владельца файла).
      • Имени группы.
      • Размеру.
      • Разрешению.
      • Другим критериям.

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

      • Удаление.
      • Копирование.
      • Перемещение в другой каталог.

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

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