Два вида ссылок
В Linux есть два типа ссылок на файлы: жёсткие (hard link) и символические (soft link, symlink). Они похожи на уровне идеи - дают дополнительный путь к объекту, - но устроены по-разному.
Перед ссылками закрепим идею из главы про файловую систему: директория хранит имя, имя ведёт к inode, а inode описывает данные файла. Поэтому hard link и symlink различаются тем, куда ведёт дополнительная ссылка: к тому же inode или к пути другого файла.
Жёсткая ссылка: ещё одно имя inode
Жёсткая ссылка - это ещё одно имя для того же inode, то есть для тех же данных на диске.
ln original.txt hardlink.txt
/root/original.txt --+
+--> inode 12345 --> данные на диске
/root/hardlink.txt --+
Оба имени равнозначны. После создания hard link нет "оригинала" и "копии": есть два имени, которые ведут к одному inode.
Проверить это можно через ls -li:
ls -li original.txt hardlink.txt
# 12345 -rw-r--r-- 2 root root 100 Jan 15 10:23 hardlink.txt
# 12345 -rw-r--r-- 2 root root 100 Jan 15 10:23 original.txt
Одинаковый inode 12345 показывает, что это один и тот же объект. Число 2 после прав - количество жёстких ссылок на inode.
Свойства hard link:
- удаление одного имени не удаляет данные, пока есть другие ссылки;
- нельзя создать hard link на директорию обычным способом;
- нельзя создать hard link между разными файловыми системами;
- в
ls -lhard link выглядит как обычный файл, а не как ссылка.
В повседневном DevOps hard link встречается реже, но он важен для понимания того, почему "удалил файл" не всегда значит "данные сразу исчезли".
Символическая ссылка: файл с путём
Символическая ссылка - это отдельный маленький файл, который хранит путь к другому файлу или директории.
ln -s /opt/app/config.json /root/config.json
/root/config.json --> хранит путь /opt/app/config.json
/opt/app/config.json --> реальные данные
Порядок аргументов у ln -s важен:
ln -s TARGET LINK_NAME
Сначала указывается цель, потом имя создаваемой ссылки.
Свойства symlink:
- может указывать на файл или директорию;
- может указывать на объект в другой файловой системе;
- может указывать даже на несуществующий путь;
- если цель удалена или перемещена, ссылка становится broken;
- в
ls -lначинается сlи показывает стрелку->.
Пример вывода:
ls -la /root/config.json
# lrwxrwxrwx 1 root root 20 Jan 15 10:23 /root/config.json -> /opt/app/config.json
Символ l в начале означает symlink. Стрелка показывает, куда он указывает.
Как читать и проверять symlink
Если symlink указывает на текстовый файл, его можно читать обычными командами:
cat /root/config.json
cat откроет не сам файл-ссылку, а цель ссылки. Поэтому если /root/config.json указывает на /opt/app/config.json, ты увидишь содержимое /opt/app/config.json.
Чтобы увидеть именно путь, на который указывает symlink, используй ls -l или readlink:
ls -l /root/config.json
readlink /root/config.json
readlink удобен в скриптах, потому что выводит только target без лишних колонок.
Удаление symlink делается обычным rm:
rm /root/config.json
Это удаляет файл-ссылку, но не удаляет цель. Если нужно удалить именно оригинальный файл, надо явно удалять путь к оригиналу.
Абсолютные и относительные symlink
Symlink может хранить абсолютный путь:
ln -s /etc/nginx/nginx.conf /root/nginx.conf
Такую ссылку легко читать: она всегда указывает от корня /.
Symlink может хранить относительный путь:
cd /etc/nginx/sites-enabled
ln -s ../sites-available/mysite.conf mysite.conf
Относительный путь считается не от текущей директории пользователя, а от места, где лежит сама ссылка. Это частая причина ошибок. Если ссылка лежит в /etc/nginx/sites-enabled, то ../sites-available/mysite.conf означает /etc/nginx/sites-available/mysite.conf.
Практическое правило:
- для учебных задач и простых серверных путей чаще используй абсолютные symlink;
- для переносимых директорий внутри одного проекта относительные symlink могут быть удобнее.
Broken symlink
Символическая ссылка может указывать на несуществующий путь:
ln -s /tmp/nonexistent /root/broken
ls -la /root/broken
# lrwxrwxrwx 1 root root 16 Jan 15 10:23 /root/broken -> /tmp/nonexistent
Сама ссылка существует, поэтому ls -la /root/broken её показывает. Но при чтении оболочка пытается открыть цель:
cat /root/broken
# cat: /root/broken: No such file or directory
Такой symlink называется broken. Он не "исчезает" автоматически, потому что ссылка - отдельный файл.
Найти битые symlink можно через find:
find /root -xtype l
-xtype l означает: показать symlink, цель которого недоступна.
Где symlink встречаются в реальной работе
Включение конфигов nginx:
/etc/nginx/sites-available/mysite.conf
/etc/nginx/sites-enabled/mysite.conf -> ../sites-available/mysite.conf
Конфиг лежит в sites-available, а активируется созданием symlink в sites-enabled. Отключение сайта - удалить symlink, не трогая основной конфиг.
Версии программ:
/opt/myapp/releases/2026-05-12/
/opt/myapp/current -> /opt/myapp/releases/2026-05-12/
Приложение запускается из /opt/myapp/current, а деплой новой версии может сводиться к переключению symlink на другой release.
Короткие пути:
ln -s /var/log/nginx /root/nginx-logs
Теперь можно быстро открывать /root/nginx-logs, хотя реальные логи остаются в /var/log/nginx.
find: поиск файлов перед следующей лабораторной
find рекурсивно обходит дерево директорий и выводит объекты, которые подходят под условия.
Базовый синтаксис:
find WHERE CONDITIONS ACTION
Примеры:
find /opt/devops/lab4 -name "*.log"
find /opt/devops/lab4 -type f
find /opt/devops/lab4 -type d
find /opt/devops/lab4 -type l
WHERE- где искать, например/opt/devops/lab4;-name "*.log"- имя должно подходить под шаблон;-type f- только обычные файлы;-type d- только директории;-type l- только символические ссылки.
Шаблон в find -name обычно берут в кавычки:
find /var/log -name "*.log"
Кавычки нужны, чтобы *.log получил сам find. Без кавычек shell может раскрыть шаблон ещё до запуска find, и команда будет искать не то, что ты ожидаешь.
Поиск по размеру и времени
find умеет фильтровать не только по имени и типу.
Найти файлы больше 1 килобайта:
find /opt/devops/lab4 -type f -size +1k
Найти файлы меньше 10 мегабайт:
find /var/log -type f -size -10M
Знаки важны:
+1k- больше 1 килобайта;-10M- меньше 10 мегабайт;10M- примерно ровно 10 мегабайт в единицахfind.
Поиск старых файлов:
find /var/log -type f -mtime +30
-mtime +30 означает "изменённые более 30 дней назад". -mtime -30 означает "изменённые менее 30 дней назад".
find -exec: выполнить команду для найденных файлов
Иногда мало найти файлы, нужно выполнить действие для каждого результата. Для этого у find есть -exec.
Посчитать строки во всех .txt файлах:
find /opt/devops/lab4 -name "*.txt" -exec wc -l {} \;
Здесь:
wc -lсчитает строки;{}заменяется на путь найденного файла;\;завершает команду, которую нужно выполнить;- команда запускается отдельно для каждого найденного файла.
Есть пакетный вариант:
find /opt/devops/lab4 -name "*.txt" -exec wc -l {} +
С + команда запускается не для каждого файла отдельно, а для группы файлов сразу. Обычно это быстрее. Но для понимания сначала полезно запомнить вариант с \;: один найденный файл - один запуск команды.
Сравнение hard link и symlink
| Hard link | Symlink | |
|---|---|---|
| Команда | ln file link |
ln -s target link |
| Указывает на | inode | путь |
| Директории | обычно нет | да |
| Разные ФС | нет | да |
| Если цель удалена | данные живут, пока есть ссылка | ссылка становится broken |
В ls -l |
выглядит как обычный файл | тип l, стрелка -> |
| Частота использования | реже | очень часто |
В большинстве практических задач тебе нужен symlink. Hard link полезен как часть понимания файловой системы и inode, а symlink - рабочий инструмент для конфигов, релизов, логов и коротких путей.
