Одним из вопросов, которые часто задают на собеседованиях по должностям, связанным с Linux, является вопрос, касаемо ссылок. Мой случай не стал исключением и во время поиска работы проходя собеседования вопросы по «линкам» появлялись. Ниже попробую объяснить то, как я понимаю ссылки в Linux и какое различие между их видами.
Все есть файл!
Опять-таки перед изложением материала по ссылкам еще раз хочу обратить внимание читателей-новичков в мире Linux на очень важный факт (или даже подход) - в Линукс все является файлом. Директория на жестком диске, вставленная в USB-разъем флэшка, подключенный жесткий диск и даже ссылка. Эту информацию нужно постоянно держать в голове, чтобы осознать изложенный ниже материал.
Что такое ссылки в Linux?
Это (как ни странно) файлы, которые являются указателями на другие файлы в системе. Представьте, что перед вами коробка с различными чайными пакетиками, вы берете какой-либо из них за ярлычок и тянете. В результате вместе с ярлыком вытягивается, например, пакетик черного чая с брусникой. Ярлык в данном случае являлся ссылкой, чайный пакетик - исходным объектом.
После создания ссылки и обращения к ней пользователь, по сути, обращается к тому файлу, на который указывает ссылка. Ссылки бывают символическими и жесткими. И несмотря на то, что это два этих вида являются ссылками, между ними есть существенное различие.
Символические (символьные) ссылки, симлинки, symlink или мягкие ссылки
Симлинк это файл, который не содержит в себе копии исходного файла или директории. Она лишь указывает на этот объект, потому связь между ними называется мягкой: если удалить исходный файл или директорию, то символическая ссылка перестанет работать, если переименовать файл или папку или, например, изменить их местоположение на диске, то символическая ссылка не обновиться автоматом.
Пользователь может создать несколько симлинков на один и тот же файл и разместить их в любом месте на жестком диске. При обращении к символической ссылке будет осуществляться взаимодействие с исходным файлом или папкой.
При этом, так как симлинк является файлом, то у нее есть собственные права доступа, владелец-пользователь и владелец-группа.
Жесткие ссылки или hardlink
Прежде чем перейти к понятию жесткой ссылки нужно разобраться с так называемым индексным дескриптором или inode (инод) - если очень просто, то это некое число, которое в явном виде идентифицирует файл или папку в файловой системе. Для себя я воспринимаю инод, как номер квартиры конкретного жильца в многоквартирном доме.
Для просмотра инода у файла или папки можно использовать команду stat:
stat <путь_до_файла_или_папки>
Когда пользователь создает жесткую ссылку на файл, то он создает копию того самого inode, который приписан исходному файлу. Если проводить аналогию все с тем же жильцом, то в квартиру мы подселили еще одного человека.
Если удалить файл, на который создана жесткая ссылка, то она продолжит работать, так как ссылается на инод, существующий в файловой системе. Получается, что полное удаление файла произойдет только после того, как будут удалены все его жесткие ссылки. Кроме того, так как инод у жесткой ссылки и исходного объекта одинаковый, то одинаковыми для них будут являться права доступа и владельцы.
При работе с жесткими ссылками нужно помнить про существующие ограничения и особенности:
- исходный файл и жесткая ссылка на него должны быть в одной файловой системе
- жесткую ссылку нельзя создавать для директорий
- жесткая ссылка не может указывать на несуществующий файл
Создание символьных и жестких ссылок
Работа со ссылками в Linux осуществляется посредством команды ln (link). Не путайте ее с командой ls (list), которая отвечает за просмотр содержимого каталогов. Обратимся к тестовому серверу, где у меня имеется папки links_1, links_2 и файлами внутри первой папки:
Давайте создадим жесткую ссылку на file1 и назовем ее file1_hard. Синтаксис команды и то, что буду вводить выглядят так:
ln целевой_файл имя_жесткой_ссылки
ln links_1/file1 links_2/file1_hard
Сравним иноды у оригинального файла и жесткой ссылки на него:
stat links_1/file1
stat links_2/file1_hard
Как видим в «выхлопе» у них одинаковый инод, права доступа и владельцы (пользователь и группа).
Удаляем исходный файл и пробуем изменить жесткую ссылку на него:
rm links_1/file1
nano links_2/file1_hard
Даже после удаления оригинального файла ссылка доступна, так как ссылается на тот же инод и с ней можно делать точно такие же действия, что и с оригинальным файлом.
Теперь создадим символьную ссылку на file2 в папке links_1 и разместим ее в папке links_2 под названием file2_sym. Для этого к команде ln нужно добавить ключ -s:
ln -s целевой_файл имя_символьной_ссылки
ln -s links_1/file2 links_2/file2_sym
Теперь проведем с исходным файлом и симлинком те же действия, что и раньше (проверим иноды и удалим оригинальный файл):
stat links_1/file2
stat links_2/file2_sym
rm links_1/file2
nano links_2/file2_sym
Итог закономерен и не противоречит тому, про что говорили в начале - иноды у объектов различные, а удаление исходного файла делает симлинк неработоспособной.
Удаление ссылок обоих видов (symlink или hardlink) осуществляется точно также, как и файла - посредством команды rm (remove):
rm links_2/file1_hard
rm links_2/file2_sym
Подведем итоги
Вначале давайте еще раз сгруппируем и обобщим информацию по символическим и жестким ссылкам:
Стоит отметить, что с жесткими ссылками сейчас практически никто не работает, их уже давно в плане использования вытеснили симлинки.
Надеюсь, что у меня получилось объяснить что такое ссылки в Линукс, какие они бывают, какие между видами ссылок различия и как с ссылками работать.
Если остались вопросы, то задавайте их в комментариях, по мере знаний и возможности отвечу. Также опытные пользователи могут дополнить, если появится такая необходимость, материал, изложенный в посте, своими знаниями.