четверг, 14 июля 2011 г.

Создание жёстких и мягких ссылок в Linux

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

Ссылки бывают жёсткими и мягкими (или, вернее, символическими). Жёсткая ссылка ссылается на тот же объект, что и исходный файл. То есть, во-первых, при внесении изменений в файл по жёсткой ссылке изменится и содержимое исходного файла, а во-вторых, при удалении исходного файла, жёсткая ссылка все равно будет ссылаться на его содержимое и, таким образом, объект удалён не будет. В этом смысле жёсткая ссылка и исходный файл абсолютно равноправны и ссылка, фактически, является просто альтернативным названием файла. Объект же будет удалён только после удаления всех жёстких ссылок на него.

Иначе обстоит дело с символьными ссылками. Они ссылаются не на объект, а на его имя на диске. То есть так же, как и для жёстких ссылок, при редактировании файла по мягкой ссылке будет изменяться содержимое исходного объекта, однако при удалении исходного файла, ссылка будет вести уже в никуда. При этом мягкая ссылка, вообще говоря, может ссылаться в никуда, в то время как при создании жёсткой ссылки существование объекта, на который она будет ссылаться, обязательно.

Для создания ссылки используется команда ln. У неё два обязательных аргумента: первый - путь к исходному файлу, второй - название создаваемой ссылки (возможно, с указанием пути к ней), например,
> ln ~/Documents/paper.odt ~/Desktop/paper.odt
создаст на рабочем столе жёсткую ссылку paper.odt на файл paper.odt, располагающийся в папке с документами. Замечу, что это не равносильно копированию файла, поскольку 1) при редактировании любого из этих двух файлов, изменяется и второй файл; 2) при создании ссылки объём свободного дискового пространства уменьшается незначительно.

Если в команде ln указать флаг -s будет создана символьная ссылка. Например,
> ln -s ~/Documents/paper.odt ~/Desktop/paper.odt
создаст на рабочем столе символьную ссылку paper.odt. Важно отметить, что если для мягкой ссылки первым аргументом указать не полный путь к файлу, а относительный, то при её перемещении, она будет ссылаться уже на какой-то новый файл (или в никуда, если файл с таким именем отсутствует). Для жёстких ссылок это не так, поскольку они привязываются не к имени файлу, а к самому объекту, который связан с этим именем. Символьная ссылка - единственный способ сослаться на директорию, а не на файл. Собственно, именно для этого они обычно и используются, потому что помимо прочего символьные ссылки, вообще говоря, работают медленнее, чем жёсткие.


И последнее, при выводе команды ls с флагом -l наличие жёстких ссылок на файл будет помечаться счётчиком таких ссылок:
> ls -l
> total 1
> -rw-r--r-- 2 flerant nogroup 382653 2011-07-13 11:21 paper.odt
Счётчик в примере выше показывается после прав доступа к файлу (-rw-r--r--). Наличие мягких ссылок счётчиком не учитывается. Отличительной особенностью жёстких ссылок является то, что при выводе команды ls и для ссылки, и для исходного файла указывается настоящий размер объекта.

При выводе команды ls в папке, где содержится символьная ссылка, она помечается особым образом (буквой l в правах доступа и стрелочкой -> в названии файла с указанием адреса ссылки) и указывается её размер, а не размер файла, на который она ссылается:
> ls -l
> total 1
> lrw-r--r-- 1 flerant nogroup 33 2011-07-13 11:28 paper.odt -> /home/flerant/Documents/paper.odt