Пошук та видалення битих символьних посилань у Linux

 1424

Символьне посилання стає битим (або “висячим”), якщо пов’язаний з ним файл видаляється або переміщується до іншого місця. Якщо хтось видаляє файл вручну, не знаючи, що на нього вказують символьні посилання, то ці символьні посилання більше не працюватимуть. Вони будуть схожі на дорожні знаки, що вказують на місто, яке знесли бульдозерами.

Символьні посилання

Символьні посилання (або “м’які посилання”, “сімлінки”) нагадують ярлики, які можуть вказувати на файли та каталоги. У вікні файлового менеджера (або консолі термінала) символьне посилання виглядає так само як і звичайний файл чи каталог. Файл або каталог, на який вказує символьне посилання, може знаходитись у будь-якому місці файлової системи.

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

Linux містить велику кількість символьних посилань. Інсталятори програм часто використовують символьні посилання для створення зв’язків із виконуваними файлами. При оновленні програмного забезпечення, бінарний файл замінюється новою версією, і всі символьні посилання продовжують працювати, як і раніше, доки ім’я нового файлу збігається зі старим.

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

ls /

Ми можемо розглянути їх детально, додавши опцію -l (long listing):

ls -l /lib* /bin

На початку кожного рядка знаходиться літера l (link), яка означає, що цей об’єкт є символьним посиланням. Частина після -> показує об’єкт, на який вказує посилання. У нашому прикладі цільовими об’єктами є каталоги.

У символьних посиланнях не використовуються права доступу до файлу (іншими словами, вони завжди мають форму rwxrwxrwx). Насправді права доступу до символьних посилань визначаються правами доступу до того файлу, на який вказує символьне посилання.

Створення символьних посилань

Перш ніж створювати символьне посилання, давайте напишемо невелику програму, яку зв’яжемо з нашим посиланням. Для цього відкриваємо термінал (наприклад, за допомогою комбінації клавіш Ctrl+Alt+T) і створюємо новий файл ravesli.cpp:

touch ravesli.cpp

Потім відкриваємо цей файл будь-яким текстовим редактором, наприклад, nano:

nano ravesli.cpp

Додаємо наступний код:

Результат:

Натискаємо 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 в каталозі ~/Документы:

ls -l

Видно, що посилання вказує на програму під назвою ravesli в каталозі /bin. Якщо ми запустимо символьне посилання, то запуститься пов’язана з ним програма:

./hello

Далі звернемося до програми напряму:

/bin/ravesli

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

sudo rm /bin/ravesli

Колір символьного посилання змінився. Воно виділена червоним, тому що Linux знає, що посилання бите. Система продовжує показувати об’єкт, на який вказувало посилання, щоб ми могли замінити файл, перекомпілювати програму або зробити інші, необхідні для відновлення символьного посилання, дії.

Зверніть увагу, якщо ми знову спробуємо запустити символьне посилання, то отримаємо помилку посилання, а не об’єкта, на який вказує посилання:

./hello

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

У більшості сучасних версій команди find присутня опція -xtype, яка полегшує пошук битих символьних посилань. Використання команди find з опцією -xtype та прапорцем l (link) дозволить шукати та повертати биті посилання:

find . -xtype l

За замовчуванням пошук є рекурсивним, тому він автоматично виконується для всіх підкаталогів.

Якщо ми поєднаємо вищенаведену команду з командою wc -l (lines), то зможемо підрахувати рядки, що аналогічно підрахунку битих символьних посилань:

find . -xtype l | wc -l

Як ви можете бачити, у нас є 1 бите символьне посилання.

Аналіз битих символьних посилань

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

Іноді проблема може полягати в символьному посиланні, а не в цільовому файлі: якщо символьне посилання було створено неправильно, то воно може ні на що не вказувати, але цільовий файл існує. У такому разі повторне створення символьного посилання стане розв’язанням проблеми.

Також можливо, що явно бите символьне посилання використовується як щось інше, наприклад, індикатор блокування. Або що ціль присутня лише періодично, і це очікувана (і бажана) поведінка конкретного програмного забезпечення. Можливо, цільовий файл копіюється з іншої машини або хмари, виконує свою функцію, а потім знову видаляється лише для того, щоб бути заміненим іншою програмою в наступному циклі.

Бите символьне посилання може бути ознакою невдалої установки програмного забезпечення. У цьому випадку замість видалення символьного посилання вам слід виправити його вручну, або повторити інсталяцію. Коли ви виправите биті посилання, повторіть команду пошуку. Якщо все зроблено правильно, виправлені символьні посилання більше не відображатимуться у результатах пошуку.

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

Видалення битих символьних посилань

Опція -exec (execute) запускає деяку команду, яка виконуватиметься на результатах пошуку, отриманих від команди find. Ми збираємося використовувати команду rm для видалення кожного пошкодженого символьного посилання. Частина {} замінюється ім’ям битого символьного посилання у міру виявлення кожного з них за допомогою команди find.

Крапка з комою (;) використовується для завершення списку команд, які необхідно запустити за допомогою -exec. Бекслеш (\) використовується для екранування крапки з комою, завдяки чому вона розглядатиметься як частина команди find:

find . -xtype l -exec rm {} \;

Як ви можете бачити, команда була виконана без будь-якої ознаки того, що щось сталося. Щоб переконатися, що биті посилання видалені, повторимо пошук:

find . -xtype l

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

Утиліта symlinks

symlinks — це потужна утиліта для керування та виправлення битих символьних посилань. Оскільки symlinks не входить у стандартне постачання більшості дистрибутивів Linux, то вам доведеться встановити цей інструмент вручну.

Команда установки цієї утиліти (в Debian 11) виглядатиме наступним чином:

sudo aptitude install symlinks

Примітка: Якщо ви використовуєте Ubuntu, то перед встановленням symlinks вам потрібно додати репозиторій universe до списку репозиторіїв вашої системи:

sudo add-apt-repository universe

Після успішного встановлення symlinks вам необхідно перевірити наявність битих посилань у вашій системі. Для цього введіть наступне:

symlinks .

Якщо у вашій системі є бите (dangling) посилання, то ви отримаєте результат, який виглядає як на вищенаведеному скріншоті.

Крапка . позначає поточний робочий каталог. Якщо ви хочете отримати інформацію про биті символьні посилання, наприклад, у каталозі /home, то можете зробити це, ввівши наступну команду:

symlinks /home

Якщо у вашій системі є бите посилання, ви отримаєте приблизно наступний результат:

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

Щоб швидко видалити отримане бите символьне посилання, ви можете використати опцію -d (delete):

symlinks -d .

Щоб видалити биті символьні посилання в каталозі /home, введіть:

symlinks -d /home

Цього разу вивід не тільки перераховуватиме знайдені биті посилання, але й повідомлятиме, що посилання видалено, наприклад:

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

Щоб виконати рекурсивний пошук та видалення битих символьних посилань у вказаному каталозі, використовуйте опції -dr (d = delete, r = recursive), наприклад:

symlinks -dr .

Висновки

Символьні посилання є важливими для Linux, оскільки вони полегшують процес визначення шляхів та керування ними на вашому комп’ютері. Але якщо про це не подбати, то биті символьні посилання можуть зайняти величезний шмат вашого системного сховища, і ви навіть не дізнаєтеся про це. У таких ситуаціях слід використовувати symlinks та команду find. Також намагайтеся завжди приділяти час перегляду списку символьних посилань, перш ніж запускати команду для їх видалення.

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (4 оцінок, середня: 5,00 з 5)
Завантаження...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *