Ссылка в Unix-подобных системах — это своего рода указатель, напоминающий указатели в языках программирования, с той лишь разницей, что он указывает на файл или каталог. Ссылки позволяют нескольким именам файлов ссылаться на один и тот же файл, расположенный где-то в другом месте. В Linux-системах существуют два разных типа ссылок: символьная (или «мягкая», «символическая») ссылка и жесткая ссылка. На этом уроке мы разберем, чем символьная ссылка отличается от жесткой, и как с ними работать.
Жесткая ссылка (Hard link)
Предположим, вы захотели скопировать файл. В процессе копирования будет создан новый файл. Его непосредственные данные запишутся в свободное место на диске, а самому файлу система назначит уникальный идентификатор — индексный номер (сокр. «inode» от англ. «index node«).
Создавая жесткую ссылку (англ. «hard link») на файл, мы привязываемся к его индексному номеру, получая тот же самый файл (с новым именем), на который указывает ссылка, но без физического создании копии.
Для создания жесткой ссылки используется команда ln (от англ. «link»), имеющая довольно простой синтаксис:
$ ln целевой_файл имя_ссылки
Для примера создадим ссылку с именем hardlink1, указывающую на уже существующий файл file1:
$ ln file1 hardlink1
Чтобы убедиться, что файл file1 и ссылка hardlink1, по сути, являются одним и тем же объектом файловой системы — сравним их индексные номера, выполнив команду ls
вместе с опциями -l
(отображать расширенную информацию), -i
(выводить inode) и -h
(использовать буквы для обозначения размера):
$ ls –lih
Результат:
Как можно заметить, file1 и hardlink1 имеют общий индексный номер — 131094
. Теперь давайте создадим еще одну ссылку и посмотрим, как поведет себя счетчик ссылок (число, следующее за группой установленных разрешений файла):
$ ln file1 hardlink2
$ ls –lih
Результат:
Обратите внимание, теперь счетчик ссылок показывает цифру 3 вместо 2.
Символьная ссылка (Symbolic link)
Символьная ссылка (сокр. «symlink» от англ «symbolic link«), в отличие от жесткой ссылки, указывает не на индексный номер файла, а на его имя (путь). В каком-то роде символьная ссылка является аналогом ярлыка в Windows-системах.
Символьную ссылку можно создать с помощью той же команды ln
, добавив к ней опцию -s
:
$ ln -s file1 symlink1
При этом будет создан новый (!) объект файловой системы с именем symlink1, указывающий на существующий файл file1:
Буква l
в группе прав доступа к файлу сигнализирует нам о том, что этот файл является символьной ссылкой на другой файл, что также отражено в имени файла — symlink1 -> file1
.
Сравним индексные номера file1, hardlink1, hardlink2 и symlink1:
Видно, что индексный номер symlink1 отличается от других номеров, так как для файловой системы это уже два независимых объекта. Также заметно и различие в наборе прав.
Жесткие ссылки vs. Символьные ссылки
Ниже представлены основные различия между жесткими и символьными ссылками.
Жесткие ссылки:
не могут пересекать границы файловой системы (т.е. жесткая ссылка работает только в пределах своей файловой системы);
нельзя использовать с директориями;
имеют inode и разрешения исходного файла;
разрешения будут обновляться при изменении разрешения исходного файла;
связаны с содержимым исходного файла. Если вы создадите жесткую ссылку на файл и измените содержимое файла (или ссылки), то изменения будут присутствовать в обоих объектах;
с помощью жесткой ссылки вы можете просматривать содержимое файла, даже если исходный файл перемещен или удален.
Символьные ссылки:
могут пересекать границы файловой системы;
можно использовать с директориями;
имеют свои собственные (отдельные) inode и права доступа;
разрешения не будут обновляться;
связаны только с именем (путем) исходного файла, а не с его содержимым; удаление символьной ссылки не приводит к удалению файла;
можно изменить имя, атрибуты самой ссылки или перенаправить её ссылаться на другой файл, и при этом исходный файл затронут не будет (но имейте ввиду, что если вы по ссылке откроете для редактирования сам файл, то внесете изменения непосредственно в исходный файл).
Удаление ссылок
Если вы удалите жесткую ссылку, то связанный с ней файл будет существовать, пока существует хотя бы одна жесткая ссылка на него. Если вы удалите исходный файл, но при этом в другом месте сохранится жесткая ссылка на него, то «сменится» каталог размещения файла. В качестве примера добавим в наш file1 строку "Welcome to Ravesli.com"
, удалим файл, а затем попробуем обратиться к жесткой ссылке hardlink2:
Обратите внимание, несмотря на то, что исходного файла больше нет, мы все еще можем получить доступ к его содержимому, используя жесткую ссылку.
При удалении файла, на который указывает символьная ссылка, сама ссылка просто станет нерабочей. Например, удалим файл file1, на который у нас есть символьная ссылка symlink1:
$ rm file1
Символьная ссылка превратилась в «висячую» ссылку, указывая на несуществующий файл. Если попытаться к ней обратиться, то система выдаст нам сообщение об ошибке:
diego@debian:~$ file file1
file1: cannot open `file1' (No such file or directory)
diego@debian:~$ file symlink1
symlink1: broken symbolic link to file1
diego@debian:~$
Заключение
Ссылки являются неотъемлемой частью Linux-систем и часто помогают в навигации и изучении файловой системы. Если у вас остались какие-то вопросы, то не стесняйтесь задавать их в комментариях.