Ответ
Жесткие и символические ссылки — это два способа в 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 Link | Symbolic Link |
---|---|---|
На что ссылается | Напрямую на inode файла | На путь к файлу |
Удаление оригинала | Данные остаются, пока есть хоть одна ссылка | Ссылка становится "битой" |
Работа между ФС | Невозможно | Возможно |
Ссылка на директорию | Невозможно (для обычного пользователя) | Возможно |