Когда мы выполняем команду ls -l
-rw-r--r-- 1 Flenov FlenovG 118 Nov 26 16:10 1.txt
Если к директиве добавить ключ i
ls -il
), то к выводимой информации добавится еще и дескриптор файла:913021 -rw-r--r-- 1 Flenov FlenovG 118 Nov 26 16:10 l.txt
Первое число и есть дескриптор, по которому определяется физическое расположение файла.
Жесткая ссылка указывает непосредственно на данные и имеет такой же дескриптор. Таким образом, файл физически не удаляется из системы, пока не будут уничтожены все жесткие ссылки. По сути, каждое имя файла уже является жесткой ссылкой на данные.
Для создания таких ссылок используется команда ln
ln имя_файла имя_ссылки
В ответ на это программа создаст жесткую ссылку с именем имя_ссылки
имя_файла
.Чтобы на практике проверять все, что будет рассматриваться дальше, создайте в своей системе файл 1.txt. Для этого можно выполнить команду:
cat > 1.txt
Нажмите клавишу
Создадим для файла 1.txt жесткую ссылку. Для этого выполните следующую команду:
ln 1.txt link.txt
С помощью команды cat link.txt
ls -il
, чтобы просмотреть содержимое каталога. В списке файлов должны быть две строки:913021 -rw-r--r-- 2 root root 0 Feb 22 12:19 1.txt
913021 -rw-r--r-- 2 root root 0 Feb 22 12:19 link.txt
Обратите внимание, что первая колонка, в которой находится дескриптор для обоих файлов, содержит одинаковые значения. В третьей колонке стоит число 2, что говорит о наличии двух ссылок на данные.
Теперь попробуем изменить содержимое любого из этих файлов. Для этого выполним следующие команды:
ls > link.txt
cat 1.txt
В первой строке мы сохраняем в файле link.txt результат работы команды ls
Давайте попробуем удалить файл 1.txt и посмотреть на каталог и содержимое файла link.txt. Для этого выполните следующие команды:
rm 1.txt
ls -il
cat link.txt
Файл 1.txt будет удачно удален. А вот содержимое жесткой ссылки link.txt никуда не денется. То есть данные на диске не были уничтожены, а исчезло только имя 1.txt. Обратите внимание, что у файла link.txt в третьей колонке уменьшилось значение счетчика ссылок до единицы.
Символьная ссылка указывает не на данные, а на имя файла. Это дает некоторые преимущества, но одновременно возникает большое количество проблем. Для создания символьной ссылки нужно использовать команду ln
-s
. Например:ln -s link.txt symbol.txt
Посмотрим на результат с помощью команды ls -il
913021 -rw-r--r-- 1 root root 519 Feb 22 12:19 link.txt
913193 lrwxrwxrwx 1 root root 8 Feb 22 12:40 symbol.txt -> link.txt
Теперь дескрипторы файлов разные, но для link.txt
l
". Как раз она и указывает на то, что мы имеем дело с символьной ссылкой. Третий параметр равен единице, а последний — после знака "->
" содержит имя файла, на который указывает ссылка.Попробуем удалить основной файл и после этого просмотреть содержимое ссылки symbol.txt:
rm link.txt
ls -il
cat symbol.txt
В первой строке мы удаляем файл link.txt. Вторая команда отображает список директорий. Убедитесь, что файла link.txt нет. Если вы используете Red Hat- дистрибутив, то команда ls
ls --color=tty -il
.Строка, содержащая информацию о ссылке symbol.txt, должна быть красного цвета, а текст — мигающий белый. Это говорит о том, что ссылка "битая", т.е. указывает на несуществующий файл. Команда cat symbol.txt
Самое интересное, что если попытаться записать какие-либо данные в файл symbol.txt, то файл link.txt будет автоматически создан. Это огромный недостаток, поэтому вы должны следить за символьными ссылками перед удалением файлов.