Ссылки в Linux — это мощный инструмент, позволяющий указывать путь к файлам и каталогам. Существует два основных типа ссылок: жёсткие ссылки и мягкие ссылки (вторые также известны как символические ссылки или симлинки). Понимание различий между этими двумя типами поможет вам эффективно управлять файловой системой.

❯ Что такое ссылка?

Прежде чем начать работать с жёсткими и мягкими ссылками, давайте разберёмся, что представляет собой ссылка в Linux.

Каждое запоминающее устройство содержит файлы и каталоги, хранящиеся поблочно.

Информация о файле или каталоге хранится в специальной структуре данных, называемой индексный дескриптор или айнод (inode).

Индексные дескрипторы содержат метаданные, такие как владелец файла, дата его создания и последнего доступа, размер, права доступа, а также указатели на блоки данных, в которых фактически хранится содержимое файла, плюс другие сведения.

Любой носитель информации, например жесткий диск, флэш-накопитель и т. д., имеет свои собственные индексные дескрипторы. Эти айноды зависят от файловой системы, устройства, на котором хранится информация, и от раздела. Поэтому если мы перенесем один текстовый файл с локального носителя на флешку, то этот файл получит другой инод.

Каждый индексный дескриптор имеет уникальный номер, по которому файловая система его и находит.

Запись в каталоге — это, по сути, таблица, поддерживаемая файловой системой. В этой таблице содержится имя файла или каталога и указатель (ссылка, часто в виде адреса) на номер индексного дескриптора.

Имя файла

Номер индексного дескриптора

report.txt

43132770

image.png

43132771

Невозможно напрямую просматривать необработанные записи каталога, поскольку файловая система управляет ими на низком уровне. Однако мы можем просмотреть информацию о файлах в каталоге, включая номера индексных дескрипторов, которые являются частью записей каталога, с помощью команд ls -li или stat.

Ссылка — это просто ещё одна запись в каталоге для файла или директории. Она находится между именем файла и фактическими данными, хранящимися в файловой системе. Создавая ссылки, мы можем иметь несколько записей в каталоге (имён) для одного и того же файла или директории, что позволяет использовать два или более имени для одного и того же объекта.

❯ Жесткие ссылки

Жёсткая ссылка — это запись в каталоге, которая указывает непосредственно на инод файла. Она действует как отдельный файл и ссылается на конкретное место на жёстком диске. Это зеркальная копия оригинального файла. Давайте рассмотрим, как создавать жёсткие ссылки и узнаем, как они работают. Для создания жёсткой ссылки используется команда ln.

Как создать жесткую ссылку

1. Создайте исходный файл:

echo "Hello World!" > original.txt

2. Создайте жесткую ссылку:

ln original.txt hardlink.txt

3. Сверьте номера индексных дескрипторов у исходного файла и файла с жёсткой ссылкой:

ls -i original.txt hardlink.txt

Как мы видим, файлы original.txt и hardlink.txt имеют одинаковый номер индексного дескриптора, что указывает на то, что они ссылаются на одно и то же содержимое файла.

Редактирование жесткой ссылки

4. Внесите изменения в жёсткую ссылку hardlink.txt:

echo "Nice to see you World" >> hardlink.txt

5. Проверьте содержимое исходного файла original.txt:

cat original.txt

Как видите, изменения, внесённые в hardlink.txt, отображаются и в original.txt, поскольку они ссылаются на один и тот же индексного дескриптора.

Удаление исходного файла

6. Удалите исходный файл:

rm original.txt

7. Проверьте содержание жесткой ссылки hardlink.txt:

cat hardlink.txt

Как видим, содержимое файла по-прежнему доступно через hardlink.txt, поскольку индексный дескриптор и блоки данных сохраняются до тех пор, пока не будут удалены все жёсткие ссылки.

Создание нескольких жёстких ссылок

8. Создайте другую жесткую ссылку:

ln hardlink.txt another-hardlink.txt

9. Проверьте номерамндексных дескрипторов:

ls -li hardlink.txt another-hardlink.txt

Снова файлы hardlink.txt и another-hardlink.txt имеют одинаковый номер инода, что означает, что они ссылаются на одно и то же содержимое файла.

❯ Преимущества и недостатки жёстких ссылок

