После завершения этого раздела вы сможете с помощью жестких ссылок и символьных («мягких») ссылок сделать так, чтобы несколько имен файлов указывали на один и тот же файл.
Жесткие и символьные ссылки
Можно создать несколько имен, указывающих на один и тот же файл. Есть два способа сделать это: 1) создать жесткую ссылку на файл, 2) создать символьную ссылку (ее также называют мягкой ссылкой) на файл. У каждого способа есть свои преимущества и недостатки.
Создание жестких ссылок
Каждый файл начинается с одной жесткой ссылки ― с исходного имени на данные в файловой системе. Создавая новую жесткую ссылку на файл, вы создаете еще одно имя, которое указывает на те же данные. Новая жесткая ссылка действует точно так же, как исходное имя файла. Нет никакой разницы между новой жесткой ссылкой и исходным именем файла.
Узнать, сколько жестких ссылок есть у файла, можно с помощью команды ls -l. Среди прочего она показывает количество жестких ссылок для каждого файла.
[user@host ~]$ pwd /home/user [user@host ~]$ ls -l newfile.txt -rw-r--r--. 1 user user 0 Mar 11 19:19 newfile.txt
[user@host ~]$
pwd
ls -l newfile.txt
1
В предыдущем примере количество ссылок для файла newfile.txt ― 1. У файла один абсолютный путь — /home/user/newfile.txt.
newfile.txt
/home/user/newfile.txt
С помощью команды ln можно создать новую жесткую ссылку (другое имя), указывающую на существующий файл. Команде нужны как минимум два аргумента: путь к существующему файлу и путь к жесткой ссылке, которую необходимо создать.
В следующем примере показано создание жесткой ссылки с именем newfile-link2.txt для существующего файла newfile.txt в каталоге /tmp.
newfile-link2.txt
/tmp
[user@host ~]$ ln newfile.txt /tmp/newfile-hlink2.txt [user@host ~]$ ls -l newfile.txt /tmp/newfile-hlink2.txt -rw-rw-r--. 2 user user 12 Mar 11 19:19 newfile.txt -rw-rw-r--. 2 user user 12 Mar 11 19:19 /tmp/newfile-hlink2.txt
ln newfile.txt /tmp/newfile-hlink2.txt
ls -l newfile.txt /tmp/newfile-hlink2.txt
2
Чтобы узнать, являются ли два файла жесткими ссылками друг на друга, можно использовать команду ls с опцией -i для отображения списка номеров индексных дескрипторов для файлов. Если файлы находятся в одной файловой системе (эта ситуация рассматривается дальше) и их номера индексных дескрипторов совпадают, значит, файлы являются жесткими ссылками, указывающими на одни и те же данные.
-i
[user@host ~]$ ls -il newfile.txt /tmp/newfile-hlink2.txt 8924107 -rw-rw-r--. 2 user user 12 Mar 11 19:19 newfile.txt 8924107 -rw-rw-r--. 2 user user 12 Mar 11 19:19 /tmp/newfile-hlink2.txt
ls -il newfile.txt /tmp/newfile-hlink2.txt
8924107
У всех жестких ссылок, указывающих на один и тот же файл, одинаковые разрешения доступа, владельцы (пользователь и группа), метки времени, содержимое и количество ссылок. При изменении информации в одной жесткой ссылке все другие ссылки, указывающие на тот же файл, также будут изменены. Так происходит потому, что каждая жесткая ссылка указывает на одни и те же данные на запоминающем устройстве.
Даже если исходный файл будет удален, его содержимое по-прежнему будет доступно, пока существует хотя бы одна жесткая ссылка. Данные удаляются только при удалении последней жесткой ссылки.
[user@host ~]$ rm -f newfile.txt [user@host ~]$ ls -l /tmp/newfile-hlink2.txt -rw-rw-r--. 1 user user 12 Mar 11 19:19 /tmp/newfile-hlink2.txt [user@host ~]$ cat /tmp/newfile-hlink2.txt Hello World
rm -f newfile.txt
ls -l /tmp/newfile-hlink2.txt
cat /tmp/newfile-hlink2.txt
Ограничения жестких ссылок
Жесткие ссылки имеют некоторые ограничения. Во-первых, жесткие ссылки можно использовать только с обычными файлами. С помощью команды ln нельзя создать жесткую ссылку на каталог или специальный файл.
Во-вторых, жесткие ссылки можно использовать, только если оба файла находятся в одной и той же файловой системе. Иерархия файловой системы может состоять из нескольких запоминающих устройств. В зависимости от конфигурации системы, когда вы переходите в новый каталог, этот каталог и его содержимое могут оказаться в другой файловой системе.
Для отображения каталогов, находящихся в разных файловых системах, можно использовать команду df. Вывод может быть таким:
[user@host ~]$ df Filesystem 1K-blocks Used Available Use% Mounted on devtmpfs 886788 0 886788 0% /dev tmpfs 902108 0 902108 0% /dev/shm tmpfs 902108 8696 893412 1% /run tmpfs 902108 0 902108 0% /sys/fs/cgroup /dev/mapper/rhel_rhel8--root 10258432 1630460 8627972 16% / /dev/sda1 1038336 167128 871208 17% /boot tmpfs 180420 0 180420 0% /run/user/1000 [user@host ~]$
df
Файлы в двух разных каталогах, указанных в столбце Mounted on, и их подкаталогах находятся в разных файловых системах. (Приоритет получает наиболее конкретизированное совпадение.) В системе, показанной в этом примере, можно создать жесткую ссылку между файлами /var/tmp/link1 и /home/user/file, поскольку они оба находятся в подкаталогах каталога /, но не других каталогов в списке. Но создать жесткую ссылку между /boot/test/badlink и /home/user/file нельзя, поскольку первый файл находится в подкаталоге каталога /boot (в списке Mounted on), а второй файл ― нет.
/var/tmp/link1
/home/user/file
/
/boot/test/badlink
/boot
Создание символьных ссылок
Команда ln -s создает символьную ссылку, которую также называют «мягкой». Символьная ссылка — это не обычный файл, а особый тип файла, который указывает на существующий файл или каталог.
У символьных ссылок есть некоторые преимущества перед жесткими ссылками.
Они могут связывать два файла в разных файловых системах.
Они могут указывать на каталог или специальный файл, а не только на обычный файл.
В следующем примере используется команда ln -s для создания новой символьной ссылки с именем /tmp/newfile-symlink.txt на существующий файл /home/user/newfile-link2.txt.
/tmp/newfile-symlink.txt
/home/user/newfile-link2.txt
[user@host ~]$ ln -s /home/user/newfile-link2.txt /tmp/newfile-symlink.txt [user@host ~]$ ls -l newfile-link2.txt /tmp/newfile-symlink.txt -rw-rw-r--. 1 user user 12 Mar 11 19:19 newfile-link2.txt lrwxrwxrwx. 1 user user 11 Mar 11 20:59 /tmp/newfile-symlink.txt -> /home/user/newfile-link2.txt [user@host ~]$ cat /tmp/newfile-symlink.txt Soft Hello World
ln -s /home/user/newfile-link2.txt /tmp/newfile-symlink.txt
ls -l newfile-link2.txt /tmp/newfile-symlink.txt
l
cat /tmp/newfile-symlink.txt
В предыдущем примере первый символ длинного списка для /tmp/newfile-symlink.txt ― l, а не -. Это указывает на то, что файл является символьной ссылкой, а не обычным файлом. (Буква d указывает на то, что файл является каталогом.)
-
d
Если обычный исходный файл будет удален, символьная ссылка по-прежнему будет указывать на файл, но ее целевой элемент будет отсутствовать. Символьная ссылка, указывающая на отсутствующий файл, называется висячей символьной ссылкой.
[user@host ~]$ rm -f newfile-link2.txt [user@host ~]$ ls -l /tmp/newfile-symlink.txt lrwxrwxrwx. 1 user user 11 Mar 11 20:59 /tmp/newfile-symlink.txt -> /home/user/newfile-link2.txt [user@host ~]$ cat /tmp/newfile-symlink.txt cat: /tmp/newfile-symlink.txt: No such file or directory
rm -f newfile-link2.txt
ls -l /tmp/newfile-symlink.txt
У висячей символьной ссылки в предыдущем примере есть побочный эффект: если позже вы создадите новый файл с таким же именем, как у удаленного файла (/home/user/newfile-link2.txt), символьная ссылка больше не будет «висеть», а будет указывать на новый файл.
Жесткие ссылки так не работают. Если вы удалите жесткую ссылку, а затем с помощью обычных средств (а не с помощью команды ln) создадите новый файл с тем же именем, новый файл не будет связан со старым файлом.
Следующее сравнение поможет вам лучше понять принцип работы жестких и символьных ссылок.
Жесткая ссылка связывает имя с данными на запоминающем устройстве.
Символьная ссылка связывает имя с другим именем, которое указывает на данные на запоминающем устройстве.
Символьная ссылка может указывать на каталог. Тогда она действует как каталог. Если перейти к символьной ссылке с помощью команды cd, текущий рабочий каталог станет связанным каталогом. Некоторые утилиты могут учитывать тот факт, что вы перешли по символьной ссылке. Например, команда cd по умолчанию изменяет текущий рабочий каталог, используя имя символьной ссылки, а не имя фактического каталога. (Если указать опцию -P, будет использоваться имя фактического каталога.)
-P
В следующем примере создается символьная ссылка с именем /home/user/configfiles, указывающая на каталог /etc.
/home/user/configfiles
/etc
[user@host ~]$ ln -s /etc /home/user/configfiles [user@host ~]$ cd /home/user/configfiles [user@host configfiles]$ pwd /home/user/configfiles
ln -s /etc /home/user/configfiles
cd /home/user/configfiles
[user@host configfiles]$
Man-страница ln(1)
info ln (ln: создание ссылок между файлами)