В статье я попытаюсь объяснить на простых примерах понятие ссылок в файловой системе, а также в каких случаях их стоит применять.
Материал рассчитан на новичков в системе Linux (думаю, для профи это весьма банальные вещи). Далее разговор пойдет о Unix-like файловых системах, как ext3, ext4 и т.д., потому что концепция ФС Windows не позволяет так же прозрачно работать со ссылками, как ФС Unix-систем (см. «Символические ссылки в Windows»).
Максимум, что может предоставить продвинутым пользователям система Windows – механизм «ярлыков». Хотя и тут они не всё продумали – как-то раз в школе приятель скинул мне на дискету много-много больших игр, каждая из которых должна была занимать, по идее, CD-диск.
Думаю, вы догадались, что я обнаружил на дискете. Так что разработчикам Windows приходится несладко – всё время нужно думать, как оградить пользователя от самого себя. Напротив, создатели Unix-систем постоянно как бы намекают нам: используйте ссылки!
Чтобы понять, что такое символические ссылки – представьте себе каталог бумажной документации (куча полок с документами). Пусть есть полки «Строительные стандарты» и «Машиностроительные стандарты». Но как поступить, если у нас есть стандарт, относящийся к проектированию механосборочных цехов? Ведь этот стандарт может понадобиться и строителям и в машиностроении. Первый подход состоит в том, чтобы положить этот документ в секцию «Строительные», а в секции «Машиностроение» оставить заметку, что документ с таким названием находится в секции «Строительные стандарты». Такой подход применим, если документ более относится к строительной тематике, нежели к машиностроению.
Это и называется «символическая ссылка» – файл помещается в каталог («Строительные»), а в другом каталоге («Машиностроение») создается специальный файл, указывающий на документ в каталоге «Строительные». При попытке прочитать или редактировать файл-ссылку, файловая система перенаправит нас на файл-оригинал. При удалении символической ссылки – исходный файл остается. Т.е. всё как в приведенной выше аналогии с полками. Если удалить исходный документ – ссылка останется на месте. Недостаток такого подхода в том, что при перемещении исходного файла, ссылка не изменит автоматически путь на новый. Еще недостаток – не всегда можно определить, в какой каталог (на какую полку) положить исходный файл – иногда файл может относиться одинаково ко двум или даже трем категориям. От этих недостатков свободны жесткие ссылки. Практическая работа по символическим ссылкам:
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); создайте символические ссылки на рабочем столе для наиболее часто используемых приложений.
Жесткие ссылки чем-то похожи на библиотечную систему карточек – когда для каждой книги есть свой уникальный идентификатор, и зная его – мы можем попросить библиотекаря дать нам эту книгу. При чем названия разных книг могут совпадать, но идентификаторы – никогда (это важный момент, обратите внимание). Представим, что есть книга, пусть «О мышах и людях». В нашем городе подобные вещи не пользуются особой популярностью, так что предположим что эта книга есть только в одной, скажем, в центральной библиотеке. Но вот мы пришли в местную библиотеку и не нашли там этой книги. Зато там есть карточка, в которой указан код книги. И вот, библиотекарь звонит в другие библиотеки и узнает, что такая книга есть в центральной. Скажем, у нас хороший сервис и вам тут же ее привозят. Вот так работают жесткие ссылки.
Чтобы представление о жестких ссылках было полное, сделаем кое-какие уточнения. В местной библиотеке могут убрать карточку этой книги (скажем, библиотека была государственная, а стала частной). Но книга останется. Если же карточки на эту книгу уберут из всех библиотек – это может означать только одно – самой книги тоже нет (возможно кто-то взял последний экземпляр и не вернул, негодяй такой; помню, я долго не мог взять почитать в институтской библиотеке фантастический роман – его долго не отдавала какая-то девушка. С девушкой я так и не познакомился, но к счастью в файловой системе ваши «книги» всегда будут на месте, лишь бы вы не удалили последнюю «карточку» на нее – об этом ниже). Рассмотрим теперь, как эта модель функционирует в файловой системе. На самом деле, всегда существует как минимум одна жесткая ссылка на файл. Т.е. сам файл (его содержимое) находится где-то на жестком диске, и у него есть уникальный номер (как книга в Хранилище в модели выше). А имя файла хранится отдельно, в «файловом индексе» (inode) – он соответствует карточке в модели выше. Также в файловом индексе содержится тот же уникальный номер – а поскольку номера одинаковы, то этот файловый индекс и будет являться жесткой ссылкой на само содержимое файла.
Как видим, файловый индекс соответствует карточке, а содержимое – книге. И хранятся они так же раздельно, в разных областях жесткого диска – (карточки – в картотеке, книги – в хранилище). И таким же образом, как в примере с библиотеками, у одного файла может быть несколько имен («карточек» или «файловых индексов») – и столько же жестких ссылок с этими именами.
Если удалить оба файловых индекса (т.е. обе жестких ссылки) – то счетчик жестких ссылок для содержимого файла станет 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, но номер тот же
В качестве самостоятельного упражнения – попробуйте создать жесткую ссылку на каталог.
P.S. Я знаю, что картинки — face palms, но, как сказал бы доктор МакКой: «Я врач, а не художник»
Цельнотянуто вот от сюда: http://habrahabr.ru/post/99746/
символические и жесткие ссылки
Вы должны авторизоваться, чтобы оставлять комментарии.
Комментарии ()