Работа со ссылками на файлы и каталоги


Ссылки позволяют давать файлу сразу несколько имён. В файловой системе, используемой в Linux, файлы в системе распознаются по их номеру индексного дескриптора (inode number). Этот номер является уникальным во всей файловой системе. Каталог же представляет собой список номеров индексных дескрипторов и соответствующих имён файлов. Каждое имя файла в каталоге связано с некоторым индексным дескриптором.

Жёсткие ссылки
Для создания нескольких ссылок к одному файлу служит команда ln. Пусть, например, в текущем каталоге имеется файл с именем foo. Увидеть соответствующий ему номер индексного дескриптора можно с помощью команды ls -i. Пример:

/home/larry# ls -i foo 22192 foo /home/larry#
Здесь файлу foo соответствует индексный дескриптор номер 22192 файловой системы. К файлу foo можно создать ещё одну ссылку и назвать её bar. Это делается следующим образом:

/home/larry# ln foo bar
Теперь с помощью команды ls -i можно увидеть, что оба файла относятся к одному и тому же индексному дескриптору:

/home/larry# ls -i foo bar
22192 bar 22192 foo
/home/larry#
Теперь, обращаясь к файлу foo или bar, мы, в действительности, будем обращаться к одному и тому же файлу. Производя изменения в файле foo, мы можем увидеть, что они появились также и в файле bar. Со всех точек зрения файлы foo и bar — это один и тот же файл.

Подобные ссылки называются жёсткими ссылками (hard links), поскольку они создают непосредственную связь с конкретным индексным дескриптором. Отметим, что жёсткие ссылки можно создавать только тогда, когда файлы находятся в одной и той же файловой системе, в то время как символические ссылки (см. ниже) не имеют таких ограничений.

При удалении файла командой rm в действительности удаляется только одна ссылка на файл. Если мы теперь введём команду

/home/larry# rm foo
то будет удалена только ссылка под названием foo, а ссылка bar будет продолжать существовать. По-настоящему файл будет удалён из файловой системы только тогда, когда на него не останется больше ссылок. Обычно на один файл имеются только одна ссылка, так что команда rm его удалит. Однако если к файлу имеются множественные ссылки, то команда rm будет удалять только одну ссылку, и для того, чтобы этот файл удалить, придётся удалять все ссылки на этот файл.

Команда ls -l выдаёт (помимо прочей информации) число ссылок на каждый файл.

/home/larry# ls -l foo bar
-rw-r--r-- 2 root root 12 Aug 5 16:51 bar
-rw-r--r-- 2 root root 12 Aug 5 16:50 foo
/home/larry#
Цифра 2 во второй колонке этого списка обозначает число ссылок на файл.

Отметим, что каталог в действительности представляет собой просто файл, содержащий информацию о связях (ссылках) между именами файлов и индексными дескрипторами. Также каждый каталог содержит, как минимум, две жёстких ссылки: ссылка . указывает на сам каталог, а ссылка .. указывает на родительский каталог. У корневого каталога (/) ссылка .. указывает на сам корневой каталог /. Иными словами, родительским каталогом корневого каталога является тот же самый каталог.

Символические ссылки
С помощью символических ссылок (symbolic links) можно дать файлу другое имя, но не связывать файл с индексным дескриптором. Таким образом, символические ссылки отличаются от жёстких ссылок.

Символические ссылки создаются командой ln -s. Например, команда

/home/larry# ln -s foo bar
создаёт символическую ссылку по имени bar, которая указывает на файл foo. Если мы выдадим список командой ls -i, то мы увидим, что эти два файла имеют различные номера индексных дескрипторов.

/home/larry# ls -i foo bar
22195 bar 22192 foo
/home/larry#
Однако, выдав список командой ls -l, можно увидеть, что файл bar является символической ссылкой, указывающей на файл foo.

/home/larry# ls -l foo bar
-rwxrwxrwx 1 root root 3 Aug 5 16:51 bar -> foo
-rw-r--r-- 1 root root 12 Aug 5 16:50 foo
/home/larry#
В символических ссылках не используются права доступа к файлу (иными словами, они всегда имеют форму rwxrwxrwx). В действительности, права доступа к символическим ссылкам определяются правами доступа к тому файлу, на который показывает символическая ссылка (в нашем примере это файл foo).

При том, что между жёсткими и символическими ссылками есть функциональное сходство, между ними есть и отличия. Во-первых, можно создать символическую ссылку на файл, который не существует, а сделать то же с жест кой ссылкой нельзя. Во-вторых, символические ссылки обрабатываются ядром системы иначе, чем жёсткие ссылки; эта разница может показаться чисто технической, но иногда она важна. С помощью символических ссылок просто установить, на какой файл они показывают, а с жёсткими ссылками простого способа определить, какие ещё файлы связаны с данным индексным дескриптором, нет.

Ссылки широко используются в системе Linux. Особенно важны символические ссылки, которые указывают на библиотеки общего пользования, находящиеся в каталоге /lib.