Библиотека сайта 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. Раскладки клавиатуры |