Что такое символьная ссылка в linux
Перейти к содержимому

Что такое символьная ссылка в linux

  • автор:

Создание ссылок в Linux

В командной оболочке Linux, чтобы создать еще одну жесткую ссылку на файл, то есть еще одно имя, используется команда ln (от «link» – ссылка, связывать). Первым аргументом указывается существующее имя файла, вторым – имя новой ссылки. Адреса обоих аргументов могут быть как относительными, так и абсолютными.

Создание жесткой ссылки

В примере для файла butt2.png , который находится в каталоге image , создаются две дополнительные жесткие ссылки. Одна – в текущем каталоге ( ./ ), другая – в папке Загрузки . В первом случае файл не переименовывается, т. к. это не обязательно, ведь полные имена файлов различны. Однако можно и переименовать, как это происходит во втором случае.

С помощью команды ls -l можно убедиться, что на файл указывают три жесткие ссылки.

Просмотр информации о ссылках

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

Три ссылки указывают на один и тот же дескриптор

Символьные ссылки создаются с помощью той же команды ln , однако используется ключ -s (от «symbolic»). В качестве первого аргумента пишется абсолютный адрес файла или каталога, на который делается ссылка, в качестве второго – абсолютный или относительный адрес создаваемой мягкой ссылки.

Создание символьной ссылки: ln -s

Здесь на рабочем столе создаются две символьные ссылки: на каталог image и на файл 2018.ods . Имя ссылки можно оставить таким же как у объекта, если ссылка создается в другом каталоге. Команда ls -l среди прочего отображает адрес, на который указывает символьная ссылка. Если бы мы при создании мягкой ссылки использовали относительные адреса источников, то они так бы и хранились, и файлы-ссылки были бы нерабочими.

Практическая работа

Создайте текстовый файл с помощью перенаправления вывода команды cal . Создайте на этот файл дополнительную жесткую ссылку. Внесите изменения в файл, обратившись к нему по второму имени. Изменения можно внести, дописав ( >> ) в файл дату с помощью перенаправления вывода команды date . Посмотрите содержимое файла, воспользовавшись первым именем файла. Тем самым вы убедитесь, что имеете дело с одним и тем же файлом, доступным под разными именами.

Создайте символьную ссылку на каталог. Посмотрите в графической оболочке, как дистрибутив Linux по особому обозначает такой объект (обычно у иконки появляется маленькая черная стрелка).

Курс с ответами к заданиям и дополнительными уроками в PDF

X Скрыть Наверх

Введение в Linux и Bash. Курс

Символические ссылки в Linux

Символические ссылки в Linux

В Linux существует два типа ссылок на файлы: символические ссылки (symbolic links) и жесткие ссылки (hard links).

Символические ссылки

Символическая ссылка — это специальный тип файла, который создается для того, чтобы указывать на другой файл или директорию в файловой системе. Приблизительный аналог — это ярлык файла в Windows.

Для создания символической ссылки на файл в Linux используется команда ln с опцией -s. Вот как это делается:

$ ln -s /path/to/original/file /path/to/link

Здесь /path/to/original/file — это путь к оригинальному файлу, на который вы хотите создать символическую ссылку, а /path/to/link — это путь, по которому вы хотите создать ссылку. Замените эти значения соответствующими путями на вашей системе.

Например, если вы хотите создать символическую ссылку на файл /home/user/documents/file.txt в директории /home/user/links/, то выполните следующую команду:

$ ln -s /home/user/documents/file.txt /home/user/links/file_link

Теперь в директории /home/user/links/ будет создана символическая ссылка с именем file_link, которая будет указывать на файл /home/user/documents/file.txt.

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

Удаление символической ссылки можно выполнить, используя команду rm с указанием пути к ссылке. Например:

$ rm /path/to/link

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

Жесткие ссылки

Жесткая ссылка, или хардлинк, представляет собой дополнительное имя файла, которое указывает на тот же inode, что и оригинальный файл. inode — это уникальный идентификатор файла в файловой системе ОС Linux. Хардлинки создаются с помощью команды ln без опции -s. Хардлинк можно создавать только для файлов, находящихся в той же файловой системе, что и оригинальный файл. Если вы удалите оригинальный файл, хардлинк продолжит указывать на тот же inode, а значит, его можно использовать для создания нескольких имен для одного и того же файла в рамках одной файловой системы.

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

Заключение

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

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

Символическая ссылка (симлинк, англ. 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/

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

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

echo «one» > ./one/one.txt

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

echo «two» > ./two/two.txt

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

. ├── one │ └── one.txt └── two └── two.txt 2 directories, 2 files

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

sudo apt install tree

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

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

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

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

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

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

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

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

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

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

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

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

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

one three two

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

Для большей детализации вывода вы можете передать команде 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:

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 покажет, что отображаемая цель ссылки на самом деле соответствует расположению исходного файла, а не самой ссылке:

. ├── one │ └── one.txt ├── three -> one └── two ├── one.txt -> ../one/one.txt └── two.txt 3 directories, 3 files

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

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

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

one one one

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

echo «1. One» > one/one.txt

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

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

1. One 1. One 1. One

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

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

echo «One and done» > three/one.txt

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

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

One and done One and done One and done

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

Заключение

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

Жесткие и символьные ссылки

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

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

Именно номер индекса является истинным именем файла в системе. Мы можем его увидеть с помощью ключа -i команды ls .

Как увидеть индексный дескриптор с помощью команды ls

Жесткие ссылки

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

Имя файла, ссылающееся на его индексный дескриптор, называется жесткой ссылкой. Механизм жестких ссылок – это основной способ обращения к файлам в Unix-подобных операционных системах.

Поскольку файл в операционной системе однозначно определяет только номер его дескриптора, а имя файла является лишь указателем-ссылкой на него, то очевидно таких ссылок можно создать множество. Все они будут указывать на один объект. Результатом этого является то, что у файла в Linux может быть несколько имен.

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

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

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

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

Символьные, или мягкие, ссылки

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

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

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

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

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

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

При удалении жесткой ссылки, на имя которой ссылалась символьная, последняя не наследует связь с дескриптором и утрачивает свою работоспособность. Если в данном примере удалить жесткую ссылку с именем logotip , то файлы pic1 и tux станут бесполезны, так как открыть файл 555795 с их помощью уже будет нельзя.

Жесткая ссылка – не копия!

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

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

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

В случае мягких ссылок, хоть и создается новый файл (с собственным индексным дескриптором), он не содержит данных файла-оригинала, а лишь содержит запись адреса другого файла. Символьная ссылка – особый тип файла Linux.

При выполнении команды ls с ключом -l во втором столбце выводится количество жестких ссылок на файловый объект. Обычно по-умолчанию на каждый файл существует одна жесткая ссылка. Подумайте, что может означать количество жестких ссылок для каталогов?

Количество жестких ссылок на каталоги

Курс с ответами к заданиям и дополнительными уроками в PDF

X Скрыть Наверх

Введение в Linux и Bash. Курс

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *