Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Фундаментальные основы Linux. Часть VIII. Механизмы безопасной работы с файлами

Оригинал: Linux Fundamentals
Автор: Paul Cobbaut
Дата публикации: 16 октября 2014 г.
Перевод: А.Панин
Дата перевода: 24 декабря 2014 г.

Глава 33. Ссылки на файлы

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

Для понимания концепции ссылок на файлы в рамках файловой системы следует в первую очередь разобраться со структурами inode.

Структуры inode

Содержимое структуры inode

Inode является структурой данных, содержащей относящиеся к файлу метаданные. При сохранении нового файла на диске в рамках файловой системы происходит сохранение не только самого содержимого файла (данных), но и таких дополнительных параметров файла, как имя, дата создания, права доступа и других. Вся эта информация (за исключением имени файла и его содержимого) сохраняется в рамках структуры inode, соответствующей данному файлу.

Как видно в следующем примере, при использовании команды ls -l выводятся некоторые данные, содержащиеся в структуре inode.
root@rhel53 ~# ls -ld /home/project42/
drwxr-xr-x 4 root pro42 4.0K мар 27 14:29 /home/project42/

Таблица структур inode

Таблица структур inode содержит информацию о всех структурах inode и создается в момент создания файловой системы (с помощью утилиты mkfs). Вы можете использовать команду df -i для получения информации о количестве используемых и доступных для использования структур inode в рамках смонтированных файловых систем.
root@rhel53 ~# df -i
Файловая система  Iнодов IИспользовано IСвободно IИспользовано% Cмонтировано в
/dev/mapper/VolGroup00-LogVol00
                 4947968        115326   4832642             3% /
/dev/hda1          26104            45     26059             1% /boot
tmpfs              64417             1     64416             1% /dev/shm
/dev/sda1         262144          2207    259937             1% /home/project42
/dev/sdb1          74400          5519     68881             8% /home/project33
/dev/sdb5              0             0         0              -  /home/sales
/dev/sdb6         100744            11    100733             1% /home/research

В приведенном выше примере вывода команды df -i вы можете обнаружить процентные показатели использования структур inode для некоторых смонтированных файловых систем. Данный показатель не приводится для устройства /dev/sdb5 ввиду того, что на этом устройстве используется файловая система fat.

Идентификатор структуры inode

Каждая структура inode имеет уникальный идентификатор (идентификатор структуры inode). Вы можете увидеть идентификаторы структур inode в выводе команды ls -li.
paul@RHELv4u4:~/test$ touch file1
paul@RHELv4u4:~/test$ touch file2
paul@RHELv4u4:~/test$ touch file3
paul@RHELv4u4:~/test$ ls -li
итого 12
817266 -rw-rw-r--  1 paul paul 0 фев  5 15:38 file1
817267 -rw-rw-r--  1 paul paul 0 фев  5 15:38 file2
817268 -rw-rw-r--  1 paul paul 0 фев  5 15:38 file3
paul@RHELv4u4:~/test$

Три этих файла создавались последовательно, причем им соответствуют три различные структуры inode (идентификаторы которых выводятся в первом столбце). Вся информация из вывода данной команды ls, за исключением имен файлов (которые хранятся в файле директории), содержится в структурах inode.

Структуры inode и содержимое файлов

Давайте запишем немного данных в один из рассматриваемых файлов.
paul@RHELv4u4:~/test$ ls -li
итого 16
817266 -rw-rw-r--  1 paul paul   0 фев  5 15:38 file1
817270 -rw-rw-r--  1 paul paul 147 фев  5 15:42 file2
817268 -rw-rw-r--  1 paul paul   0 фев  5 15:38 file3
paul@RHELv4u4:~/test$ cat file2
Сейчас зима и очень холодно.
Нам не нравится холод, мы предпочитаем летние ночи.
paul@RHELv4u4:~/test$

Данные, выводимые при использовании команды cat, содержатся не в структуре inode, а где-то на диске. Структура inode содержит указатель на эти данные.

О директориях

Директория является таблицей

Директория является особым видом файла, который содержит таблицу соответствия между именами файлов и структурами inode. При выводе списка содержимого директории с помощью команды ls -ali на самом деле будет осуществляться вывод содержимого файла директории.
paul@RHELv4u4:~/test$ ls -ali
итого 32
817262 drwxrwxr-x   2 paul paul  4096 фев  5 15:42 .
800768 drwx------  16 paul paul  4096 фев  5 15:42 ..
817266 -rw-rw-r--   1 paul paul     0 фев  5 15:38 file1
817270 -rw-rw-r--   1 paul paul   147 фев  5 15:42 file2
817268 -rw-rw-r--   1 paul paul     0 фев  5 15:38 file3
paul@RHELv4u4:~/test$

Директории . и ..

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

Жесткие ссылки

Создание жестких ссылок

В момент создания жесткой ссылки с помощью утилиты ln в файл директории добавляется дополнительная запись. Новое имя файла ставится в соответствие существующей структуре inode.
paul@RHELv4u4:~/test$ ln file2 hardlink_to_file2
paul@RHELv4u4:~/test$ ls -li
итого 24
817266 -rw-rw-r--  1 paul paul   0 фев  5 15:38 file1
817270 -rw-rw-r--  2 paul paul 147 фев  5 15:42 file2
817268 -rw-rw-r--  1 paul paul   0 фев  5 15:38 file3
817270 -rw-rw-r--  2 paul paul 147 фев  5 15:42 hardlink_to_file2
paul@RHELv4u4:~/test$

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

