Файловая система Linux и структура каталогов
В сегодняшней статье своего блога k-max.name я бы хотел поделиться с общественностью описанием структуры файловой системы в ОС Linux, а так же описанием основных каталогов, их назначения и использования в операционной системе.
Введение в файловую систему
Операционная система (далее — ОС) Linux поддерживает множество файловых систем, в настоящее время наиболее широко используются: ext2, ext3,ext4, reiserfs. Так же, современные ОС Linux совместимы с файловыми системами (ФС далее), используемыми ОС Windows, такими как NTFS и FAT32, но использование данных ФС в Linux крайне не желательно по причине того, что данные ФС разрабатывались под ОС Windows и поддержка Windows-разделов ядром Linux реализована с помощью сторонних утилит/драйверов/модулей, что накладывает некоторые ограничения (например, согласно проекту Linux-NTFS на момент написания статьи на разделах с NTFS поддерживается практически только чтение (запись — лишь в существующие файлы без изменения их размера), так же ОС Linux не имеет возможности разграничивать права доступа к файлам на разделах NTFS. Данная ситуация со временем может поменяться.
Базовые понятия
Начну с общей структуры файловой системы. ФС Linux/UNIX физически представляет собой пространство раздела диска разбитое на блоки фиксированного размера, кратные размеру сектора — 1024, 2048, 4096 или 8120 байт. Размер блока указывается при создании файловой системы.
Управлением обмена данными между ядром/приложениями и собственно байтами на диске занимается 2 базовых технологии, называемые виртуальная файловая система (VFS) и драйверы файловых систем. Виртуальная файловая система — это часть ядра linux, которая является неким абстрактным слоем (интерфейсам взаимодействия, если хотите) между ядром и конкретной реализацией файловой системы (ext2, fat32. ). Данная технология позволяет ядру и приложениям взаимодействовать с файловой системой не учитывая подробностей работы конкретной файловой системы и управлять файловыми операциями с помощью типовых команд — прозрачно. Часто, VFS называют виртуальный коммутатор файловых систем. Виртуальная файловая система так же осуществляет стыковку блочных устройств с имеющимися файловыми системами.
Список поддерживаемых Вашим ядром Linux файловых систем можно увидеть в файле /proc/filesystems.
Структура каталогов и другие базовые понятия
Структуру каталогов, в общем случае можно представить в виде следующей схемы:
Данная схема отображает то, что у одного объекта файловой системы (файла) может быть несколько путей. Грубо говоря, несколько файлов в структуре каталогов Linux могут быть физически одним файлом на диске. Или же другими словами, 1 физический файл на диске может иметь несколько имен (путей). Это достигается тем, что в файловой системе каждый файл идентифицируется уникальным номером, называемым Inode (инод = Индексный дескриптор).
Отсюда можно сделать вывод, что структура файловой системы отчасти иерархична. Или лучше сказать — «перекрестно-иерархическая», потому что дерево иерархии за счет того, что один объект может иметь несколько путей, может пересекаться.
В файловой структуре Linux имеется один корневой раздел — / (он же root, корень). Все разделы жесткого диска (если их несколько) представляют собой структуру подкаталогов, «примонтированых» к определенным каталогам, схематично это можно представить следующим образом:
/- |-/etc-|-/etc/X11-|-/etc/X11/xinit.d | | |-. | |-files | |-. |-/opt |-/homeОперация монтирования служит для того, чтобы сделать доступной файловую систему, расположенную на каком-либо блочном устройстве. Суть операции монтирования заключается в том, что ядро ассоциирует некоторый каталог (называемый точкой монтирования) с устройством, содержащем файловую систему и драйвером файловой системы. Для этого оно передает ссылку на блочное устройство - драйверу файловой системы, и в случае, если драйвер успешно проидентифицировал эту файловую систему, ядро заносит в специальную таблицу монтирования информацию о том, что все файлы и каталоги, чей полный путь начинается с указанной точки монтирования, обслуживаются соответствующим драйвером файловой системы и расположены на указанном блочном устройстве. Посмотреть таблицу примонтированных файловых систем можно через файл /proc/mounts .
Примечание. Вообще говоря, привязываться к блочному устройству в данном случае не обязательно. Устройство, которое монтируется может быть не только блочным. Может быть, например, сетевым (если монтируется NFS или SMB\CIFS).
Посмотреть сколько файл имеет ссылок и инод файла можно командой:
[[email protected] /]$ ls -li 193 drwxr-xr-x 1 mc-sim root 368 Mar 30 2008 bin 1 drwxr-xr-x 1 mc-sim root 0 Jan 1 1970 dev 197 lrwxrwxrwx 1 mc-sim root 7 Mar 30 2008 etc -> tmp/etc .в приведенном примере первый столбец (значения 193,1,197) есть инод, а третий столбец (значения 1) есть количество ссылок на файл (читаем: путей файла).
Инод, как уже говорилось, уникален в пределах определенной файловой системы и содержит следующую информацию:
- о владельце объекта ФС
- последнем времени доступа
- размере объекта ФС
- указании файл это или каталог
- права доступа
При перемещении файла утилитой mv в пределах одной файловой системы, инод файла остается неизменным (меняется только поле, описывающее имя путь файла), при перемещении файла в другую файловую систему сначала создается новый inod, а затем удаляется исходный.
Так же хочу отметить, что в линукс существует 2 вида ссылок:
Файл в Linux существует пока на inod существует хотя бы одно указание (1 путь/имя), как только из системы удаляется последнее указание на inod, блоки, занимаемые файлом с данным inod "переходят" в свободный список (список блоков, доступных для выделения на диске). То есть блоки становятся свободным местом на диске.
В ФС UNIX есть такое понятие как суперблок. Суперблок - это своеобразный аналог FAT таблицы в ФС FAT32. Суперблок содержит в себе следующую информацию о файловой системе:
- общее число блоков и индексных дескрипторов в файловой системе;
- число свободных блоков и индексных дескрипторов в файловой системе;
- размер блока файловой системы;
- количество блоков и индексных дескрипторов в группе;
- размер индексного дескриптора;
- идентификатор файловой системы.
Суперблок размещается в первых 1024 байтах раздела, от его целостности зависит работоспособность ФС. ОС создает несколько копий суперблока для восстановления в случае повреждения оригинального и размещает их (копии) различных областях жесткого диска.
При загрузке, ядро ОС Linux после монтирования корневого раздела на чтение, автоматически примонтирует остальные разделы жесткого диска. Какие разделы необходимо примонтировать, ядро берет из конфигурационного файла /etc/fstab. Пример и описание файла fstab:
[email protected]:~# cat /etc/fstab # /etc/fstab: sttic file system information. # # proc /proc proc defaults 0 0 /dev/hda6 / reiserfs defaults 0 1 /dev/hda2 /boot ext3 defaults 0 2 /dev/hda8 /dos vfat defaults 0 0 /dev/hda7 /home xfs defaults 0 2 /dev/hda1 /media/hda1 ntfs defaults 0 0 /dev/hda5 none swap sw 0 0 /dev/hdc /media/cdrom0 udf,iso9660 user,noauto 0 0 /dev/fd0 /media/floppy0 auto rw,user,noauto 0 0
Более современный вариант:
[[email protected] 103]$ cat /etc/fstab proc /proc proc nosuid,noexec,gid=proc 0 0 devpts /dev/pts devpts nosuid,noexec,gid=tty,mode=620 0 0 tmpfs /tmp tmpfs nosuid 0 0 UUID=334fcb12-840a-474a-b278-089e86e6ad80 / ext3 relatime 1 1 UUID=9bece036-5ecf-4440-ab51-00cd6c91b0b5 /home ext3 nosuid,relatime,usrquota,grpquota 1 2 UUID=970184c4-6e91-4e6f-9681-bc1592dbb742 /var ext3 nosuid,relatime 1 2 UUID=51318836-8b03-40e6-95a2-80498ab6e5db /var/cache/squid ext3 nodev,noexec,nosuid,relatime,usrquota,grpquota 1 2 UUID=1d50cadf-78ac-478a-a264-85dd64fd947b swap swap defaults 0 0 /dev/sr0 /media/cdrom udf,iso9660 ro,noauto,user,utf8 0 0
Присмотревшись, можно увидеть, что в более современном варианте, устройства монтируются не по адресу устройства, а по UUID (идентификатору устройства). Это позволяет в случае смены жесткого диска, не перенастраивать fstab, а просто присвоить новому диску имеющийся UUID.
Строки, начинающиеся символом #, являются комментариями. Остальные строки содержат шесть полей. Поскольку эти поля позиционные, все они должны быть заполнены.
- rw и ro указывают монтирование файловой системы в режиме чтения/записи или только для чтения.
- noauto указывает, что файловая система не должна автоматически монтироваться при загрузке или при выдаче команды mount -a . В нашем примере эта опция применена для съемных устройств.
- owner определяет, что пользователь, не имеющий прав root, может монтировать данную файловую систему (только если он является владельцем устройства) и демонтировать может только тот, кто смонтировал. Это особенно полезно для съемных носителей. Эта опция должна быть задана в /etc/fstab, а не в команде mount .
- user определяет, что пользователь, не имеющий прав root, может монтировать данную файловую систему и демонтировать может только тот, кто смонтировал. Это особенно полезно для съемных носителей. Эта опция должна быть задана в /etc/fstab, а не в команде mount .
- users определяет, что любой пользователь, не имеющий прав root, может монтировать данную файловую систему и демонтировать. Это особенно полезно для съемных носителей. Эта опция должна быть задана в /etc/fstab, а не в команде mount . exec или noexec определяют, позволять ли исполнение файлов из данной файловой системы. Для файловых систем, монтируемых пользователем, по умолчанию устанавливается значение noexec , если только после поля user не указано exec .
- noatime отключает запись атрибута времени доступа к файлу. Это может повысить производительность.
- nosuid устанавливает запуск исполняемых suid - файлов без повышения прав.
В файловой системе Linux существуют следующие типы файлов:
- обычные файлы (текстовые, картинки и т.п.)
- каталоги (это тоже тип файла, который содержит в себе список файлов, принадлежащий "себе")
- блочные устройства (представляют собой "драйверы" устройств, позволяющие взаимодействовать с устройством. Блочное устройство производит чтение\запись в устройство блоками. Пример устройства: жесткие диски, дискеты и т.п.)
- символьные устройства (представляют собой "драйверы" устройств, позволяющие взаимодействовать с устройством. Символьное устройство представляет собой любое не блочное устройство. Пример устройства: терминалы, принтеры и т.п.)
- символические ссылки
- PIPE (FIFO)
- гнезда (socket)
Тип файла в каталоге можно посмотреть командой ls с параметром -l.
Далее пойдет речь о стандартных каталогах Linux и назначении данных каталогов:
- Имя исполняемого файла процесса в скобках;
- Статус процесса;
- Идентификатор процесса
- Идентификатор родительского процесса
- Идентификатор группы процессов процесса
- и др.
Вот, в кратце, о назначении каталогов Linux. В последующем данная таблица будет наполняться по мере моего изучения ОС LINUX. Хочу отметить, что у некоторых дистрибутивов структура каталогов может несколько различаться, добавляться другие каталоги. Но в общем случае структура имеет вид, указанный выше.
На сегодня все. В следующей статье будет сделана шпаргалка по основным командам Linux.
man hier
Анатомия VFS - http://www.ibm.com/developerworks/ru/library/l-virtual-filesystem-switch/
upd 2010.10.21: добавил информацию о Inode
upd 2010.11.10: добавил иллюстрацию хард-линк, а так же информацию о процессах в ФС proc
upd 2011.05.19: добавил информацию о ФС proc
upd 2013.03.18: добавил доп литературу
upd 2013.04.25: статья доработана