Примеры использования команды ln в Linux: как работают жесткие и символические ссылки.

Если вы только начинаете работать с Linux, то команда ln может показаться сложной. Но на самом деле она очень полезна для создания ссылок на файлы и папки.

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

Создаем папку для экспериментов

Для начала создадим папку, где будем отрабатывать примеры на практике:

[root@waky ~]# mkdir examples
[root@waky ~]# cd examples/
[root@waky examples]#

Теперь находясь в директории examples  создадим файл с текстом:

[root@waky examples]# echo "simple text" > source.txt
[root@waky examples]# cat source.txt
simple text
[root@waky examples]# 

Жесткие ссылки (hard links)

По умолчанию команда ln создает жесткую ссылку. Например:

[root@waky examples]# ln source.txt hard_link.txt
[root@waky examples]# ls -l
total 8
-rw-r--r-- 2 root root 12 Jun  3 08:53 hard_link.txt
-rw-r--r-- 2 root root 12 Jun  3 08:53 source.txt
[root@waky examples]# 

Что такое жесткая ссылка? Это такой файл, который указывает на один и тот же “информационный блок” (inode) исходного файла. То есть, оба файла — source.txt и hard_link.txt — ссылаются на одни и те же данные.

Что происходит при этом?

Если вы измените содержимое одного из файлов, то изменения появятся в другом:

[root@waky examples]# cat hard_link.txt
simple text
[root@waky examples]# echo "new text" > source.txt
[root@waky examples]# cat hard_link.txt
new text
[root@waky examples]#

Удаление одного из них не повлияет на другой — файл продолжит существовать, пока есть хотя бы одна ссылка.

Если вы удалите source.txt, то hard_link.txt останется, и его содержимое не исчезнет:

[root@waky examples]# rm -f source.txt
[root@waky examples]# ls -l
total 4
-rw-r--r-- 1 root root 9 Jun  3 08:59 hard_link.txt
[root@waky examples]# cat hard_link.txt
new text
[root@waky examples]#

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

Что такое inode?

Чтобы понять работу жестких ссылок, нужно знать про inode — это уникальный номер или идентификатор файла внутри системы. Он содержит всю информацию о файле: владельца, размер, расположение данных и т.д.

Когда создается жесткая ссылка, она просто указывает на тот же inode. Поэтому оба файла — это по сути один и тот же объект.

Символические ссылки (soft links или symlinks)

Теперь рассмотрим другой тип — символическая ссылка. Ее создают командой ls с добавлением аргумента -s. Не забудьте перед созданием ссылки пересоздать файл source.txt удаленный в прошлом примере:

[root@waky examples]# echo "another simple text" > source.txt
[root@waky examples]# ln -s source.txt soft_link.txt
[root@waky examples]# ls -l
total 8
-rw-r--r-- 1 root root  9 Jun  3 08:59 hard_link.txt
lrwxrwxrwx 1 root root 10 Jun  3 09:11 soft_link.txt -> source.txt
-rw-r--r-- 1 root root 20 Jun  3 09:10 source.txt
[root@waky examples]# 

Это похоже на ярлык или shortcut в Windows. Символическая ссылка — это отдельный файл, который указывает путь к другому файлу или папке.

Обращение к такой ссылке эквивалентно обращению к исходному файлу:

[root@waky examples]# cat soft_link.txt
another simple text
[root@waky examples]#

В чем отличие от жесткой ссылки?

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

Если удалить исходный файл (source.txt), то символическая ссылка станет “битой” (выделяется красным) — при попытке открыть ее появится сообщение о том, что файл не найден.

Если удалить саму ссылку (soft_link.txt), исходный файл остается без изменений.

Если вы удалите soft_link.txt, то ничего не случится с исходным файлом source.txt:

[root@waky examples]# rm -f soft_link.txt
[root@waky examples]# ls -l
total 8
-rw-r--r-- 1 root root  9 Jun  3 08:59 hard_link.txt
-rw-r--r-- 1 root root 20 Jun  3 09:10 source.txt
[root@waky examples]# cat source.txt
another simple text
[root@waky examples]#

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

[root@waky examples]# rm -f source.txt
[root@waky examples]# ls -l
total 4
-rw-r--r-- 1 root root  9 Jun  3 08:59 hard_link.txt
lrwxrwxrwx 1 root root 10 Jun  3 09:19 soft_link.txt -> source.txt
[root@waky examples]# cat soft_link.txt
cat: soft_link.txt: No such file or directory
[root@waky examples]#

При открытии soft_link.txt появится сообщение о том, что файл не существует.

Итоги экспериментов

  1. Создали файл source.txt.
  2. Создали жесткую ссылку hard_link.txt.
  3. Создали символическую ссылку soft_link.txt.
  4. При изменении содержимого файла оба типа ссылок показывают одинаковое содержимое.
  5. При удалении исходного файла:
    – жесткая ссылка продолжает показывать данные (если она есть).
    – символическая ссылка становится “битой” — она больше не работает.

Почему важно знать эти примеры?

Команда ln очень полезна для организации файловой системы: можно создавать быстрые ссылки без копирования данных или управлять доступом к файлам через символические ярлыки.

Для самых любознательных

Если хотите лучше понять команду ln и различия между типами ссылок, вот еще один эксперимент. Удалим прошлые файлы и создадим два новых с различным содержанием:

[root@waky examples]# rm -f hard_link.txt soft_link.txt
[root@waky examples]# echo 'first file' > file_1.txt
[root@waky examples]# echo 'second file' > file_2.txt
[root@waky examples]#

Создадим жесткую и символическую ссылку первого файла:

[root@waky examples]# ln file_1.txt hard_link.txt
[root@waky examples]# ln -s file_1.txt soft_link.txt
[root@waky examples]# cat hard_link.txt
first file
[root@waky examples]# cat soft_link.txt
first file
[root@waky examples]#

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

Заменим первый файл вторым и проверим ссылки:

[root@waky examples]# rm -f file_1.txt
[root@waky examples]# mv file_2.txt file_1.txt
[root@waky examples]# cat hard_link.txt
first file
[root@waky examples]# cat soft_link.txt
second file
[root@waky examples]#

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

Символическая ссылка просто указывает на путь в ОС, и возвращает содержимое файла, оказавшегося на этом месте. В данном случае – это текст второго файла, который сменил имя.

Заключение

Как и обещал, на практике понять ссылки, их различия и применение проще, чем по описанию. Надеюсь, статья помогла разобраться и на примерах показала особенности использования команды ln в Linux. Теперь вам не придется избегать ссылок, а значит, вы сможете их эффективно использовать.