Как уже было сказано в лекции 4, файловая система - одна из основных составляющих любой операционной системы, так как она обеспечивает хранение информации на физических носителях и доступ приложений к этой информации. В разделе лекции 4 была достаточно подробно рассмотрена та сторона файловой системы, которая обращена к пользователю - логическая структура каталогов и файлов. В этом разделе мы рассмотрим внутренние механизмы работы файловых систем, т. е. обратную (невидимую для пользователя) сторону файловой системы. Эта сторона обращена к физическим устройствам и определяет способ хранения информации на носителях, а также механизмы записи и извлечения этой информации по запросам приложений. Здесь в основе всего лежит способ адресации отдельных участков носителя и механизмы размещения отрезков файла по этим участкам.
Но, прежде чем перейти к описанию конкретных механизмов, стоит отметить, что Linux умеет работать с несколькими типами файловых систем. Основной файловой системой для Linux является "вторая расширенная файловая система" (second extended filesystem), которую кратко обозначают как ext2fs. Именно ее механизмы будут подробно рассматриваться в настоящем разделе. Но прежде, чем перейти к ее рассмотрению, ненадолго отвлечемся для того, чтобы кратко перечислить некоторые типы файловых систем, которые поддерживаются в Linux. Их список приведен в табл. 16.1.
| Тип ФС | Назначение |
|---|---|
|
Файловая система |
extfs |
Еще одна из ранних версий файловой системы для Linux, расширение файловой системы ext2 и уже не используются |
ext2fs |
Вторая расширенная файловая система (second extended filesystem) была создана как расширение файловой системы extfs. ext2fs обеспечивает более высокую производительность (в части скорости и использования центрального процессора), поддерживаются длинные имена и большие размеры файлов |
xiaf |
Файловая система Xiaf была создана на основе с целью обеспечения большей устойчивости и безопасности. Она обеспечивает выполнение основных функций файловой системы без излишней сложности |
msdos |
Файловая система, используемая для разделов, сформатированных в MS-DOS и Windows. Имена файлов в msdos должны удовлетворять стандарту 8.3 |
umsdos |
Файловая система |
|
Файловая система для разделов OS/2. В Linux обеспечивается только чтение из разделов |
proc |
Это файловая система, которая используется для обращения к структурам данных ядра. Файлы этой системы не занимают дискового пространства. Подробнее см. страницу man proc(5) |
nfs |
Сетевая файловая система, используемая для доступа к дискам, расположенным на удаленных компьютерах |
swap |
Раздел или файл свопинга OC Linux |
sysv |
Файловая система Unix System V. Она поддерживает файловые системы Xenix FS, SystemV/386 FS и |
iso9660 |
Файловая система для монтирования CD-ROM, соответствующая стандарту |
|
Файловая система FAT-32. Поддерживаются длинные имена файлов |
smb |
Это сетевая файловая система, которая поддерживает протокол SMB, используемый Windows, Windows NT и smbmount |
ncpfs |
Это сетевая файловая система, обеспечивающая поддержку протокола |
Эту таблицу нельзя считать полной по той простой причине, что работа по созданию новых типов файловых систем для Linux продолжается постоянно. Примерами вновь разрабатываемых файловых систем являются ext2fs, я постараюсь охарактеризовать в конце данной лекции.
А теперь подробнее рассмотрим основной на сегодняшний день тип файловой системы для Linux - ext2fs.
Производители жестких дисков обычно поставляют свои изделия отформатированными на низком уровне. Насколько я знаю, это означает, что все дисковое пространство с помощью специальных меток разбито на "сектора" размером 512 байт. Такой диск (или дисковый раздел) должен быть подготовлен для использования в определенной операционной системе. В MS-DOS или Windows процедура подготовки называется форматированием, а в Linux - созданием файловой системы. Создание файловой системы ext2fs заключается в создании в разделе диска определенной логической структуры. Эта структура строится следующим образом.
Во-первых, на диске выделяется загрузочная область. Загрузочная область создается в любой файловой системе. На первичном разделе она содержит загрузочную запись - фрагмент кода, который инициирует процесс загрузки операционной системы при запуске. На других разделах эта область не используется. Все остальное пространство на диске делится на блоки. Блок может иметь размер от 1, 2 или 4 килобайта. Блок является адресуемой единицей дискового пространства. Выделение места файлам осуществляется целыми блоками, поэтому при выборе размера блока приходится идти на компромисс. Большой размер блока, как правило, сокращает число обращений к диску при чтении или записи файла, но зато увеличивает долю нерационально используемого пространства, особенно при наличии большого числа файлов маленького размера.
Блоки, в свою очередь, объединяются в группы блоков (табл. 16.1). Группы блоков в файловой системе и блоки внутри группы нумеруются последовательно, начиная с 1. Первый блок на диске имеет номер 1 и принадлежит группе с номером 1. Общее число блоков на диске (в разделе диска) является делителем объема диска, выраженного в секторах. А число групп блоков не обязано делить число блоков, потому что последняя группа блоков может быть не полной. Начало каждой группы блоков имеет адрес, который может быть получен как ( (номер_группы - 1)* (число_блоков_в_группе) ).
| Загрузочная запись | Группа блоков 1 | Группа блоков 2 | ... | Группа блоков n |
Каждая группа блоков имеет одинаковое строение:
| Супер-блок | Описание группы блоков (Group Descriptors) | Битовая карта блоков (Block Bitmap) | Битовая карта |
Таблица |
Область блоков данных |
Такая структура служит повышению производительности файловой системы за счет того, что сокращается расстояние между таблицей
Первый элемент каждой группы блоков (суперблок) одинаков для всех групп, а все остальные - индивидуальны для каждой группы. Суперблок хранится в первом блоке каждой группы блоков. Суперблок является начальной точкой файловой системы. Он имеет размер 1024 байта и всегда располагается по смещению 1024 байта от начала файловой системы. Наличие нескольких копий
Информация, хранимая в суперблоке, используется для организации доступа к остальным данным на диске. В суперблоке определяется размер файловой системы, максимальное число файлов в разделе, объем свободного пространства и содержится информация о том, где искать незанятые участки. При запуске ОС суперблок считывается в память, и все изменения файловой системы вначале находят отображение в копии
Структура
| Название поля | Тип | Комментарий |
|---|---|---|
s_inodes_count |
ULONG | Число |
s_blocks_count |
ULONG | Число блоков в файловой системе |
s_r_blocks_count |
ULONG | Число блоков, зарезервированных для суперпользователя |
s_free_blocks_count |
ULONG | Счетчик числа свободных блоков |
s_free_inodes_count |
ULONG | Счетчик числа свободных |
s_first_data_block |
ULONG | Первый блок, который содержит данные. В зависимости от размера блока, это поле может быть равно 0 или 1 |
s_log_block_size |
ULONG | Индикатор размера логического блока: 0 = 1 Кб; 1 = 2 Кб; 2 = 4 Кб |
s_log_frag_size |
LONG | Индикатор размера фрагментов (кажется, понятие фрагмента в настоящее время не используется) |
s_blocks_per_group |
ULONG | Число блоков в каждой группе блоков |
s_frags_per_group |
ULONG | Число фрагментов в каждой группе блоков |
s_inodes_per_group |
ULONG | Число |
s_mtime |
ULONG | Время, когда в последний раз была смонтирована файловая система |
s_wtime |
ULONG | Время, когда в последний раз производилась запись в файловую систему |
s_mnt_count |
USHORT | Счетчик числа s_max_mnt_count ), файловая система должна быть проверена (это делается при перезапуске), а счетчик обнуляется |
s_max_mnt_count |
SHORT | Число, определяющее, сколько раз может быть смонтирована файловая система |
s_magic |
USHORT | "Магическое число" (0xEF53), указывающее, что файловая система принадлежит к типу ex2fs |
s_state |
USHORT | Флаги, указывающее текущее состояние файловой системы (является ли она чистой (clean) и т.п.) |
s_errors |
USHORT | Флаги, задающие процедуры обработки сообщений об ошибках (что делать, если найдены ошибки) |
s_pad |
USHORT | Заполнение |
s_lastcheck |
ULONG | Время последней проверки файловой системы |
s_checkinterval |
ULONG | Максимальный период времени между проверками файловой системы |
s_creator_os |
ULONG | Указание на тип ОС, в которой создана файловая система |
s_rev_level |
ULONG | Версия ( |
s_reserved |
ULONG[235] | Заполнение до 1024 байт |
Вслед за
| Название поля | Тип | Назначение |
|---|---|---|
bg_block_bitmap |
ULONG | Адрес блока, содержащего битовую карту блоков (block bitmap) данной группы |
bg_inode_bitmap |
ULONG | Адрес блока, содержащего битовую карту |
bg_inode_table |
ULONG | Адрес блока, содержащего таблицу |
bg_free_blocks_count |
USHORT | Счетчик числа свободных блоков в данной группе |
bg_free_inodes_count |
USHORT | Число свободных |
bg_used_dirs_count |
USHORT | Число |
bg_pad |
USHORT | Заполнение |
bg_reserved |
ULONG[3] | Заполнение |
Размер описания группы блоков можно вычислить как
(размер_группы_блоков_в_ext2 * число_групп) / размер_блока
при необходимости округляем.
Информация, которая хранится в описании группы, используется для того, чтобы найти битовые карты блоков и
Битовая карта блоков (block bitmap) - это структура, каждый бит которой показывает, отведен ли соответствующий ему блок какому-либо файлу. Если бит равен 1, то блок занят. Эта карта служит для поиска свободных блоков в тех случаях, когда надо выделить место под файл, Битовая карта блоков занимает число блоков, равное ( число_блоков_в_группе / 8) / размер_блока (при необходимости округляем).
Битовая карта
Следующая область в структуре группы блоков служит для хранения таблицы
И, наконец, все оставшееся место в группе блоков отводится для хранения собственно файлов.
Каждому файлу на диске соответствует один и только один
Строение
| Название поля | Тип | Описание |
|---|---|---|
i_mode |
USHORT | Тип и права доступа к данному файлу |
i_uid |
USHORT | Идентификатор владельца файла (Owner Uid) |
i_size |
ULONG | Размер файла в байтах |
i_atime |
ULONG | Время последнего обращения к файлу ( |
i_ctime |
ULONG | Время создания файла |
i_mtime |
ULONG | Время последней модификации файла |
i_dtime |
ULONG | Время удаления файла |
i_gid |
USHORT | Идентификатор группы ( |
i_links_count |
USHORT | Счетчик числа связей (Links count) |
i_blocks |
ULONG | Число блоков, занимаемых файлом |
i_flags |
ULONG | |
i_reserved1 |
ULONG | Зарезервировано для ОС |
i_block |
ULONG[15] | Указатели на блоки, в которых записаны данные файла (это поле подробно описано следующем разделе) |
i_version |
ULONG | Версия файла (для NFS) |
i_file_acl |
ULONG | ACL файла |
i_dir_acl |
ULONG | ACL каталога |
i_faddr |
ULONG | Адрес фрагмента ( |
i_frag |
UCHAR | Номер фрагмента ( |
i_fsize |
UCHAR | Размер фрагмента ( |
i_pad1 |
USHORT | Заполнение |
i_reserved2 |
ULONG[2] | Зарезервировано |
Поле типа и прав доступа к файлу представляет собой двухбайтовое слово, каждый бит которого служит флагом, индицирующим отношение файла к определенному типу или установку одного конкретного права на файл.
| Идентификатор | Значение | Назначение флага (поля) |
|---|---|---|
S_IFMT |
F000 | Маска для типа файла |
S_IFSOCK |
A000 | Доменное гнездо (socket) |
S_IFLNK |
C000 | |
S_IFREG |
8000 | Обычный (regular) файл |
S_IFBLK |
6000 | Блок-ориентированное устройство |
S_IFDIR |
4000 | Каталог |
S_IFCHR |
2000 | Байт-ориентированное ( |
S_IFIFO |
1000 | |
S_ISUID |
0800 | SUID - бит смены владельца |
S_ISGID |
0400 | SGID - бит смены группы |
S_ISVTX |
0200 | Бит сохранения задачи ( |
S_IRWXU |
01C0 | Маска прав владельца файла |
S_IRUSR |
0100 | Право на чтение |
S_IWUSR |
0080 | Право на запись |
S_IXUSR |
0040 | Право на выполнение |
S_IRWXG |
0038 | Маска прав группы |
S_IRGRP |
0020 | Право на чтение |
S_IWGRP |
0010 | Право на запись |
S_IXGRP |
0008 | Право на выполнение |
S_IRWXO |
0007 | Маска прав остальных пользователей |
S_IROTH |
0004 | Право на чтение |
S_IWOTH |
0002 | Право на запись |
S_IXOTH |
0001 | Право на выполнение |
Среди
| Идентификатор | Значение | Описание |
|---|---|---|
EXT2_BAD_INO |
1 | |
EXT2_ROOT_INO |
2 | |
EXT2_ACL_IDX_INO |
3 | ACL |
EXT2_ACL_DATA_INO |
4 | ACL |
EXT2_BOOT_LOADER_INO |
5 | |
EXT2_UNDEL_DIR_INO |
6 | |
EXT2_FIRST_INO |
11 | Первый незарезервированный |
Самый важный дескриптор в этом списке - дескриптор корневого каталога. Этот дескриптор указывает на корневой каталог, который, подобно всем каталогам, представляет собой
| Название поля | Тип | Описание |
|---|---|---|
|
ULONG | Номер |
Rec_len |
USHORT | Длина этой записи |
Name_len |
USHORT | Длина имени файла |
Name |
CHAR[0] | Имя файла |
Использование записей переменной длины позволяет использовать длинные имена файлов без пустой траты дискового пространства. Отдельная запись в каталоге не может пересекать
Система адресации данных - это одна из самых существенных составных частей файловой системы. Именно система адресации позволяет находить нужный файл среди множества как пустых, так и занятых блоков на диске. В ext2fs система адресации реализуется полем i_block
Поле i_block в EXT2_NDIR_BLOCKS [12] ) представляют собой прямые ссылки (адреса) на номера блоков, в которых хранятся данные из файла. Следующий адрес в этом массиве ( EXT2_IND_BLOCK ) является косвенной ссылкой, т. е. адресом блока, в котором хранится список адресов следующих блоков с данными из этого файла. В этом блоке могут быть записаны адреса ( размер_блока / размер_ULONG ) блоков с данными файла.
Следующий адрес в поле i_block EXT2_DIND_BLOCK ) указывает на блок двойной косвенной адресации (double
И, наконец, последний адрес ( EXT2_TIND_BLOCK ) в поле i_block
Теперь вы знаете, как устроены ext2fs осуществляется запись в файл и чтение из файла.
Может быть здесь еще надо бы рассказать о команде mkfs, которая служит для создания файловой системы в разделе диска. Но вкратце мы ее рассмотрели в лекции 4, а за более подробными пояснениями читатель может обратиться к интерактивным руководствам.
До сих пор наш рассказ о файловой системе касался только "статических", если можно так выразиться, составных частей файловой системы. Но, я думаю, вы понимаете, что все это хозяйство обслуживается какими-то программными модулями. Эти программные части можно разделить на две составных части. Одна часть входит в состав ядра и образует так называемую виртуальную файловую систему (VFS). VFS обеспечивает унифицированный программный интерфейс к услугам файловой системы, причем безотносительно к тому, какой тип файловой системы ( , ext2fs, nfs и т. д.) имеется на конкретном физическом носителе. Поэтому каждая файловая система должна предоставлять еще какие-то конкретные процедуры доступа к своим файлам, для того, чтобы использоваться под Linux.
Файловая система ext2fs была создана по образу и подобию файловой системы UNIX (UNIX File System -
Существуют две основных проблемы этого рода.
Во-первых, эти структуры не способны работать с носителями информации увеличенного объема. В них отведено строго фиксированное число бит для хранения данных о размере дисковых разделов и размерах файлов, фиксированное число бит для хранения логических номеров блоков и т. д. . Как следствие, число файлов и каталогов и их размер ограничены.
Вторая проблема связана с производительностью. В силу заложенных в старые файловые системы алгоритмов решение некоторых задач стало требовать слишком большого времени на носителях увеличенного объема. Одним из самых характерных примеров такого рода проблем является трудоемкость восстановления файловой системы после сбоев (например, после неожиданного отключения питания). Это восстановление выполняется с помощью программы fsck, и для очень больших дисков стало требовать нескольких часов.
Естественно, что появление этих проблем породило и попытки их решения. Были разработаны новые типы файловых систем, при создании которых учитывались требования масштабируемости. Наиболее известными разработками файловых систем новых типов являются:
ext3fs ;XFS ;JFS фирмы IBM;ReiserFS.В табл.16.8 приведены данные по увеличению основных параметров, обеспечиваемых новыми файловыми системами. Данные заимствованы из статьи Juan I. Santos Florido "Journal File Systems", опубликованной в 55-ом выпуске Linux Gazette (July 2000).
| Размер блока | Максимальный размер файловой системы | Максимальный размер файла | |
|---|---|---|---|
Ext3FS |
1-4 Кбайт | 4 Tбайт | 2 Гбайт |
XFS |
от 512 байт до 64 Кбайт | 18 тысяч |
9 тысяч |
JFS |
512, 1024, 2048, 4096 байт | от 4 |
От 512 Тбайт (при 512-байтовых блоках) До 4 |
ReiserFS |
До 64 Кбайт (пока что фиксирован, 4 Кбайт) | 4 Гбайт блоков, 16 Тбайт | 4 Гбайт, 210 |
Основная цель, которая преследуется при создании журналируемых файловых систем, состоит в том, чтобы обеспечить быстрое восстановление системы после сбоев (например, после потери питания). Дело в том, что если произойдет такой сбой, то часть информации о расположении файлов теряется, поскольку не все изменения сразу записываются на диск. После этого программа fsck вынуждена просматривать весь диск блок за блоком (пользуясь битовыми матрицами занятых блоков и
В журналируемых файловых системах для решения этой проблемы применяют технику транзакций, развитую в теории баз данных. Суть этой техники в том, что действие не считается завершенным, пока все изменения не сохранены на диске. А чтобы сбои, происходящие в течение времени, необходимого для завершения всех операций, не приводили к необратимым последствиям, все действия и все изменяемые данные протоколируются. Если сбой все-таки произойдет, то по этому протоколу можно вернуть систему в безошибочное состояние.
Главное отличие в технике транзакций, применяемой в базах данных, от аналогичной техники, применяемой в журналируемых файловых системах, состоит в том, что в базах данных сохраняются в протоколе как сами изменяемые данные, так и вся управляющая информация, в то время как понятие транзакции в файловых системах подразумевает сохранение только мета-данных:
Файловые системы ext3fs и JFS являются журналируемыми. Надо отметить, что ext3fs не является совершенно новой разработкой, а является просто надстройкой над ext2fs, обеспечивающей ведение журнала и организацию транзакций. Файловые системы XFS и JFS являются открытыми версиями коммерческих файловых систем.
Кроме проблемы быстрого восстановления после сбоев, в файловой системе ext2fs имеется еще несколько нерешенных проблем.
Одна из самых насущных - это проблема нерационального использования дискового пространства. Конечно, ext2fs использует диск гораздо более рационально, чем FAT, но, как вам хорошо известно, "памяти много не бывает"!
Собственно проблема возникает из-за следующего противоречия:
Еще две проблемы, с которыми мы сталкиваемся в файловой системе ext2fs, связаны с поиском. Первая проблема возникает при записи на диск нового файла. Поскольку распределение свободных блоков хранится в виде битовой карты свободных блоков и свободных
Вторая проблема поиска связана с поиском файлов в больших каталогах. Поскольку файлы мы ищем по именам, приходится последовательно просматривать все записи в каталоге. Время такого поиска тоже пропорционально размеру каталога и вырастает в проблему при больших размерах каталогов.
Между тем методы снижения трудоемкости поиска давно разработаны, только надо для хранения информации о свободных объектах использовать не простые списки, а несколько более сложные структуры данных. В системе ReiserFS для этого применяются так называемые "сбалансированные деревья" или "B+Trees", время поиска в которых пропорционально не количеству объектов (файлов в каталоге или числа блоков на диске), а логарифму этого числа. В сбалансированном дереве все ветви (пути от корня до "листа") имеют одинаковую (или примерно одинаковую) длину. ReiserFS использует сбалансированные деревья для хранения всех объектов файловой системы: файлов в каталогах, данных о свободных блоках и т. д. Это позволяет существенно повысить производительность обращения к дискам.
Кроме того, ReiserFS является журналируемой, т. е. в ней решена и проблема быстрого восстановления после сбоев.
Я привел в данной лекции только самые поверхностные данные о новых типах файловых систем, поскольку статей о них пока опубликовано довольно мало. Тем не менее, за время подготовки книги некоторая дополнительная информация появилась, так что если вас этот вопрос интересует, поищите сведения в Интернете.
Как уже было сказано в лекции 4, файловая система - одна из основных составляющих любой операционной системы, так как она обеспечивает хранение информации на физических носителях и доступ приложений к этой информации. В разделе лекции 4 была достаточно подробно рассмотрена та сторона файловой системы, которая обращена к пользователю - логическая структура каталогов и файлов. В этом разделе мы рассмотрим внутренние механизмы работы файловых систем, т. е. обратную (невидимую для пользователя) сторону файловой системы. Эта сторона обращена к физическим устройствам и определяет способ хранения информации на носителях, а также механизмы записи и извлечения этой информации по запросам приложений. Здесь в основе всего лежит способ адресации отдельных участков носителя и механизмы размещения отрезков файла по этим участкам.
Но, прежде чем перейти к описанию конкретных механизмов, стоит отметить, что Linux умеет работать с несколькими типами файловых систем. Основной файловой системой для Linux является "вторая расширенная файловая система" (second extended filesystem), которую кратко обозначают как ext2fs. Именно ее механизмы будут подробно рассматриваться в настоящем разделе. Но прежде, чем перейти к ее рассмотрению, ненадолго отвлечемся для того, чтобы кратко перечислить некоторые типы файловых систем, которые поддерживаются в Linux. Их список приведен в табл. 16.1.
| Тип ФС | Назначение |
|---|---|
|
Файловая система |
extfs |
Еще одна из ранних версий файловой системы для Linux, расширение файловой системы ext2 и уже не используются |
ext2fs |
Вторая расширенная файловая система (second extended filesystem) была создана как расширение файловой системы extfs. ext2fs обеспечивает более высокую производительность (в части скорости и использования центрального процессора), поддерживаются длинные имена и большие размеры файлов |
xiaf |
Файловая система Xiaf была создана на основе с целью обеспечения большей устойчивости и безопасности. Она обеспечивает выполнение основных функций файловой системы без излишней сложности |
msdos |
Файловая система, используемая для разделов, сформатированных в MS-DOS и Windows. Имена файлов в msdos должны удовлетворять стандарту 8.3 |
umsdos |
Файловая система |
|
Файловая система для разделов OS/2. В Linux обеспечивается только чтение из разделов |
proc |
Это файловая система, которая используется для обращения к структурам данных ядра. Файлы этой системы не занимают дискового пространства. Подробнее см. страницу man proc(5) |
nfs |
Сетевая файловая система, используемая для доступа к дискам, расположенным на удаленных компьютерах |
swap |
Раздел или файл свопинга OC Linux |
sysv |
Файловая система Unix System V. Она поддерживает файловые системы Xenix FS, SystemV/386 FS и |
iso9660 |
Файловая система для монтирования CD-ROM, соответствующая стандарту |
|
Файловая система FAT-32. Поддерживаются длинные имена файлов |
smb |
Это сетевая файловая система, которая поддерживает протокол SMB, используемый Windows, Windows NT и smbmount |
ncpfs |
Это сетевая файловая система, обеспечивающая поддержку протокола |
Эту таблицу нельзя считать полной по той простой причине, что работа по созданию новых типов файловых систем для Linux продолжается постоянно. Примерами вновь разрабатываемых файловых систем являются ext2fs, я постараюсь охарактеризовать в конце данной лекции.
А теперь подробнее рассмотрим основной на сегодняшний день тип файловой системы для Linux - ext2fs.
Производители жестких дисков обычно поставляют свои изделия отформатированными на низком уровне. Насколько я знаю, это означает, что все дисковое пространство с помощью специальных меток разбито на "сектора" размером 512 байт. Такой диск (или дисковый раздел) должен быть подготовлен для использования в определенной операционной системе. В MS-DOS или Windows процедура подготовки называется форматированием, а в Linux - созданием файловой системы. Создание файловой системы ext2fs заключается в создании в разделе диска определенной логической структуры. Эта структура строится следующим образом.
Во-первых, на диске выделяется загрузочная область. Загрузочная область создается в любой файловой системе. На первичном разделе она содержит загрузочную запись - фрагмент кода, который инициирует процесс загрузки операционной системы при запуске. На других разделах эта область не используется. Все остальное пространство на диске делится на блоки. Блок может иметь размер от 1, 2 или 4 килобайта. Блок является адресуемой единицей дискового пространства. Выделение места файлам осуществляется целыми блоками, поэтому при выборе размера блока приходится идти на компромисс. Большой размер блока, как правило, сокращает число обращений к диску при чтении или записи файла, но зато увеличивает долю нерационально используемого пространства, особенно при наличии большого числа файлов маленького размера.
Блоки, в свою очередь, объединяются в группы блоков (табл. 16.1). Группы блоков в файловой системе и блоки внутри группы нумеруются последовательно, начиная с 1. Первый блок на диске имеет номер 1 и принадлежит группе с номером 1. Общее число блоков на диске (в разделе диска) является делителем объема диска, выраженного в секторах. А число групп блоков не обязано делить число блоков, потому что последняя группа блоков может быть не полной. Начало каждой группы блоков имеет адрес, который может быть получен как ( (номер_группы - 1)* (число_блоков_в_группе) ).
| Загрузочная запись | Группа блоков 1 | Группа блоков 2 | ... | Группа блоков n |
Каждая группа блоков имеет одинаковое строение:
| Супер-блок | Описание группы блоков (Group Descriptors) | Битовая карта блоков (Block Bitmap) | Битовая карта |
Таблица |
Область блоков данных |
Такая структура служит повышению производительности файловой системы за счет того, что сокращается расстояние между таблицей
Первый элемент каждой группы блоков (суперблок) одинаков для всех групп, а все остальные - индивидуальны для каждой группы. Суперблок хранится в первом блоке каждой группы блоков. Суперблок является начальной точкой файловой системы. Он имеет размер 1024 байта и всегда располагается по смещению 1024 байта от начала файловой системы. Наличие нескольких копий
Информация, хранимая в суперблоке, используется для организации доступа к остальным данным на диске. В суперблоке определяется размер файловой системы, максимальное число файлов в разделе, объем свободного пространства и содержится информация о том, где искать незанятые участки. При запуске ОС суперблок считывается в память, и все изменения файловой системы вначале находят отображение в копии
Структура
| Название поля | Тип | Комментарий |
|---|---|---|
s_inodes_count |
ULONG | Число |
s_blocks_count |
ULONG | Число блоков в файловой системе |
s_r_blocks_count |
ULONG | Число блоков, зарезервированных для суперпользователя |
s_free_blocks_count |
ULONG | Счетчик числа свободных блоков |
s_free_inodes_count |
ULONG | Счетчик числа свободных |
s_first_data_block |
ULONG | Первый блок, который содержит данные. В зависимости от размера блока, это поле может быть равно 0 или 1 |
s_log_block_size |
ULONG | Индикатор размера логического блока: 0 = 1 Кб; 1 = 2 Кб; 2 = 4 Кб |
s_log_frag_size |
LONG | Индикатор размера фрагментов (кажется, понятие фрагмента в настоящее время не используется) |
s_blocks_per_group |
ULONG | Число блоков в каждой группе блоков |
s_frags_per_group |
ULONG | Число фрагментов в каждой группе блоков |
s_inodes_per_group |
ULONG | Число |
s_mtime |
ULONG | Время, когда в последний раз была смонтирована файловая система |
s_wtime |
ULONG | Время, когда в последний раз производилась запись в файловую систему |
s_mnt_count |
USHORT | Счетчик числа s_max_mnt_count ), файловая система должна быть проверена (это делается при перезапуске), а счетчик обнуляется |
s_max_mnt_count |
SHORT | Число, определяющее, сколько раз может быть смонтирована файловая система |
s_magic |
USHORT | "Магическое число" (0xEF53), указывающее, что файловая система принадлежит к типу ex2fs |
s_state |
USHORT | Флаги, указывающее текущее состояние файловой системы (является ли она чистой (clean) и т.п.) |
s_errors |
USHORT | Флаги, задающие процедуры обработки сообщений об ошибках (что делать, если найдены ошибки) |
s_pad |
USHORT | Заполнение |
s_lastcheck |
ULONG | Время последней проверки файловой системы |
s_checkinterval |
ULONG | Максимальный период времени между проверками файловой системы |
s_creator_os |
ULONG | Указание на тип ОС, в которой создана файловая система |
s_rev_level |
ULONG | Версия ( |
s_reserved |
ULONG[235] | Заполнение до 1024 байт |
Вслед за
| Название поля | Тип | Назначение |
|---|---|---|
bg_block_bitmap |
ULONG | Адрес блока, содержащего битовую карту блоков (block bitmap) данной группы |
bg_inode_bitmap |
ULONG | Адрес блока, содержащего битовую карту |
bg_inode_table |
ULONG | Адрес блока, содержащего таблицу |
bg_free_blocks_count |
USHORT | Счетчик числа свободных блоков в данной группе |
bg_free_inodes_count |
USHORT | Число свободных |
bg_used_dirs_count |
USHORT | Число |
bg_pad |
USHORT | Заполнение |
bg_reserved |
ULONG[3] | Заполнение |
Размер описания группы блоков можно вычислить как
(размер_группы_блоков_в_ext2 * число_групп) / размер_блока
при необходимости округляем.
Информация, которая хранится в описании группы, используется для того, чтобы найти битовые карты блоков и
Битовая карта блоков (block bitmap) - это структура, каждый бит которой показывает, отведен ли соответствующий ему блок какому-либо файлу. Если бит равен 1, то блок занят. Эта карта служит для поиска свободных блоков в тех случаях, когда надо выделить место под файл, Битовая карта блоков занимает число блоков, равное ( число_блоков_в_группе / 8) / размер_блока (при необходимости округляем).
Битовая карта
Следующая область в структуре группы блоков служит для хранения таблицы
И, наконец, все оставшееся место в группе блоков отводится для хранения собственно файлов.
Каждому файлу на диске соответствует один и только один
Строение
| Название поля | Тип | Описание |
|---|---|---|
i_mode |
USHORT | Тип и права доступа к данному файлу |
i_uid |
USHORT | Идентификатор владельца файла (Owner Uid) |
i_size |
ULONG | Размер файла в байтах |
i_atime |
ULONG | Время последнего обращения к файлу ( |
i_ctime |
ULONG | Время создания файла |
i_mtime |
ULONG | Время последней модификации файла |
i_dtime |
ULONG | Время удаления файла |
i_gid |
USHORT | Идентификатор группы ( |
i_links_count |
USHORT | Счетчик числа связей (Links count) |
i_blocks |
ULONG | Число блоков, занимаемых файлом |
i_flags |
ULONG | |
i_reserved1 |
ULONG | Зарезервировано для ОС |
i_block |
ULONG[15] | Указатели на блоки, в которых записаны данные файла (это поле подробно описано следующем разделе) |
i_version |
ULONG | Версия файла (для NFS) |
i_file_acl |
ULONG | ACL файла |
i_dir_acl |
ULONG | ACL каталога |
i_faddr |
ULONG | Адрес фрагмента ( |
i_frag |
UCHAR | Номер фрагмента ( |
i_fsize |
UCHAR | Размер фрагмента ( |
i_pad1 |
USHORT | Заполнение |
i_reserved2 |
ULONG[2] | Зарезервировано |
Поле типа и прав доступа к файлу представляет собой двухбайтовое слово, каждый бит которого служит флагом, индицирующим отношение файла к определенному типу или установку одного конкретного права на файл.
| Идентификатор | Значение | Назначение флага (поля) |
|---|---|---|
S_IFMT |
F000 | Маска для типа файла |
S_IFSOCK |
A000 | Доменное гнездо (socket) |
S_IFLNK |
C000 | |
S_IFREG |
8000 | Обычный (regular) файл |
S_IFBLK |
6000 | Блок-ориентированное устройство |
S_IFDIR |
4000 | Каталог |
S_IFCHR |
2000 | Байт-ориентированное ( |
S_IFIFO |
1000 | |
S_ISUID |
0800 | SUID - бит смены владельца |
S_ISGID |
0400 | SGID - бит смены группы |
S_ISVTX |
0200 | Бит сохранения задачи ( |
S_IRWXU |
01C0 | Маска прав владельца файла |
S_IRUSR |
0100 | Право на чтение |
S_IWUSR |
0080 | Право на запись |
S_IXUSR |
0040 | Право на выполнение |
S_IRWXG |
0038 | Маска прав группы |
S_IRGRP |
0020 | Право на чтение |
S_IWGRP |
0010 | Право на запись |
S_IXGRP |
0008 | Право на выполнение |
S_IRWXO |
0007 | Маска прав остальных пользователей |
S_IROTH |
0004 | Право на чтение |
S_IWOTH |
0002 | Право на запись |
S_IXOTH |
0001 | Право на выполнение |
Среди
| Идентификатор | Значение | Описание |
|---|---|---|
EXT2_BAD_INO |
1 | |
EXT2_ROOT_INO |
2 | |
EXT2_ACL_IDX_INO |
3 | ACL |
EXT2_ACL_DATA_INO |
4 | ACL |
EXT2_BOOT_LOADER_INO |
5 | |
EXT2_UNDEL_DIR_INO |
6 | |
EXT2_FIRST_INO |
11 | Первый незарезервированный |
Самый важный дескриптор в этом списке - дескриптор корневого каталога. Этот дескриптор указывает на корневой каталог, который, подобно всем каталогам, представляет собой
| Название поля | Тип | Описание |
|---|---|---|
|
ULONG | Номер |
Rec_len |
USHORT | Длина этой записи |
Name_len |
USHORT | Длина имени файла |
Name |
CHAR[0] | Имя файла |
Использование записей переменной длины позволяет использовать длинные имена файлов без пустой траты дискового пространства. Отдельная запись в каталоге не может пересекать
Система адресации данных - это одна из самых существенных составных частей файловой системы. Именно система адресации позволяет находить нужный файл среди множества как пустых, так и занятых блоков на диске. В ext2fs система адресации реализуется полем i_block
Поле i_block в EXT2_NDIR_BLOCKS [12] ) представляют собой прямые ссылки (адреса) на номера блоков, в которых хранятся данные из файла. Следующий адрес в этом массиве ( EXT2_IND_BLOCK ) является косвенной ссылкой, т. е. адресом блока, в котором хранится список адресов следующих блоков с данными из этого файла. В этом блоке могут быть записаны адреса ( размер_блока / размер_ULONG ) блоков с данными файла.
Следующий адрес в поле i_block EXT2_DIND_BLOCK ) указывает на блок двойной косвенной адресации (double
И, наконец, последний адрес ( EXT2_TIND_BLOCK ) в поле i_block
Теперь вы знаете, как устроены ext2fs осуществляется запись в файл и чтение из файла.
Может быть здесь еще надо бы рассказать о команде mkfs, которая служит для создания файловой системы в разделе диска. Но вкратце мы ее рассмотрели в лекции 4, а за более подробными пояснениями читатель может обратиться к интерактивным руководствам.
До сих пор наш рассказ о файловой системе касался только "статических", если можно так выразиться, составных частей файловой системы. Но, я думаю, вы понимаете, что все это хозяйство обслуживается какими-то программными модулями. Эти программные части можно разделить на две составных части. Одна часть входит в состав ядра и образует так называемую виртуальную файловую систему (VFS). VFS обеспечивает унифицированный программный интерфейс к услугам файловой системы, причем безотносительно к тому, какой тип файловой системы ( , ext2fs, nfs и т. д.) имеется на конкретном физическом носителе. Поэтому каждая файловая система должна предоставлять еще какие-то конкретные процедуры доступа к своим файлам, для того, чтобы использоваться под Linux.
Файловая система ext2fs была создана по образу и подобию файловой системы UNIX (UNIX File System -
Существуют две основных проблемы этого рода.
Во-первых, эти структуры не способны работать с носителями информации увеличенного объема. В них отведено строго фиксированное число бит для хранения данных о размере дисковых разделов и размерах файлов, фиксированное число бит для хранения логических номеров блоков и т. д. . Как следствие, число файлов и каталогов и их размер ограничены.
Вторая проблема связана с производительностью. В силу заложенных в старые файловые системы алгоритмов решение некоторых задач стало требовать слишком большого времени на носителях увеличенного объема. Одним из самых характерных примеров такого рода проблем является трудоемкость восстановления файловой системы после сбоев (например, после неожиданного отключения питания). Это восстановление выполняется с помощью программы fsck, и для очень больших дисков стало требовать нескольких часов.
Естественно, что появление этих проблем породило и попытки их решения. Были разработаны новые типы файловых систем, при создании которых учитывались требования масштабируемости. Наиболее известными разработками файловых систем новых типов являются:
ext3fs ;XFS ;JFS фирмы IBM;ReiserFS.В табл.16.8 приведены данные по увеличению основных параметров, обеспечиваемых новыми файловыми системами. Данные заимствованы из статьи Juan I. Santos Florido "Journal File Systems", опубликованной в 55-ом выпуске Linux Gazette (July 2000).
| Размер блока | Максимальный размер файловой системы | Максимальный размер файла | |
|---|---|---|---|
Ext3FS |
1-4 Кбайт | 4 Tбайт | 2 Гбайт |
XFS |
от 512 байт до 64 Кбайт | 18 тысяч |
9 тысяч |
JFS |
512, 1024, 2048, 4096 байт | от 4 |
От 512 Тбайт (при 512-байтовых блоках) До 4 |
ReiserFS |
До 64 Кбайт (пока что фиксирован, 4 Кбайт) | 4 Гбайт блоков, 16 Тбайт | 4 Гбайт, 210 |
Основная цель, которая преследуется при создании журналируемых файловых систем, состоит в том, чтобы обеспечить быстрое восстановление системы после сбоев (например, после потери питания). Дело в том, что если произойдет такой сбой, то часть информации о расположении файлов теряется, поскольку не все изменения сразу записываются на диск. После этого программа fsck вынуждена просматривать весь диск блок за блоком (пользуясь битовыми матрицами занятых блоков и
В журналируемых файловых системах для решения этой проблемы применяют технику транзакций, развитую в теории баз данных. Суть этой техники в том, что действие не считается завершенным, пока все изменения не сохранены на диске. А чтобы сбои, происходящие в течение времени, необходимого для завершения всех операций, не приводили к необратимым последствиям, все действия и все изменяемые данные протоколируются. Если сбой все-таки произойдет, то по этому протоколу можно вернуть систему в безошибочное состояние.
Главное отличие в технике транзакций, применяемой в базах данных, от аналогичной техники, применяемой в журналируемых файловых системах, состоит в том, что в базах данных сохраняются в протоколе как сами изменяемые данные, так и вся управляющая информация, в то время как понятие транзакции в файловых системах подразумевает сохранение только мета-данных:
Файловые системы ext3fs и JFS являются журналируемыми. Надо отметить, что ext3fs не является совершенно новой разработкой, а является просто надстройкой над ext2fs, обеспечивающей ведение журнала и организацию транзакций. Файловые системы XFS и JFS являются открытыми версиями коммерческих файловых систем.
Кроме проблемы быстрого восстановления после сбоев, в файловой системе ext2fs имеется еще несколько нерешенных проблем.
Одна из самых насущных - это проблема нерационального использования дискового пространства. Конечно, ext2fs использует диск гораздо более рационально, чем FAT, но, как вам хорошо известно, "памяти много не бывает"!
Собственно проблема возникает из-за следующего противоречия:
Еще две проблемы, с которыми мы сталкиваемся в файловой системе ext2fs, связаны с поиском. Первая проблема возникает при записи на диск нового файла. Поскольку распределение свободных блоков хранится в виде битовой карты свободных блоков и свободных
Вторая проблема поиска связана с поиском файлов в больших каталогах. Поскольку файлы мы ищем по именам, приходится последовательно просматривать все записи в каталоге. Время такого поиска тоже пропорционально размеру каталога и вырастает в проблему при больших размерах каталогов.
Между тем методы снижения трудоемкости поиска давно разработаны, только надо для хранения информации о свободных объектах использовать не простые списки, а несколько более сложные структуры данных. В системе ReiserFS для этого применяются так называемые "сбалансированные деревья" или "B+Trees", время поиска в которых пропорционально не количеству объектов (файлов в каталоге или числа блоков на диске), а логарифму этого числа. В сбалансированном дереве все ветви (пути от корня до "листа") имеют одинаковую (или примерно одинаковую) длину. ReiserFS использует сбалансированные деревья для хранения всех объектов файловой системы: файлов в каталогах, данных о свободных блоках и т. д. Это позволяет существенно повысить производительность обращения к дискам.
Кроме того, ReiserFS является журналируемой, т. е. в ней решена и проблема быстрого восстановления после сбоев.
Я привел в данной лекции только самые поверхностные данные о новых типах файловых систем, поскольку статей о них пока опубликовано довольно мало. Тем не менее, за время подготовки книги некоторая дополнительная информация появилась, так что если вас этот вопрос интересует, поищите сведения в Интернете.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.