Hardlink (жёсткая ссылка) — запись в файловой системе, указывающая на существующий inode. Inode — структура данных файловой системы, хранящая метаданные файла (права, размер, временны́е метки) и указатели на блоки данных. Hardlink создаёт ещё одно имя для того же inode — как псевдоним.
Как работает
Создание hardlink:
ln original.txt hardlink.txt
После этого original.txt и hardlink.txt — равноправные имена одного файла. Удаление original.txt не уничтожает данные — они остаются доступны через hardlink.txt. Данные удаляются только при нулевом счётчике ссылок (link count, поле nlink в inode). Команда ls -li показывает inode-номер и счётчик ссылок.
Ограничения hardlink: нельзя создать hardlink на директорию (только суперпользователь в специальных случаях), нельзя создать hardlink между разными файловыми системами (разными разделами/устройствами).
Символическая ссылка (ln -s target link) — отличный механизм: содержит путь к целевому файлу, может указывать на директории и пересекать файловые системы, но «ломается» при удалении цели.
История
Концепция inode и ссылок введена в Unix Version 1 (1969) в Bell Labs. Система ссылочных счётчиков — фундаментальная часть Unix и всех производных ОС (Linux, macOS, BSD). ext2/ext3/ext4 — основные файловые системы Linux — полностью поддерживают hardlink.
Практическое применение в хостинге
Hardlink используется в системах резервного копирования (rsync с --link-dest): инкрементальная копия хранит hardlink на неизменившиеся файлы предыдущего бэкапа, занимая место только для изменённых файлов. Это позволяет хранить 30 дней полных снимков сервера в пространстве, равном 1–2 полным копиям.
Жёсткие и символические ссылки
Hard link — дополнительное имя для того же inode. Удаление исходного файла не удаляет данные (пока есть хотя бы один hard link). Только для файлов (не директорий), только в пределах одной файловой системы. ln source hardlink. Symbolic link — ссылка на путь: ln -s /target /link.
Применение в хостинге
Hard links используются в инкрементальных бэкапах: rsync --link-dest создаёт hard links для неизменённых файлов — бэкап занимает лишь место изменений. Symbolic links: /var/www/current → /var/www/releases/20240101 — атомарное переключение деплоев (blue-green deploy).
Диагностика
ls -li — inode-номера файлов (одинаковый = hard link). find / -inum 1234567 — все hard links конкретного inode. stat file — число ссылок на inode. При достижении максимума hard links (65535 в ext4) — новые создать невозможно.
Иноды и ограничения файловой системы
Каждый файл потребляет один inode. ext4: по умолчанию 1 inode на 4 КБ диска (~256 инодов/МБ). Переполнение инодов при тысячах мелких файлов: df -i — проверка использования. Для систем с кэш-файлами PHP/WordPress: увеличить число инодов при форматировании: mkfs.ext4 -N 10000000 /dev/sdb.
Атомарный деплой через symlink
Паттерн: releases/ с версиями, current → symlink. Деплой: создать releases/v2 → тест → ln -sfn releases/v2 current (атомарная операция). Nginx перечитает symlink немедленно без reload. Rollback: ln -sfn releases/v1 current за секунду. Capistrano использует этот паттерн для Rails.
Hard links широко используются в инкрементальных бэкапах через rsync. Symbolic links применяются при Blue-Green деплоях. Оба типа ссылок работают в любой файловой системе Linux: LVM-тома, RAID-массивы. Docker использует overlay filesystem со схожей концепцией.