В чем разница между жесткой (hard link) и символической (symlink) ссылкой?

Ответ

Жесткие и символические ссылки — это два способа в Unix-подобных системах ссылаться на один и тот же файл, но они работают по-разному.

Hard Link (Жесткая ссылка)

Это дополнительное имя для существующего файла. Жесткая ссылка напрямую указывает на inode (индексный дескриптор) файла в файловой системе. Inode содержит метаданные о файле и указатели на блоки данных на диске.

  • Все жесткие ссылки на один файл равноправны.
  • Файл будет удален с диска только тогда, когда будет удалена последняя жесткая ссылка на него.
  • Нельзя создать жесткую ссылку на директорию (во избежание рекурсивных циклов).
  • Нельзя создать жесткую ссылку на файл в другой файловой системе (т.к. inode уникален только в пределах своей ФС).
# Создание жесткой ссылки
ln original-file.txt hard-link.txt

Symbolic Link (Символическая ссылка или symlink)

Это специальный файл, который содержит путь к другому файлу или директории. Он работает как ярлык в Windows.

  • Symlink не указывает на inode, а хранит текстовый путь.
  • При удалении оригинального файла symlink становится "битым" (dangling), но сам symlink остается.
  • Можно создавать symlink на директории.
  • Можно создавать symlink на файлы в других файловых системах.
# Создание символической ссылки
ln -s original-file.txt sym-link.txt

Применение в Go

В стандартной библиотеке Go есть функции для работы с обоими типами ссылок:

  • Жесткая ссылка: os.Link(oldname, newname string) error
  • Символическая ссылка: os.Symlink(oldname, newname string) error

Итоговая таблица

КритерийHard LinkSymbolic Link
На что ссылаетсяНапрямую на inode файлаНа путь к файлу
Удаление оригиналаДанные остаются, пока есть хоть одна ссылкаСсылка становится "битой"
Работа между ФСНевозможноВозможно
Ссылка на директориюНевозможно (для обычного пользователя)Возможно