Как найти и исправить неработающие символические ссылки в Linux

27.01.2021 Дмитрий Демченко 1052 + Linux

Файловые системы в операционной системе Linux. Базовые понятия

ОС Linux предоставляет выбор еще на стадии установки: в ядро системы встроены разные файловые системы (ФС). При этом пользователь должен выбрать ту, что отвечает его требованиям и задачам. Перед теми, кто использует Windows, такой вопрос не стоит — эту ОС можно установить только на NTFS. Отличается от Windows и иерархическое устройство самих ФС, и структура каталогов.

Linux поддерживает деление жесткого диска на разделы. Для подсчета и определения физических границ используется специальная таблица разделов — GPT или MBR. Она содержит метку и номер раздела, а также адреса физического расположения точек начала и конца раздела.

Поиск и удаление символических ссылок

Для поиска мягких ссылок в Linux очень удобно использовать команду find, точнее find . -type l, выводящую их список в текущем каталоге и всех вложенных в него папках.

При этом команда с данным набором параметров не различает рабочие и нерабочие ссылки, чтобы получить список только битых ссылок, вместо параметра type нужно использовать параметр  -xtype, вот так:

find . -xtype l

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

SUDO здесь не поможет, решить эту проблему можно сбросив все ошибки в /dev/null.

Добавьте к уже известной команде перенаправление:

Поиск и удаление символических ссылок

find . -xtype l 2>/dev/null

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

Читайте также:  Как включить вай фай на ноутбуке hp и установить драйвера на wi-fi

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

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

В общем, если и удалять битые симлинки, то делать это нужно только в тех системных каталогах, назначение которых вам известно. Так, тест с удалением всех битых символических ссылок в Ubuntu , установленной на виртуальную машину VirtualBox, нарушило работу дополнений гостевой ОС, в результате чего в виртуальной системе оказалось доступным только разрешение VGA, составляющее всего 640×480 пикселей.

Найдите и исправьте неработающие символические ссылки

Во-первых, вам нужно подтвердить, что в системе существует символическая ссылка. Вы можете легко сделать это с помощью команд ll и grep .

ll | grep txt

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

Теперь, если бы мы разорвали созданную выше символическую ссылку, удалив родительский текстовый файл ( ):

rm

Символьная ссылка сломается и не будет удалена из вашей системы. Вы можете подтвердить это, набрав ll | grep txt снова в вашем терминале.

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

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

Использование символических ссылок

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

Читайте также:  iOS 15: поддерживаемые устройства, функции и дата выпуска!

Вы можете использовать Pacman для установки пакета в Arch Linux :

sudo pacman -S symlinks

В Fedora:

sudo dnf install symlinks

В CentOS:

sudo yum install symlinks

В дистрибутивах на основе Debian:

sudo apt-get install symlinks

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

sudo add-apt-repository universe

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

symlinks .

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

symlinks /home

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

dangling: /home/sharmadeepesh/ ->

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

symlinks -d .

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

symlinks -d /home

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

dangling: /home/sharmadeepesh/ -> deleted: /home/sharmadeepesh/ ->

Чтобы рекурсивно сообщать и удалять неработающие символические ссылки в данном каталоге, используйте флаг -dr с командой по умолчанию, где d означает удаление, а r означает рекурсивный.

symlinks -dr .

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

Команда find предустановлена ​​в каждой системе Linux. Как следует из названия, вы можете искать папки и файлы с помощью этой команды. Команда find также позволяет легко сообщать и удалять мертвые программные ссылки в вашей системе.

Чтобы перечислить неработающие символические ссылки в текущем рабочем каталоге, введите:

find . -xtype l

Чтобы найти неработающие ссылки в любом другом каталоге вашей системы, просто замените расширение . (точка) символ в пути к каталогу. Следующая команда будет искать неработающие ссылки в каталоге / home .

find /home -xtype l

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

Читайте также:  Делаем из компьютерного и ноутбучного HDD внешний usb накопитель

find . -xtype l ! -exec test -e {} ; -print

Чтобы проверить, куда указывают эти неработающие ссылки, используйте:

find . -xtype l -exec ls -l {} +

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

lrwxrwxrwx 1 root root 19 Feb 21 11:53 /home/sharmadeepesh/ -> /home/sharmadeepesh/

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

sudo find . -xtype l -delete

Также есть альтернативный способ удалить мертвые ссылки:

sudo find . -xtype l ! -exec test -e {} ; -delete

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

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

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

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

Создать Символическую Ссылку в Linux

Легко запомнить: В целом, синтаксис команды ln такой же, как и команд cp или mv , в частности .

Используйте следующий синтаксис для создания символической ссылки в Linux:

Тем не менее, вы должны знать, что в соответствии с документацией в man , по умолчанию, каждая точка назначения ( ) не должна заранее существовать.

Если путь к существует и это файл, вы получите ошибку «ln: failed to create symbolic link ‘ ’: File exists».

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