Поиск по сайту:

Жесткая ссылка в Linux: все важное, что вам нужно знать


Изучите концепцию жестких ссылок в Linux и их связь с индексными дескрипторами в этом руководстве.

Прежде чем вы увидите жесткие ссылки, советую вам узнать об инодах в Linux. Файловая система Linux состоит из двух основных компонентов: пула блоков данных, в которых хранятся данные, и системы базы данных для управления этим пулом данных. Индексный дескриптор является индексом этой системы баз данных.

Что такое жесткая ссылка в Linux?

Жесткая ссылка на файл указывает на индексный дескриптор файла, а не на сам файл. Таким образом, жесткая ссылка получает все атрибуты исходного файла и указывает на тот же блок данных, что и исходный файл.

Если вы помните символическую или программную ссылку, вы знаете, что она указывает на файл. Жесткая ссылка — это вручную созданная запись в каталоге, указывающая на уже существующий индексный дескриптор.

Я собираюсь объяснить это вам с помощью соответствующих диаграмм. Возьмем, к примеру, такую структуру каталогов:

Таким образом, корневой каталог содержит каталоги dir_1 и dir_2. Каталог dir_1 содержит файлы file_1 и file_2, тогда как каталог dir_2 содержит файл_3 и жесткую ссылку на файл 2.

Давайте посмотрим, как обстоят дела в файловой системе. Все представительно. На самом деле в корневом каталоге будут тысячи файлов. Здесь мы предполагаем, что у него есть только два каталога.

Помните структуру каталогов Linux? Вы начинаете с корня (/). Корневой каталог всегда имеет индекс 2.

Если вам нужен доступ к файлу 3, абсолютный путь будет /dir_2/file_3. Здесь вы можете прочитать это так: вы начинаете с индексного дескриптора 2 (корневой всегда indoe 2) и следуете по стрелке к его блоку данных. Этот блок данных содержит информацию об индексном дескрипторе dir_2 (инод 27 в нашем примере).

Теперь вы посмотрите на индексный дескриптор 27. Его тип — каталог. Вы переходите к его блоку данных, содержащему информацию об индексном дескрипторе file_3 (инод 88). Вы смотрите на индексный дескриптор 88. Его тип — файл, и если вы следуете его блоку данных, вы получаете доступ к содержимому файла.

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

Вы, должно быть, задаетесь вопросом о количестве ссылок на изображении выше. Это очень важно, особенно когда вы имеете дело с жесткой ссылкой. Число ссылок — это количество записей каталога, указывающих на индексный дескриптор. Возьмем, к примеру, индекс 27 для dir_2. Индексный дескриптор 27 находится один раз в блоке данных корневого каталога и один раз в собственном блоке данных (специальный каталог .). И, следовательно, количество ссылок равно 2.

Обратите внимание, что все файлы имеют счетчик ссылок 1, кроме file_2? Если у файла количество ссылок больше 1, это означает, что «на этот файл» есть жесткие ссылки. Поскольку жесткие ссылки указывают на тот же индексный дескриптор (в нашем примере индекс 17), что и целевой файл, вы получаете два списка каталогов для индексного дескриптора 17 (в блоках данных dir_1 и dir_2).

Как создать жесткие ссылки в Linux

Вы можете использовать команду ln для создания жесткой ссылки:

ln target_file link_name

Это создаст жесткую ссылку с именем link_name на целевой_файл. Вы увидите, что link_name выглядит как обычный файл и его атрибуты такие же, как у целевого файла.

Если вы используете команду ls -li (опция -i показывает номер индексного дескриптора), вы увидите, что ее счетчик ссылок равен 2. Счетчик ссылок указан после поля разрешения файла.

134195 -rw-r--r-- 2 abhishek abhishek        0 Jul 17 19:49  target_file
134195 -rw-r--r-- 2 abhishek abhishek        0 Jul 17 19:49  link_target_file

Очевидно, оба имеют одинаковый номер индекса 134195.

Что следует помнить о жестких ссылках

Теперь, когда вы имеете хорошее представление о жестких ссылках в Linux, давайте пойдем немного дальше.

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

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

Удаление файлов в Linux по сути означает разрыв связи. Предположим, вы удалили файл file_1 с помощью команды rm. Ядро Linux обнаружит, что file_1 соответствует индексу 16. Оно удалит запись file_1 из списка dir_1 и уменьшит количество ссылок на индекс 16 на 1. Теперь, когда счетчик ссылок на индекс 16 равен 0, ядро знает, что на этот индекс никто не ссылается. 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 abhishek abhishek        0 Jul 17 19:49  target_file
134195 -rw-r--r-- 2 abhishek abhishek        0 Jul 17 19:49  link_target_file

У них одинаковые атрибуты, но вы можете догадаться, какая ссылка является ссылкой, по имени в приведенном выше примере, но что, если имя не очевидно? Как бы вы узнали, были ли их имена target_1 и target_2?

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

Бонусный совет: как найти все жесткие ссылки на данный файл

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

Один из способов найти это — использовать номер индексного дескриптора файла. Вы можете использовать команду ls -i или команду stat, чтобы получить номер индексного дескриптора.

Получив номер индексного дескриптора, вы сможете увидеть все связанные с ним ссылки с помощью команды find.

find . -inum inode_number

Трудно ли было понять жесткие ссылки?

Надеюсь, это было не слишком «сложно» и вы лучше поняли концепцию жесткой ссылки в Linux. Если у вас есть сомнения или предложения по этой теме, пожалуйста, оставьте комментарий ниже.

Статьи по данной тематике: