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