← Linux: файловая система вглубь
12 мин · средне · Урок 2 из 7

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

Жёсткие и символические ссылки, 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 Bln -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.

Дрилл · вопросы как на собесе

Проверь себя без подсказок

Сформулируй ответ вслух или письменно, потом раскрой и честно отметь: знал или нет.

01

В чём разница между hard link и symbolic (soft) link?

LIN-003

Прошли материал до конца? Отметьте урок пройденным.