Не работает символьная ссылка linux

Обновлено: 04.07.2024

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

Что именно является символической ссылкой?

Обычно называемые symlink(символической ссылкой) или soft link(мягкой ссылкой), символические ссылки представляют собой очень маленькие файлы. На самом деле символическая ссылка содержит только имя любого файла, на который она указывает, обычно вместе с путем к файловой системе (относительно текущего местоположения или абсолютного значения).

Если файл с именем file1 указывает на файл с именем /apps/files/file-2020, длина file1 будет составлять 21 символ, даже если размер файла file-2020 составляет 2 терабайта. Если он указывает на ./file-2020, длина его будет всего 11 символов. Если указывает на file-2020, то только девять.

Когда ломаются ссылки

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

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

Если вы попытаетесь получить доступ к символической ссылке, которая указывает на себя (бывает и так), вы увидите что-то вроде этого:

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

Нахождение сломанных символических ссылок

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

буква l указывает команде поиска искать символические ссылки.

Команда, показанная ниже, с другой стороны, ищет в текущем каталоге символические ссылки, которые указывают на файлы, которые не существуют:

Вы также можете найти неработающие символические ссылки с помощью такой команды. Она длиннее предыдущей, но делает тоже самое:

Что делать с битыми символическими ссылками

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

Часть этой команды rm <> превращается в команду «удалить файл».

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

Я пытаюсь лучше понять символические ссылки . и не очень повезло. Это мой фактический вывод оболочки с именем пользователя /хоста изменено:

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

4 ответа

Символы, как правило, похожи на полные пути или относительно ссылки, в противном случае они могут часто искать file-1.txt локально (как ни странно).

Перейдите к proper и выполните ls -l и вы можете видеть, что symlink ищет actual/file-1.txt , когда это должно быть ../actual/file-1.txt

Итак, у вас есть два варианта:

Дайте полный путь

Перейдите в папку, в которую вы хотите установить ссылку, и ссылку от нее

Изменить : подсказка для сохранения ввода.

Вы можете просто сделать ln -s

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

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

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

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

Символьные ссылки могут быть сложными. По сути, символическая ссылка представляет собой файл, который содержит имя файла /путь для другого файла (и это помечено для специального обращения). Если имя пути в файле ссылки начинается с ' / ', тогда он рассматривается как абсолютный путь, и все довольно просто. Если он не начинается с косой черты, он рассматривается как относительный путь - относительно каталога, в котором находится ссылка. (Это верно, содержит или нет имя слэша.) Итак, вы создали proper/file–1.txt как ссылку на « actual/file–1.txt ", и когда вы пытались получить к нему доступ, система попыталась получить доступ к proper/actual/file–1.txt

Кстати, вам не нужны команды touch . echo "file 1" > actual/file–1.txt достаточно для создания actual/file–1.txt .

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

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

Если вам нужно создать символическую ссылку, cd в исходный целевой каталог и создать там новые символические ссылки, поэтому относительные пути точный.

Или иначе: относительный путь от Origin до Target. Если вначале Origin символизируется, это нормально. Но вы можете столкнуться с проблемами при создании нового Origin link_name в каталоге, который сам как-то символически связан.

На этом уроке мы рассмотрим, как найти битые (т.е. неработающие) символьные ссылки, проанализировать их и удалить из Linux-системы, если это необходимо.

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

Предположим, например, что в вашем домашнем каталоге под названием user есть символьная ссылка, указывающая на файл под названием text-file.txt, который находится где-то в другом месте файловой системы. Команды, которые вы применяете к символьной ссылке, автоматически применяются и к файлу, на который она ссылается, т.е. если вы попытаетесь использовать команду cat или less вместе с символьной ссылкой, то увидите содержимое файла text-file.txt.

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

Мы можем легко увидеть некоторые символьные ссылки, применив к корневому каталогу команду ls . На тестовой машине с Debian 11 они выделены бледно-зеленым цветом:


Мы можем рассмотреть их подробнее, добавив опцию -l (long listing):


В начале каждой строки стоит буква l (link), которая обозначает, что данный объект является символьной ссылкой. Часть после -> показывает объект, на который указывает ссылка. В нашем примере целевыми объектами являются каталоги.

В символьных ссылках не используются права доступа к файлу (иными словами, они всегда имеют форму rwxrwxrwx ). В реальности, права доступа к символьным ссылкам определяются правами доступа к тому файлу, на который указывает символьная ссылка.

Создание символьных ссылок

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

Для этого открываем терминал (например, с помощью сочетания клавиш Ctrl+Alt+T) и создаем новый файл ravesli.cpp:


Затем открываем этот файл любым текстовым редактором, например, nano:


Добавляем следующий код:


