Уважаемые подписчики!
Сегодня вашему вниманию предлагается
шестая часть, посвященная описанию структуры и устройства физических
файловых систем в ОС UNIX, и командам для управления физическими
файловыми системами.
Ваши отзывы об этих учебных материалах шлите мне по почте, в гостевую или оставляйте в комментариях на соответствующей странице проекта "Хроника бегства от безопасности".
Copyleft (no c) - Fuck copyright! 1999-2003 В. Кравчук, OpenXS Initiative, идея, составление, перевод, примеры
Каждый жесткий диск состоит из одной или нескольких логических частей (групп цилиндров), называемых разделами (partitions). Расположение и размер раздела определяется при форматировании диска. В ОС UNIX разделы выступают в качестве независимых устройств, доступ к которым осуществляется как к различным носителям данных. Обычно в разделе может располагаться только одна физическая файловая система.
Имеется много типов физических файловых систем, например FAT16 и NTFS, с разной структурой. Более того, имеется множество типов физических файловых систем UNIX (ufs, s5fs, ext2, vxfs, jfs, ffs и т.д.). Ниже мы рассмотрим основные их общие особенности.
Физическая файловая система UNIX занимает раздел диска и состоит из таких основных компонентов:
Суперблок содержит информацию, необходимую для монтирования и управления файловой системой в целом. В каждой файловой системе существует только один суперблок, который располагается в начале раздела. Суперблок считывается в память ядра при монтировании файловой системы и находиться там до ее отключения - демонтирования.
Суперблок содержит:
Поскольку количество свободных индексных дескрипторов и блоков хранения данных может быть значительным, хранение двух последних списков целиком в суперблоке непрактично. Для индексных дескрипторов храниться только часть списка. Когда число свободных дескрипторов приближается к 0, ядро просматривает список и вновь формирует список свободных дескрипторов.
Такой подход неприемлем в отношении свободных блоков хранения данных, поскольку по содержимому блока нельзя определить, свободен он или нет. Поэтому необходимо хранить список адресов свободных блоков целиком. Список адресов свободных блоков может занимать несколько блоков хранения данных, но суперблок содержит только один блок этого списка. Первый элемент этого блока указывает на блок, хранящий продолжение списка.
Выделение свободных блоков для размещения файла производиться с конца списка суперблока. Когда в списке остается единственный элемент, ядро интерпретирует его как указатель на блок, содержащий продолжение списка. В этом случае содержимое этого блока считывается в суперблок, и блок становится свободным. Такой подход позволяет использовать дисковое пространство под списки, пропорциональное свободному месту в файловой системе. Когда свободного места практически не остается, список адресов свободных блоков целиком помещается в суперблоке.
Индексный дескриптор, или inode, содержит информацию о файле, необходимую для обработки данных, т.е. метаданные файла. Каждый файл ассоциирован с одним индексным дескриптором, хотя может иметь несколько имен (жестких связей) в файловой системе, каждое из которых указывает на один и тот же индексный дескриптор.
Индексный дескриптор не содержит:
Индексный дескриптор содержит:
Размер индексного дескриптора обычно составляет 128 байтов.
Индексный дескриптор содержит информацию о расположении данных файла. Поскольку дисковые блоки хранения данных, в общем случае, располагаются не последовательно, индексный дескриптор должен хранить физические адреса всех блоков, принадлежащих данному файлу.
Каждый дескриптор содержит 13 указателей. Первые 10 указателей непосредственно ссылаются на блоки данных файла. Если файл большего размера - 11-ый указатель ссылается на первый косвенный блок (indirection block) из 128 (256) ссылок на блоки данных. Если и этого недостаточно, 12-ый указатель ссылается на дважды косвенный блок, содержащий 128 (256) ссылок на косвенные блоки. Наконец последний, 13-ый указатель ссылается на трижды косвенный блок из 128 (256) ссылок на дважды косвенные блоки. Количество элементов в косвенном блоке зависит от его размера.
Поддерживая множественные уровни косвенности, индексные дескрипторы позволяют отслеживать огромные файлы, не растрачивая дисковое пространство для небольших файлов.
При открытии файла ядро помещает копию дискового индексного дескриптора в соответствующую таблицу в памяти, которая содержит дополнительные атрибуты. В дальнейшем изменение индексного дескриптора происходит в памяти, и измененная структура файловой системы сбрасывается на диск только при выполнении специальной команды, sync. Эта команда выполняется при штатной остановке системы или явно администратором.
Если произошло нештатное прекращение работы системы, структура суперблока и массива индексных дескрипторов на диске не соответствует структуре блоков данных и может быть несогласованной.
Отсутствие синхронизации между образом файловой системы в памяти и ее данными на диске (в случае аварийной остановки системы) может привести к появлению следующих ошибок в файловой системе:
Часть этих проблем может быть устранена специальной утилитой, fsck (см. далее в разделе, посвященном управлению файловой системой). Но принципиальное решение проблемы согласованности и целостности данных в файловых системах UNIX возможно только при использовании журнализации - предварительной записи всех изменений дисковой структуры в отдельную область на диске.
В журнализируемой файловой системе после того, как транзакция (изменение) записана, она может быть выполнена повторно, что предотвращает возникновение ошибок и несогласованностей в файловой системе и необходимость запуска программы fsck. Тем самым, уменьшается время перезагрузки в случае сбоя или некорректной остановки системы.
Журнал выделяется из свободных блоков файловой системы и, обычно, имеет размер порядка 1 Мбайта на каждый 1 Гбайт файловой системы. Журнал сбрасывается по мере заполнения, после синхронизации структуры файловой системы с диском.
Различные версии ОС UNIX поддерживают разные реализации журнализируемых файловых систем. Это, например, файловая система ufs (Solaris), vxfs (Solaris, UnixWare), RaisorFS и ext3 (Linux), jfs (AIX и Linux) и другие. Некоторые файловые системы позволяют включать и отключать журнализацию (ufs, ext2/ext3). Естественно, журнализация несколько замедляет работу файловой системы, но, в большинстве случаев, гарантирует целостность данных.
Основными задачами администрирования файловых систем являются создание, монтирование и демонтирование физических файловых систем, а также проверка их целостности. В следующих подразделах мы рассмотрим соответствующие команды и обобщенно опишем выполняемые ими действия.
Команда mkfs создает файловую систему путем записи на указанное устройство (необходимо указать специальное символьное устройство). Файловая система создается на основе указанных в командной строке типа файловой системы (ТипФС), специфических_опций и операндов. Команда имеет следующий синтаксис:
Специфические опции и операнды зависят от конкретного типа создаваемой файловой системы. Их можно посмотреть на соответствующей странице справочного руководства (например, man mkfs_ufs для файловой системы ufs).
Основные опции и параметры команды mkfs представлены в табл. 14.
Таблица 14. Основные опции и параметры команды mkfs
| Опция | Назначение |
| -F | Указывает тип файловой системы, которую необходимо создать. Тип файловой системы должен быть либо указан здесь, либо находится в файле таблицы стандартных файловых систем (/etc/vfstab в SVR4, /etc/fstab в других версиях UNIX) путем сопоставления устройства с записью в таблице. |
| -V | Выдает результирующую командную строку, но не выполняет команду. Командная строка генерируется с использованием опций и аргументов, указанных пользователем, путем добавления к ним информации, взятой из таблицы стандартных файловых систем. Эта опция используется для проверки правильности командной строки. |
| -m | Возвращает командную строку, использованную для создания файловой системы. Файловая система должна уже существовать. Эта опция обеспечивает средства получения команды, использованной при создании файловой системы. Для нее не применимы специфические_опции, размер и операнды. |
| -o | Задает опции, специфические для указанного типа физической файловой системы. |
| устройство | Задает специальное символьное устройство, на котором будет создана файловая система. |
| размер | Задает количество 512-байтовых блоков в файловой системе. Максимальный размер многих физических файловых систем в UNIX - 4194304 блока размером 512 байт (или 2 Гбайта). |
Программа fsck ищет и, автоматически или в интерактивном режиме, исправляет противоречия в файловых системах. Если файловая система находится в несогласованном состоянии, которое нельзя однозначно исправить, у пользователя спрашивают подтверждения перед попыткой выполнить каждое исправление. Следует иметь в виду, что некоторые исправления приводят к определенным потерям данных. Объем и серьезность потери данных можно определить по диагностическому сообщению. Стандартным действием при каждом исправлении является ожидание от пользователя утвердительного (yes) или отрицательного (no) ответа.
При использовании fsck файловая система должна быть неактивной (размонтирована или смонтирована только для чтения). Если это невозможно, необходимо обеспечить, чтобы машина находилась в состоянии покоя (без работающих пользователей) и чтобы сразу после завершения команды она была перезагружена, если исправляется критическая файловая система, например, корневая.
Команда fsck имеет следующий синтаксис:
Основные опции и параметры команды fsck представлены в табл. 15.
Таблица 15. Основные опции команды fsck
| Опция | Назначение |
| -F | Задает тип проверяемой файловой системы. Если тип не указан, команда обращается к таблице стандартных файловых систем. |
| -V | Выдает результирующую командную строку, но не выполняет команду. Командная строка генерируется с использованием опций и аргументов, указанных пользователем, путем добавления к ним информации, взятой из таблицы стандартных файловых систем. |
| -m | Проверять, но не восстанавливать. Эта опция позволяет проверить, может ли файловая система быть смонтирована. |
| -o | Позволяет задать опции, специфические для типа файловой системы. |
Для работы команде fsck необходимо указывать специальное символьное устройство.
Корневая файловая система обычно проверяется при запуске автоматически. Система при запуске может автоматически проверять и другие физические файловые системы, для которых в таблице стандартных файловых систем указана необходимость такой проверки. Эта проверка может вестись параллельно, путем запуска отдельного процесса fsck для каждой проверяемой файловой системы с одним и тем же порядковым номером проверки. Параллельно имеет смысл проверять файловые системы, расположенные на разных физических дисках.
Физические файловые системы, кроме корневой (/), считаются съемными (removable) в том смысле, что они могут быть как доступны для пользователей, так и не доступны. Команда mount уведомляет систему, что блочное устройство или удаленный ресурс доступны для пользователей в точке_монтирования, которая уже должна существовать; точка монтирования становится именем корня вновь смонтированного устройства или ресурса. Говорят, что эта команда монтирует или подключает физическую файловую систему или ресурс к общей логической файловой системе.
Команда mount имеет следующий синтаксис:
Команда mount, при вызове с аргументами, проверяет все аргументы, за исключением устройства, и вызывает специфический модуль монтирования для указанного типа файловой системы. При вызове без аргументов mount выдает список всех смонтированных файловых систем из соответствующей таблицы. При вызове с неполным списком аргументов (например, только с указанием устройства или точки_монтирования, или когда указаны оба эти аргумента, но не задан тип файловой системы), mount будет просматривать таблицу стандартных файловых систем в поисках недостающих аргументов. Затем она вызывает специфический модуль монтирования для соответствующего типа файловой системы.
Специфические опции монтирования зависят от типа физической файловой системы. Все физические файловые системы можно монтировать только для чтения (-o ro).
Обратная процедура по отношению к монтированию называется демонтированием и выполняется командой umount со следующим синтаксисом:
Для большинства типов файловых систем нет специфического модуля демонтирования. Если такой модуль существует, он выполняется; иначе файловая система демонтируется стандартным модулем.
Команды mount и umount воспринимают следующие основные опции:
Любой пользователь может вызывать команду mount для получения списка смонтированных файловых систем и ресурсов. Например:
[kravchuk@arturo 13:05:48 /]$ mount -p /dev/dsk/c1t0d0s0 - / ufs - no rw,intr,largefiles,logging,onerror=panic,suid,dev=740040 /dev/dsk/c1t0d0s3 - /usr ufs - no rw,intr,largefiles,logging,onerror=panic,suid,dev=740043 /dev/dsk/c1t0d0p0:boot - /boot pcfs - no rw,nohidden,nofoldcase,dev=763050 /proc - /proc proc - no dev=2c00000 fd - /dev/fd fd - no rw,suid,dev=2cc0000 mnttab - /etc/mnttab mntfs - no dev=2dc0000 /dev/dsk/c1t0d0s1 - /var ufs - no rw,intr,largefiles,logging,onerror=panic,suid,dev=740041 swap - /var/run tmpfs - no dev=1 swap - /tmp tmpfs - no dev=2 /dev/dsk/c1t0d0s4 - /home ufs - no rw,intr,largefiles,logging,onerror=panic,suid,dev=740044 /dev/dsk/c2t0d0s1 - /fs ufs - no rw,intr,largefiles,logging,onerror=panic,suid,dev=740401
Только пользователь root может монтировать или демонтировать файловые системы.
Команда mount по умолчанию добавляет запись в таблицу смонтированных файловых систем (файл /etc/mnttab в SVR4); umount удаляет запись из этой таблицы. Поля в таблице смонтированных устройств разделены пробелами и представляют блочное специальное устройство, точку монтирования, тип смонтированной файловой системы, опции монтирования и время, когда файловая система была смонтирована.
Таблица стандартных файловых систем (в файле /etc/vfstab или /etc/fstab, в зависимости от разновидности UNIX) описывает стандартные параметры для физических файловых систем. Поля в таблице (их 7) разделены пробелами и символами табуляции, и представляют, соответственно:
Если в поле нет значения, используется дефис (-). Рассмотрим пример записей из таблицы стандартных файловых систем из ОС Solaris 8:
#device device mount FS fsck mount mount #to mount to fsck point type pass at boot options /dev/dsk/c1t0d0s0 /dev/rdsk/c1t0d0s0 / ufs 1 no logging /dev/dsk/c1t0d0s3 /dev/rdsk/c1t0d0s3 /usr ufs 1 no logging /dev/dsk/c1t0d0s1 /dev/rdsk/c1t0d0s1 /var ufs 1 no - /dev/dsk/c1t0d0s4 /dev/rdsk/c1t0d0s4 /home ufs 2 yes logging ...
Для получения информации о смонтированных физических файловых системах используется команда df со следующим синтаксисом:
Опции и параметры определяют формат выдаваемой информации и файловые системы, о которых информирует команда. Чаще всего, команда df вызывается без опций или с опцией -k. Опция -k выдает информацию об объемах в килобайтах. Для каждой физической файловой системы выдается отдельная строка, включающая (при использовании опции -k) специальный файл или имя смонтированного ресурса, общий объем, использованный объем, доступный объем для использования обычными пользователями, процент свободного места в файловой системе и точку монтирования.
Рассмотрим примеры выполнения команды df в ОС Solaris:
[kravchuk@arturo 12:11:00 /]$ df -k
Filesystem kbytes used avail capacity Mounted on
/dev/dsk/c1t0d0s0 245983 20713 200672 10% /
/dev/dsk/c1t0d0s3 3096090 1782106 1252063 59% /usr
/dev/dsk/c1t0d0p0:boot
10797 1622 9175 16% /boot
/proc 0 0 0 0% /proc
fd 0 0 0 0% /dev/fd
mnttab 0 0 0 0% /etc/mnttab
/dev/dsk/c1t0d0s1 491983 204863 237922 47% /var
swap 324832 16 324816 1% /var/run
swap 337828 13012 324816 4% /tmp
/dev/dsk/c1t0d0s4 2305873 1021225 1238531 46% /home
/dev/dsk/c2t0d0s1 6192197 5633827 496449 92% /fs
[kravchuk@arturo 12:45:58 /]$ df
/ (/dev/dsk/c1t0d0s0 ): 450540 blocks 120616 files
/usr (/dev/dsk/c1t0d0s3 ): 2627968 blocks 338652 files
/boot (/dev/dsk/c1t0d0p0:boot): 18350 blocks -1 files
/proc (/proc ): 0 blocks 3615 files
/dev/fd (fd ): 0 blocks 0 files
/etc/mnttab (mnttab ): 0 blocks 0 files
/var (/dev/dsk/c1t0d0s1 ): 574236 blocks 240784 files
/var/run (swap ): 647568 blocks 43108 files
/tmp (swap ): 647568 blocks 43108 files
/home (/dev/dsk/c1t0d0s4 ): 2569298 blocks 379999 files
/fs (/dev/dsk/c2t0d0s1 ): 1116738 blocks 688872 files
С наилучшими пожеланиями,
В.К.
|
|