Материал открыт для чтения

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

Войти
Linux: Старт в терминале

Ссылки и типы файлов: что реально лежит на диске

чтение ~8 минУрок 8 из 18

Два вида ссылок

module linux start Image03

В 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 -l hard 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 указывает на текстовый файл, его можно читать обычными командами:

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 может хранить абсолютный путь:

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 могут быть удобнее.

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

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, цель которого недоступна.


Включение конфигов 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
Команда ln file link ln -s target link
Указывает на inode путь
Директории обычно нет да
Разные ФС нет да
Если цель удалена данные живут, пока есть ссылка ссылка становится broken
В ls -l выглядит как обычный файл тип l, стрелка ->
Частота использования реже очень часто

В большинстве практических задач тебе нужен symlink. Hard link полезен как часть понимания файловой системы и inode, а symlink - рабочий инструмент для конфигов, релизов, логов и коротких путей.

Материал изучен?

Войдите, чтобы сохранить прогресс и перейти к практической лаборатории.

Войти и продолжить