Нажимаем Ctrl+O для сохранения изменений и Ctrl+X для выхода из редактора.

Скомпилируем нашу программу при помощи компилятора g++:

g++ ravesli.cpp -o ravesli


Теперь переместим скомпилированный файл нашей программы к другим бинарным файлам в каталог /bin:

sudo mv ravesli /bin

Осталось создать символьную ссылку и связать её с /bin/ravesli. Для этого вводим команду ln (link) вместе с параметром -s (symbolic) и целевым объектом ( /bin/ravesli) с названием ссылки ( hello ):

ln –s /bin/ravesli hello


Мы только что связали бинарный файл с символьной ссылкой.

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

Для наглядной демонстрации такого поведения я специально создал символьную ссылку hello в каталоге


Видно, что ссылка указывает на программу под названием ravesli в каталоге /bin. Если мы запустим символьную ссылку, то запустится связанная с ней программа:


Далее обратимся к программе напрямую:


Как и ожидалось, мы получили тот же результат. А теперь давайте удалим файл программы:

sudo rm /bin/ravesli


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

Обратите внимание, что если мы снова попытаемся запустить символьную ссылку, то получим ошибку ссылки, а не объекта, на который указывает ссылка:



Поиск битых символьных ссылок (команда find)

В большинстве современных версий команды find есть опция -xtype , которая упрощает поиск битых символьных ссылок. Использование команды find с опцией -xtype и флагом l (link) позволит искать и возвращать битые ссылки:


Стоит отметить, что по умолчанию поиск является рекурсивным, поэтому он автоматически выполняется для всех подкаталогов.

Если мы соединим вышеприведенную команду с командой wc -l (lines), то сможем подсчитать строки, что аналогично подсчету битых символьных ссылок:

find . -xtype l | wc -l


Как вы можете видеть, у нас есть 1 битая символьная ссылка.

Анализ битых символьных ссылок

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

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

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

В целях безопасности лучше проводить удаление символьных ссылок в рамках ваших собственных каталогов. Будьте крайне осторожны при выполнении этих команд от имени root или в системных каталогах.

Удаление битых символьных ссылок

Опция -exec (execute) запускает некоторую команду, которая будет выполняться на результатах поиска, полученных от команды find . Мы собираемся использовать команду rm для удаления каждой поврежденной символьной ссылки. Часть <> заменяется именем битой символьной ссылки по мере обнаружения каждой из них с помощью команды find .

Мы должны использовать точку с запятой ( ; ), чтобы завершить список команд, которые мы хотим запустить при помощи -exec . Обратная косая черта ( \ ) используется для экранирования точки с запятой, благодаря чему она будет рассматривается как часть команды find :

find . -xtype l -exec rm <> \;


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


Нет никаких совпадающих результатов, что означает, что битые символьные ссылки были удалены.

Утилита symlinks

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

Команда установки данной утилиты (в Debian 11) будет выглядеть следующим образом:

sudo aptitude install symlinks


Примечание: Если вы используете Ubuntu, то перед установкой symlinks вам нужно будет добавить репозиторий universe в список репозиториев вашей системы:

sudo add-apt-repository universe

После успешной установки symlinks вам необходимо проверить наличие битых ссылок в вашей системе. Для этого введите следующее:


Если в вашей системе присутствует битая (dangling) ссылка, вы получите вывод, который выглядит как на вышеприведенном скриншоте.

Символ . (точка) обозначает текущий рабочий каталог. Если вы хотите получить информацию о битых символьных ссылках, например, в каталоге /home, то можете сделать это, введя следующую команду:

Если в вашей системе присутствует битая ссылка, вы получите примерно следующий результат:

dangling: /home/diego/Документы/hello -> /bin/ravesli

Чтобы быстро удалить полученную ранее битую символьную ссылку, вы можете использовать флаг -d (delete):

Чтобы удалить битые символьные ссылки в каталоге /home, введите:

symlinks -d /home

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

dangling: /home/diego/Документы/hello -> /bin/ravesli
deleted: /home/diego/Документы/hello -> /bin/ravesli

Чтобы произвести рекурсивный поиск и удаление битых символьных ссылок в заданном каталоге, используйте флаги -dr (d = delete, r = recursive):

Заключение

Символьные ссылки важны для Linux, поскольку они облегчают процесс определения путей и управления ими на вашем компьютере. Но если об этом не позаботиться, то битые символьные ссылки могут занять огромный кусок вашего системного хранилища, и вы даже не узнаете об этом. В таких ситуациях в игру вступают такие утилиты, как symlinks и команда find . Также старайтесь всегда уделять время просмотру списка символьных ссылок, прежде чем запускать команду для их удаления.

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

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

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

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

Вот основные особенности символических ссылок:

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

