Индексный дескриптор
Для пользователя файл представляет собой область данных на диске, доступную по имени файла. Однако в операционных системах, работающих на ядре Linux, вся информация о файле связана не с его именем, а с уникальным числовым индексным дескриптором. Этот дескриптор включает всю необходимую информацию о файле: блоки дискового пространства, в которых хранится содержимое, размер файла, время его создания, последней модификации и так далее.
Файловые индексные дескрипторы содержатся в специальной таблице, и каждый диск — как логический, так и физический — располагает собственным набором таких таблиц.
В реальности индексный номер и есть настоящее имя файла в системе. Мы можем его просмотреть с помощью ключа -i в команде ls.
Жесткие ссылки
Индексные дескрипторы, по своей сути числовые, и работа с ними в условиях большого количества файлов может быть неудобной. Поэтому файлы обычно наделяются понятными именами, которые, хотя и не содержат информации о самом файле, выступают указателями на его дескриптор.
Файл, имеющий имя, которое ссылается на его индексный дескриптор, имеет жесткую ссылку. Этот механизм — основной способ обращения к файлу в подобных Unix операционных системах.
Так как файл определяется уникальным номером дескриптора, количество жестких ссылок на него может быть множественным, и все они будут указывать на один и тот же объект. Это приводит к тому, что у файла в Linux может быть несколько имен.
Представьте себе множественные дорожные знаки, указывающие на одну и ту же автозаправочную станцию: знаков много и расположены они в разных местах, но все указывают на одну точку назначения.
Но зачем требуется несколько имен файла? Все из-за удобства доступа из различных частей файловой системы, а также возможности предоставления доступа. Одно имя файла может находиться в одном каталоге, а другое — в совершенно ином месте.
В Linux, благодаря механизму жестких ссылок, удаление одной из них не удаляет сам файл, если у него остаются другие жесткие ссылки. Это очевидно, так как все жесткие ссылки обладают равными правами независимо от времени создания, местоположения в структуре каталогов и прочих факторов.
Файл будет существовать до тех пор, пока имеется хотя бы одна жесткая ссылка на него. Если все ссылки удалены, файл станет недоступным и будет удален из системы.
Символьные, или мягкие, ссылки
Жесткие ссылки обладают рядом ограничений:
- они могут быть созданы только на файлы, не на каталоги;
- жесткие ссылки нельзя создать на файлы, расположенные на других дисках.
Например, нельзя создать жесткую ссылку на файл, находящийся на съемном устройстве или другом разделе жесткого диска, поскольку каждый носитель имеет свою таблицу дескрипторов.
Вот почему в системах GNU/Linux поддерживается использование мягких ссылок, которые еще называют символьными ссылками. Они являются файлами, которые указывают на имена файлов, то есть на жесткие ссылки, а не на индексные дескрипторы. Мягкие ссылки в Linux аналогичны ярлыкам в Windows.
Жесткая ссылка ориентируется непосредственно на индексный дескриптор, тогда как мягкая направлена на жесткую ссылку. Если убрать все жесткие ссылки, мягкая ссылка перестанет функционировать и станет "битой".
На изображении представлена связь между символьными ссылками и именами файлов, а также индексными дескрипторами. Верхний квадрат символизирует индексный дескриптор файла, квадраты со скругленными углами — имена файлов, а круги — символьные ссылки. Один файл всегда имеет только один индексный дескриптор, но множество имен. Существует и неограниченное количество символьных ссылок на каждое имя файла.
Если жесткая ссылка, на которую указывала символьная, удаляется, последняя перестает работать, так как теряет связь с дескриптором. Если в этом примере удалить жесткую ссылку с именем logotip, файлы pic1 и tux становятся бесполезными, потому что открыть файл 555794 с помощью этих имен больше нельзя.
Жесткая ссылка — не копия!
Существует мнение, что копирование файлов и создание жестких ссылок идентичны, так как в итоге формируются как бы два файла. Однако это совершенно разные операции, приводящие к различным результатам.
При копировании файла создается новый файл, данные которого записываются на свободное дисковое пространство, получая свой собственный индексный дескриптор. В случае с жесткой ссылкой файл остается единственным, лишь добавляется новый указатель на него.
Это проявляется в практике следующим образом. Если вносить изменения в файл через одно его имя, они будут видны и при обращении через другое имя. Если же создать копию и изменить её содержимое, то данные исходного файла останутся без изменений.
Мягкие ссылки также создают новый файл (со своим уникальным индексным дескриптором), но не копируют данные исходного файла, а лишь содержат ссылку на другой файл. Символьная ссылка — это специальный тип файла в Linux.