Ссылки, широко используемые в операционной системе Linux позволяют давать файлу сразу несколько имён.
В файловой системе, используемой в Linux, файлы распознаются по номеру их индексного дескриптора (inode number). Этот номер является уникальным во всей файловой системе. Каталог же представляет собой список номеров индексных дескрипторов и соответствующих имён файлов. Каждое имя файла в каталоге связано с некоторым индексным дескриптором.
Содержание
Жёсткие ссылки
В текущем каталоге имеется файл с именем foo
. Увидеть соответствующий ему номер индексного дескриптора можно с помощью команды ls -i
:
$ ls -i foo
584794 foo
Файлу foo
соответствует индексный дескриптор номер 22192
файловой системы. К файлу foo
можно создать ещё одну ссылку и назвать её bar
. Для создания ссылки используется команда ln
:
$ ln foo bar
Команда ls -i
показывает, что оба файла относятся к одному и тому же индексному дескриптору:
$ ls -i foo bar
584794 bar 584794 foo
Теперь, обращаясь к файлу foo
или bar
, мы, в действительности, будем обращаться к одному и тому же файлу. Производя изменения в файле foo
, мы можем увидеть, что они появились также и в файле bar
. Со всех точек зрения файлы foo
и bar
— один и тот же файл.
Подобные ссылки называются жёсткими ссылками (hard links), поскольку они создают непосредственную связь с конкретным индексным дескриптором. Отметим, что жёсткие ссылки можно создавать только тогда, когда файлы находятся в одной и той же файловой системе, в то время как символические ссылки не имеют таких ограничений.
При удалении файла командой rm
в действительности удаляется только одна ссылка на файл:
$ rm foo
В приведенном примере будет удалена только ссылка foo
, а ссылка bar
будет продолжать существовать. Файл будет удалён из файловой системы только тогда, когда на него не останется больше ссылок.
Команда ls -l
выдаёт (помимо прочей информации) число ссылок на каждый файл:
$ ls -l foo bar
-rw-r--r-- 2 oleg oleg 0 May 18 18:49 bar
-rw-r--r-- 2 oleg oleg 0 May 18 18:49 foo
В приведенном примере цифра 2
во второй колонке этого списка обозначает число ссылок на файл.
Отметим, что каталог в действительности представляет собой просто файл, содержащий информацию о связях (ссылках) между именами файлов и индексными дескрипторами. Также каждый каталог содержит, как минимум, две жёстких ссылки: ссылка .
указывает на сам каталог, а ссылка ..
указывает на родительский каталог. У корневого каталога /
ссылка ..
указывает на сам корневой каталог /
. Иными словами, родительским каталогом корневого каталога является тот же самый каталог.
Символические ссылки
С помощью символических ссылок (symbolic links) можно дать файлу другое имя, но не связывать файл с индексным дескриптором. Этим символические ссылки отличаются от жёстких ссылок.
Для создания символических ссылок используется команда ln -s
:
$ ln -s foo bar
В приведенном примере была создана символическая ссылка по имени bar
, указывающая на файл foo
.
Если мы выдадим список командой ls -i
, то увидим, что эти файлы имеют различные номера индексных дескрипторов:
$ ls -i foo bar
584785 bar 584706 foo
Однако, выдав список командой ls -l
, можно увидеть, что файл bar
является символической ссылкой, указывающей на файл foo
:
$ ls -l foo bar
lrwxrwxrwx 1 oleg oleg 3 May 18 19:18 bar -> foo
-rw-r--r-- 1 oleg oleg 0 May 18 19:17 foo
В символических ссылках не используются права доступа к файлу (иными словами, они всегда имеют форму rwxrwxrwx
).
В действительности, права доступа к символическим ссылкам определяются правами доступа к тому файлу, на который показывает символическая ссылка.
В операционной системе Linux особенно важны символические ссылки, указывающие на библиотеки общего пользования, находящиеся в каталоге /lib
.