> man operating_systems
Дисковая структура ReiserFS
на Понедельник, 31 Октябрь 2005, 12:48
добавил: Пешеходов А. П. aka fresco список авторов печатать элемент контента создать pdf-файл  элемент контента
категория Статьи
комментарии: 0
просмотров: 5191


Direct items

Прямые записи содержат либо весь маленький файл, либо “хвост” большого файла. Для маленьких файлов вся другая информация может быть найдена (через заголовок записи) в stat-item для данного файла.

Indirect items

Косвенные записи содержат указатели на неформатированне блоки, принадлежащие файлу. Каждый указатель – 4-хбайтное число, содержащее номер блока. Косвенная запись, занимающая весь лист дерева, может содержать (blocksize-48)/4 указателей (48 байт идут на заголовки блока и записи). большие файлы могут потребовать нескольких косвенных записей (различаемых по полю offset в ключе) плюс “хвост”.

Журнал

Журнал в reiserfs имеет фиксированный размер: для реализации в Linux2.4.x – это 8192 блоков + 1 блок для заголовка журнала. Журнал состоит из транзакций переменной длины и заголовка журнала. Он начинается списком транзакций, а заканчивается заголовком. Транзакция охватывает по крайней мере 3 дисковых блока и заголовок журнала, занимающий в точности один блок. Журнал реализован в виде кольцевого буфера.

Принято считать, что reiserfs журналирует только метаданные. Это не совсем верно. Не смотря на то, что целью журналирования является сохранение целостности метаданных, reiserfs журналирует некоторые дисковые блоки, т.к. они должны появиться в файловой системе лишь после успешной модификации метаданных, и записывать их прямо на диск до завершения транзакции нельзя. Таким образом каталоги, stat data и маленькие файлы, хранящиеся прямо в листьях дерева, также могут попасть в журнал и будут использованы для реконструкции файловой системы.

Заголовок журнала

Заголовок журнала – целый блок, описывающий, где в журнале находится первая несброшенная (unflushed) транзакция. Он занимает последний блок в журнале и содержит только 12 байт данных – остальная часть блока неопределена.

См. include/linux/reiserfs_fs.h

struct reiserfs_journal_header {
 __le32 j_last_flush_trans_id; /* ID последней удачно завершенной транзакции */
 __le32 j_first_unflushed_offset; /* Смещение (в блоках) следующей транзакции
        в журнале (с нее будет начато восстановление ФС в случае сбоя) */
 __le32 j_mount_id; /* Mount ID последней завершенной транзакции */
 struct journal_params jh_journal; 
};


Структура jh_journal, очевидно, хранит копию параметров журнала из суперблока.

Транзакция, на которую указывает поле offset, должна иметь больший trans ID или mount ID, чем завершенная транзакция, что бы быть обработанной как несброшенная. В противном случае все транзакции объявляются завершенными, а блок, адресуемый по offset, используется для начала записи новой транзакции.

Транзакции

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

Транзакция состоит из дескриптора, массива блоков и завершающего блока в конце. Все эти блоки смежны в пределах журнала.

Дескриптор транзакции

См. include/linux/reiser_fs_fs.h

struct reiserfs_journal_desc {
 __le32 j_trans_id; /* ID транзакции */
 __le32 j_len; /* Длина транзакции в блоках. len+1 – завершающий блок */
 __le32 j_mount_id; /* Mount ID транзакции */
 __le32 j_realblock[1]; /* Отображение на реальные координаты для каждого блока */
};


В конце дескриптора также записывается magic string – "ReIsErLB".

Отображение блоков означает следующее: поле j_realblock представляет собой массив, содержащий для каждого блока транзакции номер соотвествующего блока файловой системы. Если места в дескрипторе транзакции не хватает для отображения всех ее блоков, дополнительно используется завершающий блок. Таким образом, максимальный размер транзакции ограничен 2*(blocksize-21)/4 блоками, однако в действительност этот предел установлен в суперблоке.

Завершающий блок

Завершающий транзакцию блок содержит копию ID транзакции и ее длину.

См. include/linux/reiser_fs_fs.h

struct reiserfs_journal_commit {
 __le32 j_trans_id; /* Transaction ID */
 __le32 j_len; /* Длина транзакции */
 __le32 j_realblock[1];
};


Аналогичные по тематике переводы и статьи можно найти на fresco.front.ru.

индекс статьи
страница 1 : страница без заголовка
страница 2 : страница без заголовка
страница 3 : страница без заголовка
страница 4 - текущая : страница без заголовка


Комментарии доступны только авторизованным пользователям, авторизуйтесь или зарегистрируйтесь на сайте здесь

© OSRC.info, 2004-2010.
Авторские права на любые материалы, авторы которых явно указаны, принадлежат их авторам. По вопросам публикации таких материалов обращайтесь к авторам.
Авторские права на любые другие материалы принадлежат OSRC.info.
Сайт является помещением библиотеки. Копирование, сохранение на жестком диске или иной способ сохранения произведений осуществляются пользователями на свой риск.
При использовании материалов сайта ссылка на OSRC.info обязательна.