Два файла с разными именами, но это один и тот же файл на диске. Или ссылка которая ведёт к папке в другом месте файловой системы, но выглядит как обычная директория. Всё это — ссылки, и в Linux их два принципиально разных вида. Разбираемся чем они отличаются и когда что использовать.
Жёсткая ссылка vs символическая: ключевая разница
В Linux каждый файл на диске имеет уникальный номер — inode. Это идентификатор в таблице файловой системы, к которому привязаны реальные данные. Имя файла в директории — это всего лишь указатель на inode.
Жёсткая ссылка — это второе (или третье, или десятое) имя для того же inode. Удалите «оригинал» — данные никуда не денутся, пока хотя бы одно имя на inode существует.
Символическая ссылка (симлинк) — отдельный файл который хранит путь к другому файлу или директории. Удалите оригинал — симлинк станет битым и будет вести в никуда.
Проверить inode файлов:
ls -li
У жёсткой ссылки и оригинала будет одинаковый номер inode. У симлинка — свой отдельный.
Жёсткая ссылка
Создать жёсткую ссылку — второе имя для файла:
ln file1.txt file2.txt
Теперь file1.txt и file2.txt — это одно и то же. Изменение содержимого через любое из имён отразится в обоих. Удаление одного имени не затрагивает данные — они исчезнут только когда будут удалены все имена.
Жёсткие ссылки работают только в пределах одной файловой системы — нельзя сделать жёсткую ссылку на файл с другого раздела или сетевой папки. На директории жёсткие ссылки создавать нельзя (технически возможно только для root, но это ломает структуру дерева).
Символическая ссылка
Создать симлинк на файл:
ln -s /path/to/file1.txt /path/to/link.txt
Симлинк на директорию:
ln -s /var/www/mysite /home/user/mysite
После этого обращение к /home/user/mysite будет прозрачно работать как обращение к /var/www/mysite.
Симлинки пересекают границы файловых систем — можно создать ссылку на файл с другого раздела или внешнего диска. Для директорий используются почти всегда только симлинки.
Абсолютный и относительный путь в симлинке
Симлинк хранит путь — и этот путь может быть абсолютным или относительным.
Абсолютный путь — работает из любого места, но сломается при переносе файлов в другое расположение:
ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/mysite
Относительный путь — симлинк хранит путь относительно своего расположения. Удобен когда структура директорий переезжает целиком:
cd /etc/nginx/sites-enabled
ln -s ../sites-available/mysite mysite
Проверить куда ведёт симлинк:
readlink -f /etc/nginx/sites-enabled/mysite
Перезаписать существующую ссылку: флаг -f
Если цель уже существует — ln откажется создавать ссылку. Флаг -f сначала удалит существующий файл, затем создаст ссылку:
ln -sf /path/to/new_target existing_link
Комбинация -sf — стандарт для обновления симлинков в скриптах.
Вывести что происходит: флаг -v
ln -sv /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/mysite
'/etc/nginx/sites-enabled/mysite' -> '/etc/nginx/sites-available/mysite'
Флаг -v (verbose) печатает каждую созданную ссылку. Полезен в скриптах где нужно видеть что именно произошло.
Реальные сценарии
Nginx: активация виртуальных хостов. В Debian и Ubuntu конфиги сайтов хранятся в sites-available, а подключаются через симлинки в sites-enabled:
sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/
Деактивировать сайт — удалить симлинк, не трогая конфиг:
sudo rm /etc/nginx/sites-enabled/mysite
Несколько версий Python или Node. Быстро переключить дефолтную версию:
sudo ln -sf /usr/bin/python3.11 /usr/local/bin/python
Логи в одном месте. Если приложение пишет лог в нестандартную папку — симлинк из /var/log/ сделает его видимым для централизованного мониторинга:
sudo ln -s /opt/myapp/logs/app.log /var/log/myapp.log
Найти битые симлинки
Симлинк становится битым если оригинальный файл удалён или перемещён. Найти все битые симлинки в директории:
find /etc/nginx/sites-enabled -xtype l
-xtype l ищет симлинки указывающие на несуществующие цели.
Шпаргалка
| Задача | Команда |
|---|---|
| Жёсткая ссылка | ln file.txt link.txt |
| Символическая ссылка | ln -s /source /link |
| Симлинк на директорию | ln -s /source/dir /link/dir |
| Перезаписать существующую | ln -sf /source /link |
| С выводом действий | ln -sv /source /link |
| Куда ведёт симлинк | readlink -f /link |
| Проверить inode | ls -li |
| Найти битые симлинки | find /path -xtype l |