С чего начать Первые шаги трек · 15 ступеней
Linux Labs

Символические и жёсткие ссылки

3 мин Linux

Разница между symlink и hard link, когда что использовать, битые ссылки.

Шпаргалка

7 команд Версия для печати
  • ln -sfn target linkdir пересоздать symlink (на каталог — с -n!)
  • find . -xtype l битые symlink
  • cp -a src dst архивно: ссылки как есть

Обзор

Две разные «ссылки» (команда — ln):

  • Символическая (symlink) — указатель на путь. Как ярлык. Может вести на каталог и на другую ФС; ломается, если цель удалить/переместить.
  • Жёсткая (hard link) — второе имя того же inode (тех же данных). В пределах одной ФС; файл живёт, пока есть хоть одно имя.
bash
ln -s /path/to/target linkname    # символическая (обычно её и используют)
ln /path/to/target hardname       # жёсткая
ls -l                             # symlink виден как link -> target

Рецепты

2

Команды

bash
ln -s /opt/app/releases/v5 /opt/app/current     # symlink «current» на релиз
ln -sfn /opt/app/releases/v6 /opt/app/current   # атомарно переключить (-f -n)
readlink current                  # куда указывает (одна ступень)
readlink -f current               # реальный путь после всех симлинков
ls -l current                     # current -> /opt/app/releases/v6
find . -xtype l                   # найти БИТЫЕ symlink (цель не существует)
find /path -type l -ls            # все симлинки с целями
stat file                         # «Links:» — число жёстких ссылок на inode

-sfn при замене симлинка-на-каталог критичен: без -n ln положит ссылку ВНУТРЬ существующего каталога-цели (см. ln).

Symlink vs hard

Symlink (-s) Жёсткая
На каталог да нет
Между ФС да нет
Удалили цель «битый» данные живы, пока есть имена
Видно в ls -l -> target как обычный файл
Свой inode да нет (тот же)

Применение: symlink — деплой «current → релиз», переключение конфигов, общие библиотеки. hard link — дедупликация в пределах ФС (снапшот-бэкапы, см. rsync --link-dest).

Неполадки

4

Битый symlink (ведёт «в никуда»)

Цель удалили/переместили. Найди: find . -xtype l. Пересоздай на верную цель (ln -sf). ls подсветит битые красным.

Скопировал, а получил саму ссылку (или наоборот)

cp по умолчанию идёт по symlink (копирует цель). cp -P сохранит саму ссылку, cp -a/-d — архивно (ссылки как есть). tar хранит симлинки; tar -h разыменует.

du/df расходятся из-за hard link

Жёсткие ссылки делят одни блоки — du считает их один раз (что путает). Это норма; du --count-links посчитает каждое имя.

rsync «раздул» бэкап

Без -H rsync не сохраняет жёсткие ссылки (копирует данные повторно). Для снапшотов с дедупликацией — --link-dest (см. rsync).

Термины

2
символическая ссылка symbolic link
Отдельный файл, который хранит путь к другому файлу. Если цель удалить или переместить, ссылка становится битой. Создаётся командой ln -s. Ещё встречается в: Capabilities: права root по частям, Цели загрузки: default, multi-user, rescue и emergency, DNS и разрешение имён, file и ещё 3
жёсткая ссылка hard link
Ещё одно имя в каталоге для того же inode. Данные файла освобождаются, когда удалены все имена и файл не открыт ни одним процессом. Работает только в пределах одной файловой системы. Ещё встречается в: ln, namei, sed и awk

См. также

  • files-basics — Навигация и файлы — ls, cd, cp, mv, rm, cat, less, head, tail, копипаст в терминале.
  • permissions — Модель прав Unix — чтение/запись/исполнение, владелец/группа/другие, спецбиты.
  • disk-usage — Куда делось место и inode — df, du, поиск крупных файлов, ловушки.
Загрузка…