Жесткие ссылки имеют следующее преимущества:

  1. Эффективная компоновка: несколько жёстких ссылок могут совместно использовать один и тот же инод и блоки данных, что означает, что при создании нескольких жёстких ссылок на один файл не тратится лишнее место на диске.

  2. Доступность файла: пока существует хотя бы одна жёсткая ссылка на файл, данные файла остаются доступными. Удалив одну жёсткую ссылку, мы не удаляем сам файл.

  3. Производительность: жёсткие ссылки обычно срабатывают быстрее мягких, поскольку указывают непосредственно на индексный дескриптор и не требуют разрешения пути.

  4. Прозрачность: жёсткие ссылки выглядят и функционируют как обычные файлы. Нет различия между исходным файлом и указывающими на него жёсткими ссылками.

  5. Консистентность: все жёсткие ссылки на файл всегда актуальны. Любые изменения, внесённые через любую жёсткую ссылку, немедленно отражаются во всех остальных.

Хотя жёсткие ссылки полезны, у них есть некоторые ограничения:

  1. Ограничения на каталоги: жёсткие ссылки можно создавать только для обычных файлов (не для каталогов или специальных файлов).

  2. Ограничение на одну файловую систему: жесткие ссылки не могут распространяться на несколько файловых систем. Они работают только в том случае, если новая жесткая ссылка существует в той же файловой системе, что и исходная.

❯ Мягкие ссылки

Мягкая ссылка (символическая ссылка) — это отдельный файл, содержащий путь к другому файлу или директории. В отличие от жёстких ссылок, мягкие ссылки не ссылаются напрямую на индексный дескриптор целевого файла, а имеют собственные индексные дескрипторы и содержат путь к целевому файлу или каталогу.

Создание мягкой ссылки

1. Создайте исходный файл:

echo "Hello World" > original.txt

2. Создайте мягкую ссылку с помощью команды ln -s:

ln -s original.txt softlink.txt

? При создании символических ссылок следует указывать абсолютный путь, поскольку относительные пути не будут работать.

3. Проверьте мягкую ссылку, введя команду:

ls -l original.txt softlink.txt

4. Прочитайте содержимое файла softlink.txt:

cat softlink.txt

Редактирование мягких ссылок

5. Отредактируйте мягкую ссылку softlink.txt:

echo "Nice to see you World!" >> softlink.txt

6. Проверьте содержимое исходного файла original.txt:

cat original.txt

Как видите, изменения, внесённые через softlink.txt, отражаются в original.txt.

Перемещение целевого файла

7. Переместите файл original.txt в другое место в системе (или удалите его):

mv original.txt ./backup/

8. Снова проверьте содержимое файла softlink.txt:

cat softlink.txt

Как мы видим, мягкая ссылка становится «висячей», поскольку объект, на который она указывала, был перемещен в другое место (или больше не существует, если файл был удалён).

Ссылки на каталоги

Поскольку связь мягкой ссылки является логической, а не дублированием, символические ссылки могут указывать на целые каталоги или на файлы на удалённых компьютерах. Жёсткие ссылки для этого не предназначены. Давайте разберёмся, как это работает.

9. Создайте папку и файл:

mkdir my-folder
echo "Learn how to create soft links to folders" > my-folder/file

10. Создайте мягкую ссылку с названием soft-folder для каталога my-folder:

ln -s my-folder soft-folder

11. Проверьте ссылку:

ls -l

12. Получите доступ к каталогу my-folder через символическую ссылку soft-folder:

ls soft-folder

13. Удалите исходный каталог my-folder и выведите содержимое soft-folder:

rm -r my-folder
ls soft-folder

Как мы видим, поскольку исходная папка была удалена, при выводе содержимого soft-folder ничего не отображается. Объект, на который указывала ссылка, был удален, и ссылка стала бесполезной.

❯ Преимущества и недостатки символических ссылок

Символические ссылки имеют следующие преимущества:

  1. Гибкость: мягкие ссылки могут указывать как на файлы, так и на директории, а также работать между разными файловыми системами или разделами.

  2. Удобство: не составляет труда создавать ярлыки и организовывать файлы с помощью мягких ссылок. Они могут указывать на пока не существующие файлы и заработают, как только цель для них будет создана.

  3. Низкие издержки: размер файлов символических ссылок небольшой, так как они содержат только путь к цели.

Однако у символических ссылок есть и недостатки:

  1. Хрупкость: они могут стать «висячими» ссылками, если цель будет перемещена, переименована или удалена.

  2. Производительность: доступ к символическим ссылкам немного медленнее, чем к жёстким, поскольку требуется дополнительный шаг разрешения пути.

  3. Небезопасность: если ими неправильно управлять, мягкие ссылки могут представлять угрозу безопасности, так как могут указывать на конфиденциальные файлы.

  4. Разные индексные дескрипторы: мягкие ссылки имеют собственные айноды, из-за чего количество айнодов в системе может слишком увеличиться.


Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале

