Ответ
Жесткие и символические ссылки — это два способа в 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 файла | На путь к файлу |
| Удаление оригинала | Данные остаются, пока есть хоть одна ссылка | Ссылка становится "битой" |
| Работа между ФС | Невозможно | Возможно |
| Ссылка на директорию | Невозможно (для обычного пользователя) | Возможно |
Ответ 18+ 🔞
А, ну вот, опять про эти ваши ссылки, блядь! Слушай, сейчас я тебе так объясню, что ты, сука, в рот меня чих-пых, всё поймёшь. Представь себе файл — это как квартира, окей?
Жёсткая ссылка (Hard Link) — это как если бы у одной квартиры было несколько адресов в паспортном столе. Все бумажки ведут на одну и ту же квартиру, на один и тот же inode, блядь. Inode — это типа техпаспорт на квартиру, где всё записано. Удалишь один адрес — ничего, квартира стоит. Удалишь все адреса — вот тогда только домушники придут и квартиру снесут, то есть данные с диска сотрут. И главное, блядь, нельзя сделать такой «адрес» на квартиру в другом городе (другой файловой системе) и нельзя на подъезд (директорию) — только на конкретную квартиру-файл. Пиздец, логично же!
# Делаем ещё один адрес на ту же квартиру
ln original.txt hard-copy.txt
А теперь символическая ссылка (Symlink) — это, сука, просто бумажка, на которой написано «Ключи под ковриком, адрес: улица Ленина, 1, кв. 5». Это не квартира, это записка! Удали оригинальную квартиру (файл) — и твоя записка превращается в пиздёж, ведёт в никуда, в пустоту, блядь. Зато эту бумажку можно кинуть куда угодно, даже в другой город (другой диск), и на ней можно написать «иди в такой-то подъезд» (ссылку на директорию). Удобно, но ненадёжно, как доверие к первому встречному.
# Пишем бумажку-указатель
ln -s original.txt shortcut.txt
В Go с этим тоже всё просто, не выёбывайся. Хочешь жёсткую ссылку — os.Link(). Хочешь бумажку-симлинк — os.Symlink(). Выбирай, что тебе надо: надёжность как у танка или гибкость как у гимнастки.
Короче, смотри таблицу, чтобы вообще ни хуя не путать:
| Вопрос | Hard Link (Танк) | Symbolic Link (Бумажка) |
|---|---|---|
| Цель | Прямо в техпаспорт (inode) | В текст с адресом (путь) |
| Удалили оригинал | Похуй, живёт, пока есть хоть одна ссылка | Обосрался, ссылка сдохла |
| Между дисками | Ни хуя не выйдет | Запросто, ёпта |
| На папку | Не-а, низя | Да, конечно, в чём проблема? |
Вот и вся наука, блядь. Выбирай инструмент по задаче, а не потому что буква короче.