Thank you for reading this post, don't forget to subscribe!
Файловая система Linux имеет два основных компонента: пул блоков данных, в которых хранятся данные, и система баз данных для управления этим пулом данных. Индекс подобен индексу для этой системы баз данных.
Что такое жесткая ссылка в Linux?
Жесткая ссылка на файл указывает на индекс файла вместо того, чтобы указывать на сам файл. Таким образом, жесткая ссылка получает все атрибуты исходного файла и указывает на тот же блок данных, что и исходный файл.
Если вы помните символическую ссылку или программную ссылку, вы знаете, что она указывает на файл. Жесткая ссылка – это созданная вручную запись в каталоге, которая указывает на уже существующий индекс.
Мы собираемся объяснить это вам с правильными диаграммами. Давайте возьмем эту структуру каталогов, например:
Корневой каталог содержит каталоги dir_1 и dir_2. Каталог dir_1 содержит файлы file_1 и file_2, тогда как dir_2 содержит файл file_3 и жесткую ссылку на файл 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.
Как создать жесткие ссылки в Linux
Вы можете использовать следующую команду для создания жесткой ссылки:
1 |
ln target_file link_name |
Команда создаст жесткую ссылку с именем link_name на целевой файл. Вы увидите, что link_name выглядит как обычный файл, а его атрибуты совпадают с целевым файлом.
Если вы используете команду ls -li (опция -i показывает номер индекса), вы увидите, что количество ссылок равно 2. Число ссылок находится после поля разрешения файла.
1 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. Так как число ссылок не равно нулю, ядро не удалит индекс или данные, связанные с ним. И, следовательно, если вы получаете доступ к жесткой ссылке, вы все равно можете получить доступ к данным, даже если исходный файл был удален.
Вы можете создать мягкую ссылку на каталог, но при попытке создать жесткую ссылку на каталог вы увидите такую ошибку:
1 |
ln: newdir/test_dir: hard link not allowed for directory |
Почему жесткие ссылки не разрешены для каталога? Это потому, что использование жестких ссылок на каталог могут сломать файловую систему. Теоретически вы можете создать жесткую ссылку на каталоги, используя опцию -d или -F. Но большинство дистрибутивов Linux этого не допустят, даже если вы являетесь пользователем root.
Практически невозможно различить жесткие ссылки и исходный файл.
Давайте еще раз посмотрим на жесткую ссылку, которую мы создали ранее:
1 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 |
Они имеют идентичные атрибуты, но вы можете догадаться, какая ссылка основана на имени в приведенном выше примере, но что, если имя не было очевидным? Как бы вы узнали, если бы их имена были target_1 и target_2?
Если файл и ссылки находятся в другом каталоге, вы можете попробовать проверить mtime и другие параметры, чтобы узнать, когда изменилось содержимое каталога, но даже это не является достоверным. Если файл и жесткая ссылка находятся в одном и том же каталоге, а история удалена, мы не уверены, как определить, какой файл является исходным, а какой – жесткой ссылкой.
Бонусный совет: как найти все жесткие ссылки на данный файл
Если вы видите, что файл имеет более одного числа ссылок, вам могут быть интересны другие жесткие ссылки, связанные с ним.
Один из способов найти это – использовать номер индекса файла. Вы можете использовать команду ls -i или команду stat для получения номера индекса.
Получив номер индекса, вы можете увидеть все ссылки, связанные с ним, с помощью команды find.
1 |
find . -inum inode_number |