linux-labs

Вики / Базовые команды

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

Концепция Linux БазовоеФайлы

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

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

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

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

Битый 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).

ln -s target link                 # символическая (обычная)
ln -sfn target linkdir            # пересоздать symlink (на каталог — с -n!)
readlink -f link                  # реальная цель
find . -xtype l                   # битые symlink
ln target hardlink                # жёсткая (та же ФС, тот же inode)
cp -P link  /  cp -a src dst      # сохранить сами ссылки

См. также