Жёсткие и символические ссылки
Жёсткие и символические ссылки, inode.
inode и имя файла
inode — это запись, где лежат все метаданные файла: размер, права, владелец, времена изменения и указатели на блоки с данными. Самого имени файла в inode нет. Имя живёт в каталоге: каталог хранит пары «имя → номер inode».
Посмотреть номер inode можно флагом -i у ls:
$ ls -li notes.txt
1310745 -rw-r--r-- 1 deploy deploy 42 Jul 11 09:14 notes.txt
Первое число (1310745) — номер inode. Дальше идёт колонка со счётчиком
ссылок (1): сколько имён указывают на этот inode. Про устройство inode
подробно есть отдельный урок linux-admin/fs-inodes.
Жёсткая ссылка
Жёсткая ссылка — это ещё одно имя для того же inode. Команда ln без флагов
создаёт такое имя: два разных пути ведут к одним и тем же данным.
$ ln notes.txt backup.txt
$ ls -li notes.txt backup.txt
1310745 -rw-r--r-- 2 deploy deploy 42 Jul 11 09:14 backup.txt
1310745 -rw-r--r-- 2 deploy deploy 42 Jul 11 09:14 notes.txt
Номер inode у обоих одинаковый (1310745), а счётчик ссылок вырос до 2.
Записал что-то через одно имя, и изменение видно через второе, потому что
данные общие.
Данные существуют, пока счётчик ссылок больше нуля. Удаление одного имени уменьшает счётчик, но не трогает содержимое:
$ rm notes.txt
$ ls -li backup.txt
1310745 -rw-r--r-- 1 deploy deploy 42 Jul 11 09:14 backup.txt
Счётчик снова 1, данные на месте. Освободятся они только когда исчезнет
последнее имя.
Символическая ссылка
Символическая ссылка (symlink) — отдельный маленький файл, внутри которого
записан путь к цели. Создаётся флагом -s:
$ ln -s /var/log/app/current app.log
$ ls -li app.log
1310902 lrwxrwxrwx 1 deploy deploy 22 Jul 11 09:20 app.log -> /var/log/app/current
У symlink свой inode (1310902, не как у цели), тип l в начале строки и
стрелка на путь. Обращение к app.log система разворачивает по этому пути и
попадает в цель.
Symlink умеет то, чего не может жёсткая ссылка: указывать на каталог и пересекать границы файловых систем. Жёсткая ссылка работает только внутри одной файловой системы, потому что номера inode уникальны в пределах своей файловой системы, а не глобально.
Расплата за гибкость: symlink ломается, если цель удалить или перенести. Путь внутри остаётся прежним, но вести уже некуда:
$ rm /var/log/app/current
$ cat app.log
cat: app.log: No such file or directory
Сама ссылка при этом цела, битой стала цель. Такую висящую ссылку ls
обычно подсвечивает красным.
Чем они отличаются
| Свойство | Жёсткая ссылка | Символическая ссылка |
|---|---|---|
| Команда | ln A B | ln -s A B |
| На что указывает | на inode | на путь |
| Свой inode | нет, общий с целью | да, отдельный |
| На каталог | нельзя | можно |
| Между файловыми системами | нельзя | можно |
| Удалили цель | данные живы, пока счётчик > 0 | ссылка ломается |
Две частые ошибки
Первая: «жёсткая и символическая ссылка это одно и то же». Разные вещи.
Жёсткая делит inode с целью, symlink хранит путь и имеет свой inode. Проверить
легко по ls -li: у жёсткой ссылки номер inode совпадает с оригиналом, у
symlink нет.
Вторая: «удалил файл, и жёсткая ссылка стала битой». Нет. У жёсткой ссылки нет понятия «оригинал» и «копия», это равноправные имена одного inode. Пока счётчик ссылок больше нуля, данные на месте:
$ ln data.bin data-hardlink.bin
$ rm data.bin # удалили одно имя
$ cat data-hardlink.bin # данные читаются
Битым от удаления становится только symlink, потому что он держит путь, а не сами данные.
Что важно запомнить
inode хранит метаданные и указатели на данные. Имя файла — запись в каталоге, ссылающаяся на inode.
Жёсткая ссылка (ln) — ещё одно имя того же inode; данные живут, пока счётчик
ссылок больше нуля.
Символическая ссылка (ln -s) — файл с путём к цели; умеет каталоги и другие
файловые системы, но ломается, если цель убрать.
ls -li показывает номер inode и счётчик ссылок. Так их и различают.
В следующем уроке — виртуальные файловые системы /proc и /sys.
Дрилл · вопросы как на собесе
Проверь себя без подсказок
Сформулируй ответ вслух или письменно, потом раскрой и честно отметь: знал или нет.
В чём разница между hard link и symbolic (soft) link?
LIN-003Прошли материал до конца? Отметьте урок пройденным.
Прогресс сохранён в этом браузере
Почистишь историю или откроешь с телефона, и отметки пропадут. Оставь почту, они переедут в аккаунт. Пароль придумывать не нужно.
Готово. теперь в аккаунте: прогресс виден с любого устройства. Мой прогресс