Связывание

Опубликовано mensh - вт, 11/22/2005 - 15:31

Ссылки, широко используемые в операционной системе Linux позволяют давать файлу сразу несколько имён.

Связывание ссылками в 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.

Поделиться с друзьями