Теперь давайте рассмотрим жесткие ссылки.

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

Этот тип ссылок реализован на более низком уровне файловой системы. Файл размещен только в определенном месте жесткого диска. Но на это место могут ссылаться несколько ссылок из файловой системы. Каждая из ссылок - это отдельный файл, но ведут они к одному участку жесткого диска. Файл можно перемещать между каталогами, и все ссылки останутся рабочими, поскольку для них неважно имя. Рассмотрим особенности:

  • Работают только в пределах одной файловой системы;
  • Нельзя ссылаться на каталоги;
  • Имеют ту же информацию inode и набор разрешений что и у исходного файла;
  • Разрешения на ссылку изменяться при изменении разрешений файла;
  • Можно перемещать и переименовывать и даже удалять файл без вреда ссылке.

Использование ссылок в Linux

Теоретические отличия вы знаете, но осталось закрепить все это на практике, поэтому давайте приведем несколько примеров работы со ссылками в Linux. Для создания символических ссылок существует утилита ln. Ее синтаксис очень прост:

$ ln опции файл_источник файл_ссылки

Рассмотрим опции утилиты:

  • -d - разрешить создавать жесткие ссылки для директорий суперпользователю;
  • -f - удалять существующие ссылки;
  • -i - спрашивать нужно ли удалять существующие ссылки;
  • -P - создать жесткую ссылку;
  • -r - создать символическую ссылку с относительным путем к файлу;
  • -s - создать символическую ссылку.

Создание символических ссылок

Сначала создайте папку test и перейдите в нее:

mkdir test && cd test


Затем создайте файл с именем source с каким-либо текстом:

echo "текст текст текст текст" > source
$ cat source


Файл готов, дальше создадим символическую ссылку Linux, для этого используется команда ln с опцией -s:

ln -s source softlink


Попробуем посмотреть содержимое файла по ссылке:


Как видите, нет никакой разницы между ней и исходным файлом. Но утилита ls покажет что это действительно ссылка:


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

Теперь удалите исходный файл и посмотрите что будет:


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

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

Снова создайте файл source с произвольным текстом:

echo "текст текст текст текст" > source
$ cat source


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

ln source hardlink

Посмотрите содержимое файла:


Данные те же самые, а если мы посмотрим вывод утилиты ls, то увидим что inode и права доступа тоже совпадают:


Если для одного из файлов поменять разрешения, то они изменяться и у другого. Теперь удалите исходный файл:

Затем посмотрите содержимое:


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

Выводы

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

На завершение видео про ссылки в Linux:

Я пытаюсь лучше понять символические ссылки . и мне не очень повезло. Это мой фактический вывод оболочки с измененным именем пользователя / хостом:

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

4 ответа 4

Симлинки, как правило, любят полные пути или относительно ссылки, в противном случае они часто могут искать file-1.txt локально (как ни странно).

Перейдите к proper и выполните ls -l и вы увидите, что символическая ссылка ищет actual/file-1.txt , когда он должен быть ../actual/file-1.txt .

Итак, у вас есть два варианта:

Дайте полный путь

Перейдите к папке, в которой вы хотите разместить ссылку, и ссылку оттуда

Редактировать: подсказка для сохранения ввода.

Вы можете просто сделать ln -s

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

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

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

Ваш пример создает ссылки proper которые ищут подкаталог с именем actual в текущем каталоге, а не предполагаемый родительский элемент обоих.

Символические ссылки могут быть хитрыми. По сути, символическая ссылка - это файл, который содержит имя файла / путь к другому файлу (и который помечен для специальной обработки). Если путь в файле ссылок начинается с ' / ', то он рассматривается как абсолютный путь, и все довольно просто. Если он не начинается с косой черты, он рассматривается как относительный путь - относительно каталога, в котором находится ссылка. (Это верно независимо от того, содержит ли имя косые черты.) Итак, вы создали proper/file–1.txt как ссылку на « actual/file–1.txt », и когда вы попытались получить к нему доступ, система попыталась получить доступ к proper/actual/file–1.txt . Ты должен был сказать

Кстати, вам не нужны touch команды. echo "file 1" > actual/file–1.txt достаточно для создания actual/file–1.txt .

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

Используйте cd .. и ls -l несколько раз, чтобы увидеть, являются ли ваши родительские каталоги символическими ссылками.

Если вам нужно создать символическую ссылку, cd в исходный каталог Target и создайте там новые символические ссылки, чтобы относительные пути были точными.

Или, если выразиться иначе: относительный путь - от начала к цели. Если источник впоследствии является символической ссылкой, это нормально. Но вы можете столкнуться с проблемами при настройке нового источника link_name в каталоге, который сам каким-то образом является символической ссылкой.

Читайте также: