Администрирование FreeBSD, Linux, ... Простое объяснение символических (soft links) и жестких (hard links) ссылок Thu, November 21 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Простое объяснение символических (soft links) и жестких (hard links) ссылок Печать
Добавил(а) microsin   

В статье сделана попытка объяснить на простых примерах понятие ссылок в файловой системе, а также в каких случаях их стоит применять. Взято на Хабре тут: http://habrahabr.ru/blogs/linux/99746/.

Далее разговор пойдет о Unix-like файловых системах, как ext3, ext4 и т.д., потому что концепция ФС Windows не позволяет так же прозрачно работать со ссылками, как ФС Unix-систем (см. «Символические ссылки в Windows»). Максимум, что может предоставить продвинутым пользователям система Windows – механизм «ярлыков». Хотя и тут они не всё продумали – как-то раз в школе приятель скинул мне на дискету много-много больших игр, каждая из которых должна была занимать, по идее, CD-диск. Думаю, вы догадались, что я обнаружил на дискете. Так что разработчикам Windows приходится несладко – всё время нужно думать, как оградить пользователя от самого себя. Напротив, создатели Unix-систем постоянно как бы намекают нам: используйте ссылки!

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

Чтобы понять, что такое символические ссылки – представьте себе каталог бумажной документации (куча полок с документами). Пусть есть полки «Строительные стандарты» и «Машиностроительные стандарты». Но как поступить, если у нас есть стандарт, относящийся к проектированию механосборочных цехов? Ведь этот стандарт может понадобиться и строителям и в машиностроении.

Первый подход состоит в том, чтобы положить этот документ в секцию «Строительные», а в секции «Машиностроение» оставить заметку, что документ с таким названием находится в секции «Строительные стандарты». Такой подход применим, если документ более относится к строительной тематике, нежели к машиностроению.

unix_links01.png

Это и называется «символическая ссылка» – файл помещается в каталог («Строительные»), а в другом каталоге («Машиностроение») создается специальный файл, указывающий на документ в каталоге «Строительные». При попытке прочитать или редактировать файл-ссылку, файловая система перенаправит нас на файл-оригинал. При удалении символической ссылки – исходный файл остается. Т.е. всё как в приведенной выше аналогии с полками. Если удалить исходный документ – ссылка останется на месте.

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

Практическая работа по символическим ссылкам:

cd                   # в домашний каталог
mkdir -p standards/{civil,mechanical} # создать структуру необходимых каталогов
cd standards/civil   # в каталог строительных стандартов
touch document1.txt  # создаем новый файл со стандартом
echo "some text" > document1.txt  # содержимое...

man ln               # для выхода нажать "q"; это справка по "ln", почитайте
cd ../mechanical/    # в каталог машиностроительных стандартов
ln -s ../civil/document1.txt document1.txt    # создаем симв. ссылку
                                              # с таким же именем
ls -l                # посмотрим, что вышло
pwd                  # где мы находимся
file document1.txt   # что за файл "document.txt" в текущем каталоге?
cat document1.txt    # просмотр исходного файла по ссылке
echo "additional text" >> document1.txt   # редактирование файла по ссылке
cat ../civil/document1.txt  # видно, что оригинал изменился
rm -f ../civil/document1.txt   # удаление оригинального документа
ls -l                # а ссылка осталась
cat document1.txt    # ошибка, т.к. ссылка "висячая" (ссылается на
                     # несуществующий файл)
echo "new text" >> document1.txt   # запись в файл по ссылке;
                                   # будет создан новый файл-оригинал -
                                   # ~/standards/civil/document1.txt
cat document1.txt    # переход по ссылке, видно что файл-оригинал существует

cp document1.txt ../document1.txt  # копируем ссылку в каталог "standards"
cd ../                             # переход в каталог "standards"
ls -l                              # видно, что скопирован файл-оригинал
file document1.txt                 # ...не ссылка, а настоящий файл

В качестве самостоятельного упражнения – попробуйте создать символическую ссылку на каталог. Найдите легкий способ создания символических ссылок в вашей любимой оконной среде (например, с помощью drag-n-drop); создайте символические ссылки на рабочем столе для наиболее часто используемых приложений.

[Жесткие ссылки (hardlinks)]

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

Представим, что есть книга, пусть «О мышах и людях». В нашем городе подобные вещи не пользуются особой популярностью, так что предположим что эта книга есть только в одной, скажем, в центральной библиотеке. Но вот мы пришли в местную библиотеку и не нашли там этой книги. Зато там есть карточка, в которой указан код книги. И вот, библиотекарь звонит в другие библиотеки и узнает, что такая книга есть в центральной. Скажем, у нас хороший сервис и вам тут же ее привозят. Вот так работают жесткие ссылки.

unix_links02.png

Чтобы представление о жестких ссылках было полное, сделаем кое-какие уточнения. В местной библиотеке могут убрать карточку этой книги (скажем, библиотека была государственная, а стала частной). Но книга останется. Если же карточки на эту книгу уберут из всех библиотек – это может означать только одно – самой книги тоже нет (возможно кто-то взял последний экземпляр и не вернул, негодяй такой; помню, я долго не мог взять почитать в институтской библиотеке фантастический роман – его долго не отдавала какая-то девушка. С девушкой я так и не познакомился, но к счастью в файловой системе ваши «книги» всегда будут на месте, лишь бы вы не удалили последнюю «карточку» на нее – об этом ниже).

Рассмотрим теперь, как эта модель функционирует в файловой системе. На самом деле, всегда существует как минимум одна жесткая ссылка на файл. Т.е. сам файл (его содержимое) находится где-то на жестком диске, и у него есть уникальный номер (как книга в Хранилище в модели выше). А имя файла хранится отдельно, в «файловом индексе» (inode) – он соответствует карточке в модели выше. Также в файловом индексе содержится тот же уникальный номер – а поскольку номера одинаковы, то этот файловый индекс и будет являться жесткой ссылкой на само содержимое файла.

unix_links03.png

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

unix_links04.png

Если удалить оба файловых индекса (т.е. обе жестких ссылки) – то счетчик жестких ссылок для содержимого файла станет 0, и содержимое файла удалится. Когда говорят «удалить файл» – на самом деле это означает, что есть один файловый индекс, жестко связанный (по уникальному номеру) с содержимым этого файла – и удаляя этот (единственный) файловый индекс – содержимое файла стирается с жесткого диска автоматически.

Практическая работа по жестким ссылкам:

# в той же иерархии каталогов, что была создана в работе по симв. ссылкам
# /home/joe/standards
cd civil
echo "123456" > myfile
ls -i myfile                    # уникальный номер созданного файла
ls -l myfile                    # число 1 указывает, что у файла одна жесткая
                                # ссылка
ln myfile ../mechanical/myfile  # создаем жесткую ссылку
                                # пусть имена файлов будут одинаковые
cd ../mechanical/
ls -i myfile                    # уникальные номера совпадают
ls -l myfile                    # видим, что у файла уже 2 жестких ссылки
file myfile                     # при чем файловая система видет напрямую файл
                                # а не ссылку (как при симв. ссылке)

cp myfile ../myfile             # скопируем в каталог standards
cd ../
ls -il myfile                   # у скопированного файла уже другой уникальный
                                # номер, и счетчик ссылок – 1, т.е. это новый
                                # файл а не жесткая ссылка на созданный нами
rm -f civil/myfile              # удалим созданный нами в самом начале файл
cd mechanical/
ls -il myfile                   # количество ссылок стало 1, но номер тот же

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

[Выводы]

  1. Символические ссылки удобно использовать, когда файл-оригинал будет находится по неизменному пути (не будет переноситься в дальнейшем) и его имя будет оставаться также неизменным. Нормально будет сделать символическую ссылку для запуска приложения /usr/bin/local/myapp из каталога рабочего стола, скажем /home/joe/Desktop. Таким образом из графической оболочки (например, KDE) можно будет быстро, одним щелчком мыши, запустить приложение myapp. Такая ссылка будет скорее всего всегда актуальная, т.к. в /usr/bin редко что переименовывается. Также немаловажно, что при обновлении программы myapp (скажем, ее удалят и на ее место скопируют новую копию) – ссылка останется актуальной. Наиболее часто я использую символические ссылки именно в таком ключе – создаю ссылки для приложений на рабочий стол
  2. Жесткие ссылки удобно использовать при другого рода динамике системы. Например, мы администрируем сервер электронной библиотеки. Есть книга, относящаяся к математике и музыке (назовем ее «Математика и музыка»). При чем оговоримся, что эта книга никогда не будет заменена на более новую с таким же именем файла. Вполне резонно будет сделать жесткие ссылки так, чтобы книга находилась и в разделе «Математика», и в разделе «Музыка»
  3. Чаще применяют символические ссылки; это связано с динамикой изменения системы. Например, при обновлениях старые файлы удаляются, создаются новые, с теми же именами, и жесткие ссылки не обеспечат правильного поведения

[Примеры применения ссылок]

  • есть разные оболочки (интерпретаторы команд консоли) – bash, dash и т.д. Но всегда есть файл /bin/sh – это как раз символическая ссылка на конкретную программу (выполните команду «file /bin/sh», чтобы убедится в этом). Чтобы изменить реализацию интерпретатора команд в системе – достаточно изменить символическую ссылку sh на соответствующий исполняемый файл
  • когда вы выполняете команду «ls -la» и видите каталоги «..» и «.» — это жесткие ссылки, создаваемые системой для предыдущего и текущего каталога соответственно. Сами вы не можете создавать жесткие ссылки на каталоги, а вот система может
  • допустим, у вас есть фильм «Into the wild» и саундтреки (OST) к нему. Очевидно, саундтреки относятся и к данному фильму, и к категории «Музыка». Мы хотим видеть эти саундтреки и в каталоге фильма, и в каталоге музыки. Но если положить саундтреки и туда, и туда — это займет в 2 раза больше места на диске, и если вы захотите дополнить или изменить файлы саундтреков — придется делать это в двух местах. Выход из этой ситуации — положить саундтреки в каталог «Музыка» (очевидно, что к этой категории они относятся больше, чем к фильмам) и сделать на весь каталог саундтреков символическую ссылку, которая будет находиться в каталоге с фильмом:
    ~/Data/Video/Movies/Into the wild/OST -> ~/Data/Music/OST/Into the wild
  • также есть замечательный инструмент, к ссылкам отношения не имеющий, но похожий по своей работе: «mount -o bind». Я применял эту команду для выкладывания на свой ftp-сервер музыки, фильмов и т.д. (чтобы выложить файлы на ftp-сервер, необходимо было поместить их в папку /home/ftp/pub, что и делала эта команда без необходимости копировать данные)

[Ссылки]

1. Символические ссылки в Windows.
2. Создание ссылок и удаление файлов.

 

Добавить комментарий


Защитный код
Обновить

Top of Page