Опробовать ↩

? Читайте также:

Комментарии (6)


  1. Apoheliy
    05.07.2025 08:30

    Спасибо, лаконичный перевод. Всё по делу.

    Прим.:

    Картинка после текста:

    Сверьте номера индексных дескрипторов у исходного файла и файла с жёсткой ссылкой:

    неправильная/предыдущая.


    1. Albert_Wesker Автор
      05.07.2025 08:30

      Спасибо, починил.


  1. askharitonov
    05.07.2025 08:30

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

    А что под этим подразумевается? Можно же сделать символическую ссылку, которая будет указывать, допустим, на файл ../another_dir/file.txt, причём при копировании в другой каталог она будет указывать на тот же путь ../another_dir/file.txt относительно нового местоположения (т.е. на другой файл).


  1. 0mogol0
    05.07.2025 08:30

    Кстати, не нашёл, а можно ли копировать / переносить мягкие и / или жёсткие ссылки?


    1. pae174
      05.07.2025 08:30

      Можно. Смотрите ман на команды cp и tar (ну и на другие архиваторы). У нах там есть много ключей по поводу того, как надо обрабатывать ссылки, надо ли по ним ходить в случае реурсивного обхода директории и так далее.


  1. apevzner
    05.07.2025 08:30

    Невозможно напрямую просматривать необработанные записи каталога, поскольку файловая система управляет ими на низком уровне

    Возможно. Можно открыть директорию на чтение, как файл и хоть обчитаться. Проблема в том, что формат прочтённого оттуда зависит от типа файловой системы, чтобы с этим не заморачиваться, существует opendir и т.п.

    Это зеркальная копия оригинального файла.

    Я б подчеркнул, что все жесткие ссылки совершенно равноправны, на них никак не отмечено, какая из них была оригиналом.

    при создании нескольких жёстких ссылок на один файл не тратится лишнее место на диске.

    При создании символических ссылок его тратится не сильно больше. Символическая ссылка - это маленький текстовый файл, а на современных файловых системах содержимое маленьких файлов хранится прямо в i-node и не требует дополнительных блоков.

    жёсткие ссылки обычно срабатывают быстрее мягких

    Там всё это настолько агрессивно кешируется, что на практике разница невелика

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

    Будут работать, но отсчитываюся они не от текущего каталога, а от той директории, в которой живет символическая ссылка.

    Иногда это хорошо, иногда не очень. Например, если ссылки относительные, то целую иерархию директорий, содержащую ссылки и то, на что они ссылаются, можно перенести в другое место и ничего не сломается. Но если перенести в другое место директорию, содержащую ссылку, а не то, на что она ссылается, то относительная ссылка может сломаться, а абсолютная - нет.

    Поскольку связь мягкой ссылки является логической, а не дублированием, символические ссылки могут указывать на целые каталоги или на файлы на удалённых компьютерах. Жёсткие ссылки для этого не предназначены

    Это чисто волевое решение из 1970-х, запретить жестким ссылкам ссылаться на директории, чтобы избежать необходимости в программах, работающих с директориями, реализовывать логику, учитывающую возможность организовать цикл.

    Но с появлением символических ссылок и bind mount эту логику всё равно пришлось написать (или смириться с вожможностью зацикливания), поэтому это ограничение теперь - просто такой технический артефакт, оставшийся нам от времен динозавров.

    Низкие издержки: размер файлов символических ссылок небольшой, так как они содержат только путь к цели.

    А выше говорилось, что низкие издержки присущи жестким ссылкам :)

    Небезопасность: если ими неправильно управлять, мягкие ссылки могут представлять угрозу безопасности, так как могут указывать на конфиденциальные файлы.

    Они не дают доступа к файлу. Правда, они могут раскрывать сам факт существования такого файла и его название. Например, если файл называется "Приказ об увольнении Иванова И.И.doc", то о чём он, понятно и без заглядывания внутрь...

    Разные индексные дескрипторы: мягкие ссылки имеют собственные айноды, из-за чего количество айнодов в системе может слишком увеличиться.

    Иноды дёшевы. В хорошо настроенной системе их с запасом. А на некоторых файловых системах они просто выделяются динамически, по мере надобности, и делят место со всеми остальными запчастями ФС.