
KTNI_Козлов(ответы) / 34
.doc33. Файловая структура Linux. Ссылки.
Ссылки – команда ln. Довольно часто разработчики СБИС сталкиваются с необходимостью иметь доступ к ОФС, например к файлам-комментариям своего проекта, из разных мест файловой системы или файловой структуры. Так, часто разным пользователям приходится вносить изменения в один и тот же проект, например, из домашних каталогов разных пользователей ссылаться на один общий проект в пользовательской папке одного из разработчиков или располагающийся на общем ресурсе внутри данной файловой системы, или на смонтированном внешнем сетевом ресурсе, например, с помощью системы NFS. В этом случае удобно использовать такой тип данных ОС Linux, как ссылки.
Назначение ссылок осуществляется с помощью команды ln. Команда ln принимает два параметра: имя исходного файла и новое, дополнительное, имя файла. В операции ln указываются оба имени, но в действительности существует лишь один физический файл. Синтаксис команды следующий: ln исходное_имя_файла ссылка.
Ссылки разделяются на прямые (жесткие) и символьные (мягкие). Два типа ссылок назначаются с помощью команды ln, только назначение символьной ссылки осуществляется совместно с опцией –s.
В следующем примере файлу rc, находящемуся в папке /etc, присваивается ссылка link. С его помощью также можно обратиться к файлу /etc/rc.
[antonk@lab4236s ~]$ ln -s /etc/rc link
[antonk@lab4236s ~]$ ls -l link
lrwxrwxrwx 1 antonk antonk 7 Sep 30 11:06 link -> /etc/rc
[antonk@lab4236s ~]$
У одного ОФС может быть сколько угодно ссылок. Важно, чтобы несколько ссылок с одинаковыми именами не находились в одной директории. При отображении расширенного вывода команды ls с опцией –l и параметром link отображается строка, первым символом в которой стоит буква l, сообщающая пользователю, что данный объект - ссылка. Вместо имени объекта в последней колонке показано, что link ссылается на файл /etc/rc.
Используя команду расширенного вывода ls с опцией -l можно выяснить, есть ли у файла ссылки. Эта команда позволяет получить следующую информацию: права доступа, количество ссылок, размер файла и дату последнего изменения. Первое число перед именем владельца файла – это количество ссылок, число перед датой – размер файла.
В следующем примере создадим еще одну ссылку к файлу /etc/rc и сравним сведения по ссылкам:
[antonk@lab4236s ~]$ ln -s /etc/rc link2
[antonk@lab4236s ~]$ ls -l link*
lrwxrwxrwx 1 antonk antonk 7 Sep 30 11:06 link -> /etc/rc
lrwxrwxrwx 1 antonk antonk 7 Sep 30 11:09 link2 -> /etc/rc
[antonk@lab4236s ~]$
Следует обратить внимание на то, что размеры этих двух ссылок равны, так как ссылаются они на один и тот же файл. Ранее мы создавали символьные ссылки (команда ln с опцией -s), т.е. такие ссылки, которые, с одной стороны, имеют малый размер и могут ссылаться на любой элемент не только файловой системы, но даже файловой структуры (структура объединяет разные системы), но, с другой стороны, являясь неким ярлыком, становятся бесполезными при потере оригинального объекта. Однако если необходимо создать ссылку, которая служила бы дополнительным именем объекта, требуется создание жесткой ссылки. Достоинство жесткой ссылки состоит в том, что она является тем же самым объектом, на который она ссылается.
Следует пояснить, что на уровне ядра операционной системы любой ОФС представляет собой последовательность информации (данных), имеющую начало и конец в составе файловой системы, расположенной на носителе информации. Каждая последовательность, связанная с определенным видом данных, носит название inode. А так как данных в рамках файловой системы много, то каждый inode имеет свой уникальный номер. По сути, номер inode указывает операционной системе, откуда требуется считывать данные.
Возвращаясь к жестким ссылкам следует показать, что жесткая ссылка и объект, на который она ссылается, имеют один и тот же inode, т.е. жесткая ссылка – это другое имя объекта, с помощью которого можно ссылаться на исходный объект. Ввиду того, что жесткая ссылка -это дополнительное имя объекта данных и они ссылаются на один и тот же идентификационный номер inode, они оба должны быть расположены в одной файловой системе, так как в другой системе существует своя нумерация inode.
В следующем примере попытаемся назначить жесткую ссылку link_rc в файловой системе, смонтированной в /home-раздел, к файлу rc, располагающемуся в другой системе, смонтированной в раздел /etc:
[antonk@lab4236s ~]$ ln /etc/rc link_rc
ln: creating hard link 'link_rc' to 'Vetc/rc': Invalid cross-device link
[antonk@lab4236s ~]$ ln -s /etc/rc link_rc
[antonk@lab4236s ~]$ ls -l /etc/rc
lrwxrwxrwx 1 root root 7 Feb 13 2008 /etc/rc -> rc.d/rc
[antonk@lab4236s ~]$ ls -l link_rc
lrwxrwxrwx 1 antonk antonk 7 Sep 30 13:10 link_rc -> /etc/rc
[antonk@lab4236s ~]$
Как видно, создать жесткую ссылку к файлу rc не получилось в силу вышеперечисленного ограничения, однако мягкую ссылку создать можно, и мы создали ссылку на файл rc, который сам является ссылкой на объект /etc/rc.d/rc. Таким образом, создан механизм обращения к файлу через две ссылки.
Теперь создадим жесткую ссылку cmos_link в текущей директории к файлу cmos.doc, который располагается в текущей домашней директории пользователя antonk, и убедимся, что и ссылка, и объект имеют одинаковый inode. Для отображения расширенной информации об объекте с выводом индексного дескриптора - номера inode - используется команда ls с опциями –i (inode) и –l.
[antonk@lab4236s ~]$ ln cmos.doc cmos_link
[antonk@lab4236s ~]$ ls -il cmos*
7929887 -rw-r–r– 2 antonk antonk 333312 Oct 30 2008 cmos.doc
7929887 -rw-r–r– 2 antonk antonk 333312 Oct 30 2008 cmos_link
[antonk@lab4236s ~]$
Обратим внимание, что и объект, и ссылка на него имеют полностью одинаковые параметры (даже время и дату создания), только разные имена. Номер inode находится в самом начале строки, он одинаков и для объекта, и для ссылки. Фактически жесткая ссылка – дополнительное имя объекта. Достоинство жесткой ссылки состоит в том, что, работая с ней, мы напрямую работаем с объектом. Отсюда название – прямая ссылка. Недостатком такой ссылки является невозможность ее создания в одной файловой системе на объект в другой.
Чтобы удалить файл, нужно удалить все его ссылки. Имя файла фактически рассматривается как еще одна ссылка на этот файл, т.е. с помощью команды rm удаляется именно ссылка на тот или иной файл. Если ссылок было несколько и одна из них удаляется, к файлу можно обращаться по оставшимся, даже в случае удаления исходной ссылки – первоначального имени файла. Это утверждение остается справедливым и после удаления первоначальной ссылки – исходного имени файла. Вместо него вполне могут применяться любые дополнительные ссылки.
В следующем примере создадим новый текстовый файл bmt_spisok путем копирования стандартного вывода данных списка всех файлов, начинающихся с комбинации «bmt», с одним произвольным символом в файл bmt_spisok. Далее создадим жесткую ссылку bmt_link на этот файл и сотрем файл-оригинал bmt_spisok. При чтении файла bmt_link мы видим, что он имеет точное содержимое файла-оригинала bmt_spisok. Таким образом, мы можем дальше работать с содержимым исходного файла через его ссылки даже при отсутствии данного исходного файла.
[antonk@lab4236s ~]$ ls -l bmt? > bmt_spisok
[antonk@lab4236s ~]$ cat bmt_spisok
-rw-rw-r– 1 antonk antonk 0 Sep 21 15:11 bmtl
-rw-rw-r– 1 antonk antonk 0 Sep 21 15:11 bmt2
-rw-rw-r– 1 antonk antonk 0 Sep 21 15:11 bmt3
-rw-rw-r– 1 antonk antonk 42 Sep 21 15:11 bmt?
[antonk@lab4236s ~]$ ln bmt_spisok bmt_link
[antonk@lab4236s ~]$ ls -l bmt_spisok bmt_link
-rw-rw-r– 2 antonk antonk 192 Sep 30 15:35 bmt_link
-rw-rw-r– 2 antonk antonk 192 Sep 30 15:35 bmt_spisok
[antonk@lab4236s ~]$ rm bmt_spisok
[antonk@lab4236s ~]$ cat bmt_link
-rw-rw-r– 1 antonk antonk 0 Sep 21 15:11 bmt1
-rw-rw-r– 1 antonk antonk 0 Sep 21 15:11 bmt2
-rw-rw-r– 1 antonk antonk 0 Sep 21 15:11 bmt3
-rw-rw-r– 1 antonk antonk 42 Sep 21 15:11 bmt?
[antonk@lab4236s ~]$