Различные файловые системы во вселенной UNIX / Linux допускают различные записи, такие как обычные файлы, каталоги, сокеты, именованные каналы и ссылки. В этой статье я объясню вам, что такое ссылки, какие типы ссылок существуют, как создать символическую ссылку и как легко обнаружить неработающие символические ссылки. Ссылки позволяют иметь несколько точек входа в файловую систему, позволяя иметь намного меньше копий (иногда только одну), но при этом сохраняя гибкость, имея несколько способов доступа к заданному файлу.
Связывание записей
В командной строке UNIX / Linux инструмент ln
сокращает термин ссылка.
Это позволяет вам создать дополнительную ссылку на файл или каталог. Это
достигается путем добавления дополнительного имени записи в таблицу
размещения файлов файловой системы. Сделав это, вы можете получить
доступ к указанному файлу или каталогу как с исходным, так и с новым
именем. Подумайте, что один человек может быть сотрудником, клиентом и
потенциальным клиентом.
Инструмент ln
входит в список необходимого программного обеспечения в
Unix / Linux. В Debian GNU / Linux и Ubuntu он является частью пакета
coreutils
.
Жесткие ссылки против софтлинков
Существует четкое различие между жесткими и мягкими ссылками. Мягкие ссылки также называются символическими ссылками. Существует довольно много различий между этими двумя типами, как указано ниже:
Жесткие ссылки Мягкая ссылка (символическая ссылка)
Цель должна существовать Цель может уже существовать, но не обязательно Разрешено только в файловых системах Разрешено между разными файловыми системами Ссылки непосредственно на место хранения файла Ссылки на запись в таблице файловой системы (узел) Удаление ссылки означает удаление всего файла Удаление ссылки означает удаление ссылки на узел, а не сам файл
Как создавать символические ссылки
Выполнение команды ln
без параметров создает жесткую ссылку от
источника к месту назначения. Вместо этого с помощью параметра -s
создается символическая ссылка. -s
- это короткое имя параметра, а
--symbolic
- более длинное имя. Ссылка будет создана в текущем
каталоге файловой системы в момент ее создания. Разработчики просто
используют термин символическая ссылка. В общем, назовите это так:
$ ln -s [target] [link_name]
target
- это файл или каталог, на который нужно link_name
ссылку, а
link_name - это имя ссылки, которая должна ссылаться на цель. Например,
этот вызов создает символическую ссылку от link_to_python
к
/usr/bin/python
:
Пример 1: Создание символической ссылки
$ ln -s /usr/bin/python link_to_python
$ ls -la link_to_python
lrwxrwxrwx 1 frank frank 15 Oct 5 14:25 link_to_python -> /usr/bin/python
Чтобы увидеть, что ln
, полезная опция -v
( --verbose
для более
длинной опции). Это дает вам дополнительную информацию о действии.
Пример 2: Создание символической ссылки с дополнительной информацией
$ ln -sv /usr/bin/python link_to_python
link_to_python -> /usr/bin/python
Как видите, вывод команды отображает созданную новую ссылку.
Сценарии использования
Во-первых, обычным вариантом использования, о котором вы, возможно, не
знали, являются две часто используемые записи файловой системы - .
(локальный каталог) и ..
(родительский каталог). Они реализованы как
символические ссылки.
Во-вторых, разработчики устанавливают несколько версий программы для проведения своих тестов. Использование символических ссылок может стать очень удобным для ссылки на текущую версию, которая тестируется, и позволяет без особых проблем поддерживать доступными два или более экземпляра.
Поиск мертвых символических ссылок
Что, если вы удалите файл, на который указывает символическая ссылка? Мы
называем эти ссылки с несуществующей «целью» «мертвыми». Для обнаружения
таких случаев весьма полезна команда
find. Поэтому в игру
вступают -L
и -type l
Флаг -L
find
следовать символическим
ссылкам, в то время как -type l
будет соответствовать только
символическим ссылкам.
В примере 3 текущий каталог содержит два файла с именами auto
и
backup
, а также две символические ссылки - data
указывающие на
auto
, и generic
указывающие на files
. К сожалению, файл /
каталог files
Используя команду find
, мы можем проверить ссылки и вывести их имена
в случае, если цель ссылки не существует. В нашем случае это
символическая ссылка с именем generic
указывающая на несуществующие
files
Пример 3: Обнаружение битых ссылок с помощью find
$ ls -la
total 4
drwxr-xr-x 2 frank frank 1024 Oct 5 13:36 .
drwxrwxrwt 44 root root 3072 Oct 5 13:35 ..
-rw-r--r-- 1 frank frank 0 Oct 5 13:34 auto
-rw-r--r-- 1 frank frank 0 Oct 5 13:34 backup
lrwxrwxrwx 1 frank frank 1 Oct 5 13:35 data -> auto
lrwxrwxrwx 1 frank frank 1 Oct 5 13:35 generic -> files
$ find -L . -type l
./generic
В качестве альтернативы вам может понравиться команда symlinks
. Это
нестандартный пакет, доступный как для Debian GNU / Linux, так и для
Ubuntu. С двумя параметрами -s
и -v
symlinks
обнаруживают записи.
Как показано в примере 4 ниже, ссылки без действительных целей
классифицируются как висячие.
Пример 4: Обнаружение битых ссылок с помощью symlinks
$ symlinks -sv .
dangling: /directory/generic -> files
relative: /directory/data -> auto
Заключение
В концепции символических ссылок нет большой загадки. Создание этих ссылок может упростить использование программного обеспечения и помогает тестировать его разные версии в одной и той же системе. Имейте в виду, чтоLinux Professional Institute (LPI) задаст вам вопросы об этом во время сертификации для LPI1.
Благодарности
Автор благодарит Герольда Рупрехта за поддержку и критику при подготовке этой статьи.