Отправляет email-рассылки с помощью сервиса Sendsay

Программирование и др.

  Все выпуски  

Программирование в Linux с нуля [21.10.2008]


Программирование в Linux с нуля [21.10.2008]

Здравствуйте! Это очередной выпуск рассылки "Программирование в Linux с нуля".

--- новости Lindevel.Ru ---

Книга "Программирование в Linux с нуля" версия 0.12

Tarball: ftp://ftp.lindevel.ru/pub/zlp/zlp-0.12.tar.gz
Online: http://www.lindevel.ru/zlp


Новые материалы книги

7.2. Узлы и ссылки

Опытные пользователи Linux наверняка уже знают всё то, что описано в этом разделе. Однако книгу читают не только гуру, но и начинающие пользователи. А без понимания таких вещей как узлы и ссылки двигаться дальше бессмысленно.

С понятием файла в Linux связаны три сущности: данные, узлы и ссылки. На счет данных все понятно: в зависимости от типа файла, ядро предоставляет все необходимые механизмы для чтения, записи и хранения информации, связанной с конкретным файлом.

Узлы (иноды, i-nodes, индексы) - это уникальные номера, которые представляют файл как "портал" для работы с данными, а не как имя в файловой системе. Иными словами, у каждого файла есть свой уникальный номер, через который осуществляется взаимодействие с данными. Чтобы посмотреть этот номер, достаточно вызвать ls с опцией -i (--inode - длинный вариант).


$ touch myfile1
$ touch myfile2
$ ls -i
6373383 myfile1  6373384 myfile2

Нетрудно убедиться, что у любого файла в файловой системе, независимо от типа, есть узел.


$ ls -li /dev/null
252 crw-rw-rw- 1 root root 1, 3 2008-10-21 03:43 /dev/null
$ mkfifo myfifo
$ ls -li myfifo
6373385 prw-r--r-- 1 nn nn 0 2008-10-21 04:06 myfifo
$ mkdir mydir
$ ls -lid mydir
5898479 drwxr-xr-x 2 nn nn 4096 2008-10-21 04:06 mydir

Как видим, у каждого файла есть свой номер (узел). Каталоги - не исключение. Но обратите внимание на число, которое идет после поля прав доступа. В нашем примере у /dev/null и у myfifo оно равно единице, а у каталога mydir - 2. Это число показывает количество ссылок на данный узел в файловой системе. И тут мы подходим к последней сущности, связанной с файлами.

То, что мы привыкли называть файлами - это всего лишь ссылки на узлы (имена узлов). Естественно, нам приятнее работать с именем /dev/null, а не с узлом номер 252. Но самое интересное в том, что на один и тот же узел в файловой системе может быть сколь угодно много ссылок (в пределах разумного, естественно). Третье поле вывода ls -l как раз и показывает это количество.

При создании обычного файла, устройства, FIFO, символической ссылки или локального сокета в файловой системе появляется узел и одна ссылка на него. Но при создании каталога создаются сразу две ссылки. Рассмотрим пример, объясняющий такое поведение.


$ ls -lid mydir
5898479 drwxr-xr-x 2 nn nn 4096 2008-10-21 04:06 mydir
$ ls -lia mydir
5898479 drwxr-xr-x 2 nn nn 4096 2008-10-21 04:06 .
5898448 drwxr-xr-x 3 nn nn 4096 2008-10-21 04:06 ..

Как видим, в каталоге mydir находится ссылка на тот же узел (точка), а также ссылка на узел родительского каталога (две точки). Этим и объясняется наличие двух ссылок на создаваемый каталог.

Итак, мы выяснили, что файловая система в обычном понимании - это набор ссылок на узлы, причем одному узлу может соответствовать несколько ссылок. Теперь важно понять две вещи.

  • Все ссылки на один узел равноправны: нет ни главных, ни второстепенных.
  • Файл существует, пока существует хотя бы одна ссылка на узел. Файл считается удалённым, когда удаляется последняя ссылка на него. Ссылки на несуществующие узлы (осиротевшие ссылки), а также узлы, не имеющие хотя бы одной ссылки (осиротевшие иноды) не могут существовать в нормально работающей файловой системе. Указанные случаи "сиротства" свидетельствуют об ошибках файловой системы.

Таким образом, чтобы удалить файл, нужно удалить все ссылки на узел. Этим и объясняется название системного вызова unlink(), о чем говорилось в предыдущем разделе. После удаления последней ссылки на узел, файловая система автоматически вычёркивает файл из своих закромов.

Ссылки на узлы можно создавать самостоятельно программой ln. Важно понимать, что символические ссылки, которые мы рассматривали в предыдущем разделе не имеют ничего общего со ссылками на узлы (жесткие ссылки). Символическая ссылка - это рядовой файл со своим узлом и своим набором ссылок на этот узел. Рассмотрим пример.


$ cd mydir
$ ls
$ touch file1
$ ln -s file1 mylink1
$ ln file1 mylink2
$ echo "i am here" > file1
$ ls -li
491528 -rw-r--r-- 2 nn nn 10 2008-10-21 04:57 file1
491617 lrwxrwxrwx 1 nn nn  5 2008-10-21 04:56 mylink1 -> file1
491528 -rw-r--r-- 2 nn nn 10 2008-10-21 04:57 mylink2

mylink1 - это символическая ссылка; то есть особый тип файла, хранящий путь к другому файлу. Обратите внимание, что mylink1 соответствует отдельный узел 491617. А вот file1 и mylink2 - это абсолютно равноправные ссылки на один и тот же узел 491528. Таким образом, символическая ссылка указывает на имя, а жесткая ссылка - на узел. Если удалить ссылку file1, то символическая ссылка mylink1 "осиротеет". Однако это не является ошибкой файловой системы.


$ rm file1
$ cat mylink1
cat: mylink1: No such file or directory

Программа rm вызвала системный вызов unlink() и удалила одну из двух ссылок на узел 491528. Однако другая ссылка (mylink2) продолжает жить и здравствовать.


$ ls -li
491617 lrwxrwxrwx 1 nn nn  5 2008-10-21 04:56 mylink1 -> file1
491528 -rw-r--r-- 1 nn nn 10 2008-10-21 04:57 mylink2
$ cat mylink2
i am here

В выводе ls мы видим, что на узел 491528 осталась одна ссылка. Удалив её, мы уничтожим файл окончательно и освободим номер узла.

И, наконец, возникает два вопроса.

  • Можно ли создать символическую ссылку в одной файловой системе (например, в домашнем каталоге) на файл, содержащийся в другой файловой системе (на flash-накопителе, к примеру)?
  • Можно ли создать жесткую ссылку в одной файловой системе (пример - домашний каталог) на файл, содержащйся в другой файловой системе (например, на flash-носителе)?
Если вы поняли, о чем говорилось в этом разделе, то без труда ответите на эти вопросы. Пусть это будет вашим "домашним заданием".

Контакты

Сайт проекта Lindevel.Ru (http://www.lindevel.ru) посвящен программированию в Linux. Здесь вы всегда сможете найти последнюю версию книги, а также оставить вопросы и пожелания в форуме (http://lindevel.ru/forum).


Рассылки Subscribe.Ru
FreeBSD

В избранное