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

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

Ссылки на файл в Linux

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

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

Символическая ссылка — файл определенного типа, который выступает в роли линка на другой объект — файл любого формата или определенный каталог. Обычно такие объекты называют целевыми. Иногда вы можете заметить, что такой тип ссылок называют soft links или sym-link. Такой элемент не содержит в себе данных цели, а лишь выступает указателем, то есть является полной копией ярлыка из Виндовс. Внутри symbolic link находится только путь. Никто не запрещает вам создать множество подобных линков с разными именами, но одним и тем же целевым объектом. Связь между двумя составляющими называется мягкой, поскольку при удалении ссылки целевой файл никаким образом не страдает. Однако при удалении файла ссылка становится нерабочей. Она сохраняется на диске, но указанный в ней путь ведет уже к несуществующему объекту.

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

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

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

Читайте также:  Linux Mint 19.3 Wine – запускаем приложения Windows

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

Linux поиск по содержимому файлов командой grep

Часто возникают ситуации, что нужно найти какой-нибудь текст, но вы не помните, в каком файле/файлах он содержится. Секрет популярности — её мощь, она отдает возможность пользователям сортировать и фильтровать текст на основе сложных правил.

Команда grep (расшифровывается как global regular expression print) — одна из самых востребованных команд в терминале Linux, которая входит в состав проекта GNU.

В этом варианте для поиска по содержимому файлов в каталоге можно использовать утилиту grep:

grep -r -n «text» /path

grep -r «Строчка для поиска» grep -rl $’\xEF\xBB\xBF’

где: -n показывает строку, где был найден фрагмент; -r осуществляет розыск рекурсивно, в файлах в самом каталоге /path и в его подкаталогах;

Также можно приплюсовать опцию -C 3, чтобы видеть +- 3 строки вокруг (выше и ниже от найденной).

Дабы найти файл по его содержимому во всех Linux — подобных ОС, достаточно использовать утилиту find.

Об авторах

Daniel Robbins

Дэниэль Роббинс — основатель сообщества Gentoo и создатель операционной системы Gentoo Linux. Дэниэль проживает в Нью-Мехико со свой женой Мэри и двумя энергичными дочерьми. Он также основатель и глава Funtoo, написал множество технических статей для IBM developerWorks, Intel Developer Services и C/C++ Users Journal.

Chris Houser

Крис Хаусер был сторонником UNIX c 1994 года, когда присоединился к команде администраторов университета Тэйлора (Индиана, США), где получил степень бакалавра в компьютерных науках и математике. После он работал во множестве областей, включая веб-приложения, редактирование видео, драйвера для UNIX и криптографическую защиту. В настоящий момент работает в Sentry Data Systems. Крис также сделал вклад во множество свободных проектов, таких как Gentoo Linux и Clojure, стал соавтором книги The Joy of Clojure.

Aron Griffis

Эйрон Гриффис живет на территории Бостона, где провел последнее десятилетие работая в Hewlett-Packard над такими проектами, как сетевые UNIX-драйвера для Tru64, сертификация безопасности Linux, Xen и KVM виртуализация, и самое последнее — платформа HP ePrint. В свободное от программирования время Эйрон предпочитает размыщлять над проблемами программирования катаясь на своем велосипеде, жонглируя битами, или болея за бостонскую профессиональную бейсбольную команду «Красные Носки».

Читайте также:  Красивые дистрибутивы linux: выбор за пользователями

Примеры жестких ссылок

Создадим директорию Test и файл sample1 внутри нее:

$ mkdir Test $ cd Test $ echo «тестовый файл» > sample1

Теперь создадим жесткую ссылку на sample1 и назовем ее sample 2:

$ ln sample1 sample2

При помощи опции –i команды ls отобразим номера инодов для обоих файлов:

$ ls -il sample1 sample2

Получим следующий результат:

Из результата видно, что у обоих файлов sample1 и sample2 один номер инода (13058490). Кроме того, у файлов одинаковый размер и права доступа.

Теперь удалим оригинальный sample1

$ rm sample1

После удаления связанного жесткой ссылкой оригинального файла проверим содержимое «ссылки» sample2:

$ cat sample2

Должно быть выведено содержимое файла, в примере это  «тестовый файл».

  1. Исходя из рассмотренных примеров можно сделать следующий вывод:
  2. Жесткие ссылки используют один номер инода.
  3. Команда ls -l показывает все ссылки, а в столбце ссылок выводит их количество.
  4. У файлов ссылок есть реальное содержимое
  5. Удаление любой ссылки уменьшает количество ссылок, но никак не влияет на другие ссылки.
  6. Нельзя создать жесткую ссылку на директорию.
  7. Даже при удалении оригинального файла жесткая ссылка будет показывать содержимое.

Что нужно помнить о символических ссылках

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

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

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

У меня есть файл в newdir / test_dir. Имеет следующие атрибуты:

-rw-r—r— 1 abhishek abhishek 163 Apr 13 15:07 newdir/test_dir/

Теперь я создам мягкую ссылку на этот файл в моем текущем каталоге:

ln -s newdir/test_dir/ link_prog

Вот атрибуты вновь созданной ссылки:

lrwxrwxrwx 1 abhishek abhishek 23 Jul 2 08:51 link_prog -> newdir/test_dir/

Заметьте l (это L, а не один) в начале строки? Если вы знакомы с правами доступа к файлам в Linux , вы должны знать, что «l» означает ссылку и, следовательно, говорит, что этот файл на самом деле является ссылкой. Давайте обновим вашу память, — означает файл, а d означает каталог.

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

touch link_prog ls -l newdir/test_dir/ -rw-r—r— 1 abhishek abhishek 163 Jul 2 10:04 newdir/test_dir/

Это ссылка на файл или каталог? Вы можете не знать!

Как бы вы узнали, указывает ли ссылка на файл или каталог? Вы не сможете узнать, пока не пойдете по пути и не получите доступ к самому целевому файлу.

Вы можете создавать ссылки на несуществующий файл или каталог

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

Вы получите ошибку только при попытке получить доступ к целевому файлу, либо по ссылке, либо самостоятельно. Команда ls все равно будет работать.

ln -s non_existant_dir link_dir less link_dir link_dir: No such file or directory

Символические ссылки создаются с разрешения 777, но это ничего не значит

Заметили ли вы разрешение файла на символическую ссылку? Символические ссылки всегда создаются с разрешением 777 (rwxrwxrwx). Для обычного файла это будет означать, что любой может получить доступ к файлу. Но это не относится к ссылкам.

lrwxrwxrwx 1 abhishek abhishek 23 Jul 2 08:51 link_prog -> newdir/test_dir/

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

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

Вы можете сослаться на ссылку ссылки или символическую ссылку

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

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

Управление символическими ссылками в Linux

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

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

Связанный