Если вы только начинаете работать с 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 появится сообщение о том, что файл не существует.
Итоги экспериментов
- Создали файл source.txt.
- Создали жесткую ссылку hard_link.txt.
- Создали символическую ссылку soft_link.txt.
- При изменении содержимого файла оба типа ссылок показывают одинаковое содержимое.
- При удалении исходного файла:
– жесткая ссылка продолжает показывать данные (если она есть).
– символическая ссылка становится “битой” — она больше не работает.
Почему важно знать эти примеры?
Команда 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. Теперь вам не придется избегать ссылок, а значит, вы сможете их эффективно использовать.