Символические ссылки: основы работы

Символическая ссылка (симлинк, англ. symbolic link, symlink) позволяют связывать файлы и каталоги с другими файлами и каталогами. У таких ссылок есть много названий: их называют ссылками оболочки, программными или «мягкими» ссылками, ярлыками и псевдонимамами. С точки зрения пользователя символические ссылки очень похожи на обычные файлы и каталоги. Однако, взаимодействуя с ними, вы фактически взаимодействуете с целевым объектом на другом конце ссылки. Поэтому симлинк проще всего представить в виде червоточины в вашей файловой системе.

В этом руководстве мы поговорим о том, что такое символические ссылки и как их создавать с помощью командной строки Linux и команды ln.

Требования

Чтобы следовать этому руководству, вам потребуется доступ к компьютеру с операционной системой Linux. Подойдет и виртуальный сервер, к которому вы подключаетесь через SSH, и просто ваш локальный компьютер. Обратите внимание: мы проверили данный мануал на сервере Ubuntu 20.04, но приведенные в нем команды и примеры должны работать на компьютерах с любой версией любого дистрибутива Linux.

Если для выполнения инструкций вы планируете использовать свежий удаленный сервер, мы рекомендуем вам сначала подготовить сервер к работе с помощью этого материала. Вы узнаете, как настроить безопасную серверную среду, в том числе пользователя sudo и брандмауэр UFW.

Создание тестовой файловой системы

Системный вызов, необходимый для создания символических ссылок, обычно доступен в Unix-подобных и POSIX-совместимых операционных системах. Для создания ссылок мы будем использовать команду ln.

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

Для начала давайте создадим в каталоге /tmp/ пару новых каталогов. Каталог /tmp/ предназначен для временных (temporary) файлов, то есть все хранящиеся здесь файлы и каталоги будут удалены при следующей загрузке сервера. Это очень удобно: вы можете создать столько каталогов, файлов и ссылок, сколько захотите, и не беспокоиться о том, что впоследствии они засорят систему.

Следующая команда mkdir создает сразу три каталога: сначала каталог symlinks/ внутри /tmp/, а затем – каталоги one/ и two/ внутри symlinks/.

mkdir -p /tmp/symlinks/{one,two}

Перейдите в новый каталог symlinks/:

cd /tmp/symlinks

Создайте здесь пару тестовых файлов, по одному в каждом из подкаталогов внутри symlinks/. Следующая команда создает в подкаталоге one/ файл one.txt, единственным содержимым которого является строка one:

echo "one" > ./one/one.txt

Аналогично, следующая команда создает в подкаталоге two/ файл two.txt, который содержит только строку two:

echo "two" > ./two/two.txt

Если на этом этапе запустить команду tree, чтобы отобразить содержимое каталога /tmp/symlinks и всех вложенных подкаталогов, мы получили бы такой вывод:

tree

.
├── one
│   └── one.txt
└── two
    └── two.txt

2 directories, 2 files

Примечание: Если команда tree не установлена на вашем компьютере по умолчанию, вы можете установить ее с помощью стандартного менеджера пакетов вашей системы. Например, в Ubuntu установить ее можно с помощью apt:

sudo apt install tree

Итак, мы подготовили среду и теперь можем попрактиковаться в создании символических ссылок.

Что такое жесткие ссылки?

Жесткая ссылка – это зеркальная копия исходного файла с точно таким же содержимым.

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

Жесткие ссылки широко применяются, но в некоторых случаях их следует избегать. Например, избегать их нужно внутри репозитория git, поскольку они могут создать путаницу.

По умолчанию команда ln создает жесткие ссылки. Чтобы с ее помощью создать симлинк, команде ln нужно передать параметр -s (или –symbolic).

Примечание: Поскольку символические ссылки используются чаще, чем жесткие, вы можете сразу создать псевдоним для команды ln -s:

alias ln="ln -s"

Конечно, это сэкономит вам всего несколько нажатий клавиш, но если вы создаете много символических ссылок, это может значительно упростить вам работу.

