Вики / Базовые команды
Ссылки (символические и жёсткие)
Разница между 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при замене симлинка-на-каталог критичен: без-nln положит ссылку ВНУТРЬ существующего каталога-цели (см. 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 # сохранить сами ссылки
См. также
- Базовые команды с файлами — Базовые команды
- Права доступа (rwx, SUID, sticky) — Пользователи и права
- Место на диске (df, du, inode) — Хранилище и ФС