Изучите концепцию жестких ссылок в Linux и ее связь с inode в этой статье.
Прежде чем вы увидите жесткие ссылки, мы советуем вам узнать об inode в Linux. Файловая система Linux имеет два основных компонента: пул блоков данных, в которых хранятся данные, и система баз данных для управления этим пулом данных. Индекс подобен индексу для этой системы баз данных.
Жесткая ссылка на файл указывает на индекс файла вместо того, чтобы указывать на сам файл. Таким образом, жесткая ссылка получает все атрибуты исходного файла и указывает на тот же блок данных, что и исходный файл.
Если вы помните символическую ссылку или программную ссылку, вы знаете, что она указывает на файл. Жесткая ссылка — это созданная вручную запись в каталоге, которая указывает на уже существующий индекс.
Мы собираемся объяснить это вам с правильными диаграммами. Давайте возьмем эту структуру каталогов, например:
Корневой каталог содержит каталоги dir_1 и dir_2. Каталог dir_1 содержит файлы file_1 и file_2, тогда как dir_2 содержит файл file_3 и жесткую ссылку на файл 2.
Давайте посмотрим, как все выглядит в файловой системе. Все изобразительное. В действительности в корневом каталоге будет тысячи файлов. Здесь мы предполагаем, что он имеет только две директории.
Помните структуру каталогов Linux? Вы начинаете с рута (/). Корневой каталог всегда имеет индекс 2.
Если вам нужен доступ к файлу 3, абсолютный путь будет /dir_2/file_3. Здесь вы можете прочитать это следующим образом: вы начинаете с inode 2 (root всегда inode 2) и следует за стрелкой к его блоку данных. Этот блок данных содержит информацию об inode dir_2 (inod 27 в нашем примере).
Теперь вы смотрите на индекс 27. Это тип — каталог. Вы следуете за его блоком данных, который имеет информацию об inode file_3 (inode 88). Вы смотрите на индекс 88. Это тип файла, и если вы проследуете к его блоку данных, вы получите доступ к содержимому файла.
Вы заметили, что сам каталог не содержит данных своего файла? Каталоги — это, по сути, файл, содержащий информацию об инодах их файлов и подкаталогов.
Вам должно быть интересно узнать количество ссылок на изображении выше. Это особенно важно, когда вы имеете дело с жесткой ссылкой. Количество ссылок — это количество записей каталога, которые указывают на индекс. Возьмите, например, индекс 27 для dir_2. inode 27 находится один раз в блоке данных корневого каталога и один раз в своем собственном блоке данных (специальный каталог). И, следовательно, он имеет количество ссылок 2.
Обратите внимание, что все файлы имеют количество ссылок 1, кроме file_2? Если файл имеет количество ссылок больше 1, это означает, что существуют жесткие ссылки «на этот файл». Поскольку жесткие ссылки указывают на тот же inode (в нашем примере 17), что и целевой файл, вы получаете 2 списка каталогов для 17 (в блоке данных dir_1 и dir_2).
Вы можете использовать следующую команду для создания жесткой ссылки:
ln target_file link_name
Команда создаст жесткую ссылку с именем link_name на целевой файл. Вы увидите, что link_name выглядит как обычный файл, а его атрибуты совпадают с целевым файлом.
Если вы используете команду ls -li (опция -i показывает номер индекса), вы увидите, что количество ссылок равно 2. Число ссылок находится после поля разрешения файла.
134195 -rw-r--r-- 2 andreyex andreyex 0 Jul 17 19:49 target_file 134195 -rw-r--r-- 2 andreyex andreyex 0 Jul 17 19:49 link_target_file
У обоих одинаковый номер индекса 134195, очевидно.
Теперь, когда у вас есть хорошее представление о жестких ссылках в Linux, давайте пойдем дальше.
Если вы удалите целевой файл, вы все равно сможете получить доступ к его содержимому через жесткую ссылку. Это связано с тем, что и целевой файл, и жесткая ссылка имеют один и тот же индекс и, следовательно, они указывают на один и тот же блок данных.
Удаление файлов в Linux в основном не связывает. Предположим, вы удалили file_1 с помощью команды rm. Ядро Linux обнаружит , что file_2 соответствует INode 16. Это удалит file_2 запись из списка dir_1 и уменьшить inode 16 посчитает ссылку на 1. Теперь у inode 16 счетчик ссылок равен 0, ядро знает, что нет ссылок на этот inode, поэтому можно безопасно удалить inode и удалить связанный с ним блок данных.
Теперь скажите, что вы удалите file_2. Ядро удалит файл file_2 из списка dir_1 и перейдет в индекс 17. Это уменьшит количество ссылок в узле 17, уменьшив его до 1. Так как число ссылок не равно нулю, ядро не удалит индекс или данные, связанные с ним. И, следовательно, если вы получаете доступ к жесткой ссылке, вы все равно можете получить доступ к данным, даже если исходный файл был удален.
Вы можете создать мягкую ссылку на каталог, но при попытке создать жесткую ссылку на каталог вы увидите такую ошибку:
ln: newdir/test_dir: hard link not allowed for directory
Почему жесткие ссылки не разрешены для каталога? Это потому, что использование жестких ссылок на каталог могут сломать файловую систему. Теоретически вы можете создать жесткую ссылку на каталоги, используя опцию -d или -F. Но большинство дистрибутивов Linux этого не допустят, даже если вы являетесь пользователем root.
Давайте еще раз посмотрим на жесткую ссылку, которую мы создали ранее:
134195 -rw-r--r-- 2 andreyex andreyex 0 Jul 17 19:49 target_file 134195 -rw-r--r-- 2 andreyex andreyex 0 Jul 17 19:49 link_target_file
Они имеют идентичные атрибуты, но вы можете догадаться, какая ссылка основана на имени в приведенном выше примере, но что, если имя не было очевидным? Как бы вы узнали, если бы их имена были target_1 и target_2?
Если файл и ссылки находятся в другом каталоге, вы можете попробовать проверить mtime и другие параметры, чтобы узнать, когда изменилось содержимое каталога, но даже это не является достоверным. Если файл и жесткая ссылка находятся в одном и том же каталоге, а история удалена, мы не уверены, как определить, какой файл является исходным, а какой — жесткой ссылкой.
Если вы видите, что файл имеет более одного числа ссылок, вам могут быть интересны другие жесткие ссылки, связанные с ним.
Один из способов найти это — использовать номер индекса файла. Вы можете использовать команду ls -i или команду stat для получения номера индекса.
Получив номер индекса, вы можете увидеть все ссылки, связанные с ним, с помощью команды find.
find . -inum inode_number
Трудно ли было понять жесткие ссылки?
Мы надеемся, что это не было слишком «сложно», и вы лучше понимаете концепцию жесткой связи в Linux. Если у вас есть сомнения или предложения по этой теме, пожалуйста, оставьте комментарий ниже.