Поиск жестких ссылок

Вы можете использовать утилиту find для поиска файлов с определенными идентификаторами структур inode. В примере ниже показана методика поиска всех имен файлов, которые соответствуют структуре inode с идентификатором 817270. Помните о том, что идентификатор структуры inode является уникальным для используемого раздела диска.
paul@RHELv4u4:~/test$ find / -inum 817270 2> /dev/null
/home/paul/test/file2
/home/paul/test/hardlink_to_file2

Символьные ссылки

Символьные ссылки (иногда называемые мягкими ссылками) не указывают на структуры inode, а являются соответствиями между именами файлов. Символьные ссылки создаются с помощью команды ln -s. Как вы можете увидеть в примере ниже, символьная ссылка имеет собственную структуру inode.
paul@RHELv4u4:~/test$ ln -s file2 symlink_to_file2
paul@RHELv4u4:~/test$ ls -li
итого 32
817273 -rw-rw-r--  1 paul paul  13 фев  5 17:06 file1
817270 -rw-rw-r--  2 paul paul 147 фев  5 17:04 file2
817268 -rw-rw-r--  1 paul paul   0 фев  5 15:38 file3
817270 -rw-rw-r--  2 paul paul 147 фев  5 17:04 hardlink_to_file2
817267 lrwxrwxrwx  1 paul paul   5 фев  5 16:55 symlink_to_file2 -> file2
paul@RHELv4u4:~/test$

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

Удаление ссылок

Ссылки на файлы могут удаляться с помощью утилиты rm.
paul@laika:~$ touch data.txt
paul@laika:~$ ln -s data.txt sl_data.txt
paul@laika:~$ ln data.txt hl_data.txt
paul@laika:~$ rm sl_data.txt 
paul@laika:~$ rm hl_data.txt

Практическое задание: ссылки на файлы

1. Создайте два файла с именами winter.txt и summer.txt, поместите какие-либо текстовые данные в них.

2. Создайте жесткую ссылку на файл winter.txt с именем hlwinter.txt.

3. Выведите информацию об идентификаторах структур inode, соответствующих этим трем файлам, жесткие ссылки должны использовать структуры inode файлов, на которые они ссылаются.

4. Используйте утилиту find для вывода информации о файлах, на которые установлены жесткие ссылки.

5. Все данные файла, помимо двух типов данных, хранятся в соответствующей структуре inode. Назовите эти два типа данных!

6. Создайте символьную ссылку на файл summer.txt с именем slsummer.txt.

7. Найдите все файлы с идентификатором структуры inode, равным 2. Какой вывод вы можете сделать на основе полученной информации?

8. Исследуйте директории /etc/init.d/ /etc/rc.d/ /etc/rc3.d/ ..., обнаружили ли вы ссылки на файлы в них?

9. Выведите список файлов директории /lib с помощью команды ls -l...

10. Используйте утилиту find для поиска в вашей домашней директории обычных файлов, на которые не установлено (!) ни одной жесткой ссылки.

Корректная процедура выполнения практического задания: ссылки на файлы

1. Создайте два файла с именами winter.txt и summer.txt, поместите какие-либо текстовые данные в них.

echo холодно > winter.txt ; echo жарко > summer.txt

2. Создайте жесткую ссылку на файл winter.txt с именем hlwinter.txt.

ln winter.txt hlwinter.txt

3. Выведите информацию об идентификаторах структур inode, соответствующих этим трем файлам, жесткие ссылки должны использовать структуры inode файлов, на которые они ссылаются.

ls -li winter.txt summer.txt hlwinter.txt

4. Используйте утилиту find для вывода информации о файлах, на которые установлены жесткие ссылки.

find . -inum xyz

5. Все данные файла, помимо двух типов данных, хранятся в соответствующей структуре inode. Назовите эти два типа данных!

Имя файла, которое хранится в файле директории и данные файла, которые хранятся где-либо на диске.

6. Создайте символьную ссылку на файл summer.txt с именем slsummer.txt.

ln -s summer.txt slsummer.txt

7. Найдите все файлы с идентификатором структуры inode, равным 2. Какой вывод вы можете сделать на основе полученной информации?

Можно сделать вывод о том, что в рамках системы существует более одной таблицы структур inode (по одной для каждого отформатированного раздела + виртуальные файловые системы).

8. Исследуйте директории /etc/init.d/ /etc/rc.d/ /etc/rc3.d/ ..., обнаружили ли вы ссылки на файлы в них?

ls -l /etc/init.d
ls -l /etc/rc.d
ls -l /etc/rc3.d

9. Выведите список файлов директории /lib с помощью команды ls -l...

ls -l /lib

10. Используйте утилиту find для поиска в вашей домашней директории обычных файлов, на которые не установлено (!) ни одной жесткой ссылки.

find ~ ! -links 1 -type f


Предыдущий раздел: Оглавление Следующий раздел:
Глава 32. Списки контроля доступа   Приложение A. Раскладки клавиатуры