Жёсткие ссылки
Каждый файл представляет собой область данных на жёстком диске компьютера или на другом носителе информации, которую можно найти по имени. В файловой системе Linux содержимое файла связывается с его именем при помощи жёстких ссылок. Создание файла с помощью любой программы означает, что будет создана жёсткая ссылка — имя файла, и открыта новая область данных на диске. Причём количество ссылок на одну и ту же область данных (файл) не ограничено, т. е. у файла может быть несколько имён.
Пользователь Linux может добавить файлу ещё одно имя (создать ещё одну жёсткую ссылку на файл) при помощи утилиты ln
сокращение от англ. «link» — «соединять, связывать»). Первый параметр — это имя файла, на который нужно создать ссылку, второй — имя новой ссылки. По умолчанию ссылка будет создана в текущем каталоге.
[methody@localhost methody]$ ln examples/text text-hardlink
[methody@localhost methody]$ ls -lR
./:
. . .
drwxr-xr-x 3 methody methody 4096 Окт 16 04:45 examples
-rw-r--r-- 2 methody methody 653 Окт 6 10:31 text-hardlink
./examples:
итого 92
-rw-r--r-- 1 methody methody 84718 Окт 6 10:31 -filename-with-
-rw-r--r-- 2 methody methody 653 Окт 6 10:31 text
Пример 12. Создание жёстких ссылок
Мефодий создал в своём домашнем каталоге жёсткую ссылку с именем «text-hardlink
» на файл «text
», который находится в подкаталоге «examples
». Выведя подробный список файлов текущего каталога и его подкаталогов («ls -lR
»), Мефодий обратил внимание, что у файлов «text
» и «text-hardlink
» совпадают и размер («653
»), и время создания. Это его совершенно не удивило, поскольку он знает, что теперь «/home/methody/text-hardlink
» и «/home/methody/examples/text
» — это два имени одного и того же файла. В подробном описании, выведенном командой «ls -l
», Мефодию остались непонятны только два первых поля. Как объяснил Гуревич, первое «слово», состоящее из знаков «-drwx
», — это обозначение прав доступа к файлу, о которых речь пойдёт в лекции Права доступа. А следующее за ним число — количество жёстких ссылок на данный файл или каталог. У «text
» и «text-hardlink
» стоит число «2
» — у этого файла два имени.
Доступ к одному и тому же файлу при помощи нескольких имён может понадобиться в следующих случаях:
- Одна и та же программа известна под несколькими именами.
- Доступ пользователей к некоторым каталогам в системе может быть ограничен из соображений безопасности. Однако если всё же нужно организовать доступ пользователей к файлу, который находится в таком каталоге, можно создать жёсткую ссылку на этот файл в другом каталоге.
- Современные файловые системы даже на домашних персональных компьютерах могут насчитывать до нескольких десятков тысяч файлов и тысячи каталогов. Обычно у таких файловых систем сложная многоуровневая иерархическая организация — в результате пути ко многим файлам становятся очень длинными. Чтобы организовать более удобный доступ к файлу, который находится очень «глубоко» в иерархии каталогов, также можно использовать жёсткую ссылку в более доступном каталоге.
- Полное имя некоторых программ может быть весьма длинным (например, i586-alt-linux-gcc-3.3), к таким программам удобнее обрщаться при помощи сокращённого имени (жёсткой ссылки) — gcc-3.3.
Индексные дескрипторы
Поскольку благодаря жёстким ссылкам у файла может быть несколько имён, понятно, что вся существенная информация о файле в файловой системе привязана не к имени. В файловых системах Linux вся информация, необходимая для работы с файлом, хранится в индексном декрипторе. Для каждого файла существует индексный дескриптор: не только для обычных файлов, но и для каталогов, файлов-дырок и т. д. Каждому файлу соответствует ровно один индексный дескриптор.
Каталоги в Linux — тоже файлы особого типа, см. раздел Filesystem..Система файлов: каталоги
Индексный дескриптор — это описание файла, в котором содержится:
- тип файла (обычный файл, каталог, файл-дырка и т. д.);
- права доступа к файлу;
- информация о том, кому принадлежит файл;
- отметки о времени создания, модификации, последнего доступа к файлу;
- размер файла;
- указатели на физические блоки на диске, принадлежащие этому файлу — в этих блоках хранится «содержимое» файла.
Все индексные декрипторы пронумерованы, поэтому номер индексного дескриптора — это уникальный идентификатор файла в файловой системе — в отличие от имени файла (жёсткой ссылки на него), которых может быть несколько. Узнать номер индексного дескриптора любого файла можно при помощи всё той же утилиты ls
с ключом -i
:
[methody@localhost methody]$ ls -i ./text-hardlink examples/text
127705 examples/text 127705 ./text-hardlink
Пример 13. Информация об индексных дескрипторах файлов
Мефодий решил поинтересоваться номерами индексных дескрипторов файла «text
» и жёсткой ссылки на него «text-hardlink
» — он обнаружил, что эти номера совпадают («127705
»), то есть этим двум именам соответствует один индексный дескриптор, т. е. один и тот же файл.
Все операции с файловой системой — создание, удаление и перемещение файлов — производятся на самом деле над индексными дескрипторами, имена нужны только для того, чтобы пользователь мог легко ориентироваться в файловой системе. (Было бы очень неудобно запоминать многозначный номер каждого нужного файла или каталога.) Более того, имя (или имена) файла не указаны в его индексном дескрипторе. В файловой системе Ext2 имена файлов хранятся в каталогах: каждый каталог представляет собой список имён файлов и номеров их индексных дескрипторов. Жёсткую ссылку (имя файла, хранящееся в каталоге) можно представлять как каталожную карточку, на которой указан номер индексного дескриптора — идентификатор файла.
- жёсткая ссылка
- Запись вида
имя файла+номер индексного дескриптора
в каталоге. Жёсткие ссылки в Linux — основной способ обратиться к файлу по имени.
Символьные ссылки
У жёстких ссылок есть два существенных ограничения:
- Жёсткая ссылка может указывать только на файл, но не каталог, потому что в противном случае в файловой системе могут возникнуть циклы — бесконечные пути.
- Жёсткая ссылка не может указывать на файл на другой файловой системе. Например, невозможно создать на жёстком диске жёсткую ссылку на файл, расположенный на дискете.
Причина этого ограничения в том, что номер индексного дескриптора уникален только в рамках одной файловой системы. В разных файловых системах могут оказаться два разных файла с одинаковым номером индексного дескриптора, в результате будет невозможно установить, на какой из них указывает жёсткая ссылка.
Чтобы избежать этих ограничений, были разработаны символьные ссылки. Символьная ссылка — это просто файл, в котором содержится имя другого файла. Символьные ссылки, как и жёсткие, предоставляют возможность обращаться к одному и тому же файлу по разным именам. Кроме того, символьные ссылки могут указывать и на каталог, чего не позволяют жёсткие ссылки. Символьные ссылки называются так потому, что содержат символы — путь к файлу или каталогу.
- символьная ссылка
- Файл особого типа («
l
»), в котором содержится путь к другому файлу. Если на пути к файлу встречается символьная ссылка, система выполняет подстановку: исходный путь заменяется на тот, что содержится в ссылке.
Символьную ссылку можно создать при помощи команды ln
с ключом «-s
» (сокращение от «symbolic»):
[methody@localhost methody]$ ln -s examples/text text-symlink
[methody@localhost methody]$ ls -li
. . .
127699 drwxr-xr-x 2 methody methody 4096 Окт 4 17:12 examples
127705 -rw-r--r-- 2 methody methody 653 Сен 30 10:04 text-hardlink
3621 lrwxrwxrwx 1 methody methody 13 Окт 4 18:05 text-symlink -> examples/text
[methody@localhost methody]$
Пример 14. Создание символьных ссылок
Теперь Мефодий решил создать в своём домашнем каталоге и символьную ссылку на файл text
и назвать её text-symlink
. Команда ls -li
отобразила этот файл совсем не так, как остальные: стрелочка («->») указывает, куда направлена ссылка. Кроме того, Мефодий обратил внимание, что номер индексного дескриптора (первое поле), размер и время создания файла text-symlink
отличаются text-hardlink
, а также во втором поле (количество жёстких ссылок на файл) text-symlink
указано «1
». Все эти признаки недвусмысленно свидетельствуют о том, что text-symlink
и text
— это разные файлы. Однако если выполнить команду cat text-symlink
, то на экран будет выведено содержимое файла text
.
Символьная ссылка вполне может содержать имя несуществующего файла, в этом случае ссылка будет существовать, но не будет «работать»: например, если попробовать вывести содержимое такой «битой» ссылки при помощи команды cat
, будет выдано сообщение об ошибке.
Узнать, куда указывает символьная ссылка, можно при помощи утилиты realpath
:
[methody@localhost methody]$ realpath text-symlink
/home/methody/examples/text
Пример 15. Раскрытие символьных ссылок