Работа с символическими ссылками

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

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

На примере файлов и каталогов (мы создали их в первом разделе) попробуйте создать символическую ссылку по имени three, которая указывает на каталог one:

ln -s one three

Теперь у вас должно быть 3 каталога, один из которых указывает на другой. Чтобы получить более подробный обзор текущей структуры каталогов, вы можете использовать команду ls и вывести содержимое текущего рабочего каталога:

ls

Вы увидите:

one  three  two

Теперь в каталоге symlinks/ есть три каталога. В зависимости от вашей системы это может означать, что каталог three на самом деле является символической ссылкой. Иногда в выводе имя ссылки выделяется другим цветом или к нему добавляется символ @.

Для большей детализации вывода вы можете передать команде ls аргумент -l, чтобы определить, куда на самом деле указывает символическая ссылка:

ls -l

На экране появится:

total 8
drwxrwxr-x 2 8host 8host 4096 Oct 30 19:51 one
lrwxrwxrwx 1 8host 8host    3 Oct 30 19:55 three -> one
drwxrwxr-x 2 8host 8host 4096 Oct 30 19:51 two

Обратите внимание, ссылка three указывает на каталог one, как и ожидалось. Кроме того, в выводе его имя начинается с l, что указывает на то, что это ссылка. Два других элемента начинаются с d, что означает, что это обычные каталоги.

Символические ссылки также могут содержать символические ссылки. В качестве примера давайте попробуем связать файл one.txt из каталога three с каталогом two:

ln -s three/one.txt two/one.txt

Теперь у вас должен быть файл one.txt внутри каталога two. Вы можете проверить это с помощью следующей команды ls:

ls -l two/

total 4
lrwxrwxrwx 1 8host 8host 13 Oct 30 19:58 one.txt -> three/one.txt
-rw-rw-r-- 1 8host 8host  4 Oct 30 19:51 two.txt

В зависимости от конфигурации вашего терминала ссылка (выделенная выше) может отображаться в красном цвете, что указывает на то, что она не работает. Хотя ссылка и была создана, но для ее создания использовался относительный путь. Ссылка не работает, потому что каталог two не содержит каталога three с файлом one.txt в нем.

К счастью, вы можете исправить эту ситуацию при помощи команды ln. Она может создать симлинк относительно расположения ссылки с помощью аргумента -r (или –relative).

Однако даже с флагом -r вы не сможете исправить неработающую символическую ссылку. Причина ошибки в том, что символическая ссылка уже существует, и вы не сможете перезаписать ее, не добавив аргумент -f (или –force):

ln -srf three/one.txt two/one.txt

Теперь у вас есть файл two/one.txt, он связан с three/one.txt, который является ссылкой на one/one.txt.

Вложение символических ссылок может быстро превратиться в путаницу, но многие приложения умеют делать подобные структуры ссылок более понятными. Например, команда tree покажет, что отображаемая цель ссылки на самом деле соответствует расположению исходного файла, а не самой ссылке:

tree

.
├── one
│   └── one.txt
├── three -> one
└── two
    ├── one.txt -> ../one/one.txt
    └── two.txt

3 directories, 3 files

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

Чтобы понять, что содержат ваши файлы, выполните следующую команду cat.

cat {one,two,three}/one.txt

Она выведет на экран содержимое файла one.txt в каждом из трех каталогов, созданных вами в этом руководстве:

one
one
one

Затем обновите содержимое исходного файла one.txt в каталоге one/:

echo "1. One" > one/one.txt

Снова проверьте содержимое каждого файла:

cat {one,two,three}/one.txt

Вы получите такой результат:

1. One
1. One
1. One

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

Теперь попробуем сделать обратное – изменить содержимое одной из символических ссылок. Выполните следующую команду, чтобы изменить содержимое файла one.txt в каталоге three/:

echo "One and done" > three/one.txt

Затем еще раз проверьте содержимое каждого файла:

cat {one,two,three}/one.txt

На экране появится:

One and done
One and done
One and done

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

Заключение

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

Tags: ,

Добавить комментарий