В чем разница между жесткой (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 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) В текст с адресом (путь)
Удалили оригинал Похуй, живёт, пока есть хоть одна ссылка Обосрался, ссылка сдохла
Между дисками Ни хуя не выйдет Запросто, ёпта
На папку Не-а, низя Да, конечно, в чём проблема?

Вот и вся наука, блядь. Выбирай инструмент по задаче, а не потому что буква короче.