Контакты

Файловая система ext2. Как в среде Windows получить доступ к файловым системам Ext2, Ext3, Ext4. Логическая организация ext2

Если у вас установлено две операционные системы, Windows и Linux, то наверняка вы хотели бы , содержащимся на разделах свободной операционной системы прямо из- под Windows, не перезагружая компьютер.

К сожалению, поддержка разделов ОС Linux в Windows не предусмотрена. А зря. Как мне кажется, это могло бы стать красивым жестом со стороны Microsoft.

Суть проблемы заключается в том, что Windows использует файловую систему NTFS, а Linux обладает своим способом организации файлов, extended file system, последняя версия которого имеет порядковый номер 4.

Linux более дружелюбна к своим пользователям нежели ее коммерческая сестра: в Linux по умолчанию предусмотрена поддержка файловой системы Windows NTFS. Конечно, установить Linux на с разделом в NTFS вам не удастся, но прочитать и записать данные с такого вы сможете.

Ext2 IFS

Ext2 IFS поддерживает Windows NT4.0/2000/XP/2003/Vista/2008 версий x86 и x64 и позволяет просматривать содержимое разделов Linux ext2, а также может производить запись на них. Утилита устанавливает системный драйвер ext2fs.sys, который расширяет возможности Windows и включает полную поддержку ext2 в ней: разделам ext2 присваиваются буквы дисков, а файлы и папки на них отображаются в диалогах всех приложений, например, в проводнике.

Ext2 FSD

Ext2 FSD – бесплатный драйвер для систем Windows (2K/XP/VISTA/7 версий x86 и x64). Как и предыдущая утилита, которая по своей сути тоже является драйвером, включает полную поддержку файловой системы ext2 в Windows.

LTOOLS – набор утилит командной строки, позволяющий читать и записывать данные на/с разделов Linux ext2, ext3 и ReiserFS (стандартные файловые системы Linux) с машины под управлением DOS или Windows.

Существует версия программы с графической оболочкой (написана на Java) – LTOOLSgui, а также версия с графической оболочкой, написанной на .

Ext2Read

На десерт как всегда самое вкусное.

Ext2Read – утилита, устроенная по типу файл менеджера, которая позволяет как просматривать, так и осуществлять запись на разделы ext2/ext3/ext4. Поддерживает LVM2 и, что отличает ее от других программ этого обзора, файловую систему ext4. Встроена поддержка рекурсивного копирования директорий.

А вот и второй десерт. Вначале было сказано, что неплохим жестом со стороны Microsoft было бы включить поддержку Linux разделов в Windows по умолчанию.

Жест все же был сделан на 20-летие Linux. Смотрите сами.

На этом все. Спасибо за внимание. Пойду отбиваться от майских жуков. Их этой весной ооочень много. 🙂

14 Июн

Файловые системы ext2, ext3, XFS, ReiserFS, NTFS

Файловая система - это порядок, определяющий способ организации, хранения и именования данных на любых электронных носителях информации в компьютерах.

Разнообразие файловых систем объясняется тем, что каждая была придумана под свой определённый пакет задач. Одни очень быстро записывают небольшие файлы (скажем, до 1ГБ), но при этом плохо взаимодействуют с большими файлами или вообще с ними не работают. Одни хороши с точки зрения безопасности, другие с точки зрения скорости записи/считывания. Каждая файловая система имеет свои плюсы, минусы, уязвимости и отличительные возможности.

В Linux наиболее часто используются следующие разновидности файловых систем:

  1. ext2 — расшифровывается как Second Extended File System (вторая расширенная файловая система). Разработана Реми Кардом в 1993 году как файловая система ядра Linux, в период с 1993-2001 год являлась основной файловой системой Linux .
    Достоинством является высокая скорость чтения/записи.
    Главным недостатком системы ext2 является то, что она не является журналируемой, но именно благодаря этому обладает большой производительностью (журналирование — это процесс ведения журнала, хранящего список изменений помогающего сохранить целостность файловой системы при различных сбоях системы);
  2. ext3 — расшифровывается как Third Extended File System (третья версия расширенной файловой системы). Разработана Стивеном Твиди в 2001 году, используется по сей день в дистрибутивах Linux . Появилась на свет как усовершенствованная ext2 .
    Достоинством данной системы является то, что она журналируемая, то есть её надёжность повышается в разы по сравнению с ext2 .
    Недостатком можно назвать чуть меньшую производительность и скорость чтения/записи.
  3. XFS — Разработана компанией Silicon Graphics в 1993 году, была добавлена в ядро Linux как файловая система в 2002 году во всё семейство дистрибутивов Linux , на данный момент используется как «родная» в дистрибутиве Red Hat .
    Достоинством является наличие журналирования метаданных, высокая стабильность работы, поддерживается распределение потоков ввода/вывода по группам, большая скорость чтения/записи, есть возможность дефрагментации даже при смонтированном разделе и можно увеличить объём размер файловой системы. Наиболее эффективно работает с крупными файлами.
    Недостатком является то, что размер раздела нельзя уменьшить, обработка метаданных процесс не такой уж и быстрый, работает заметно медленнее с небольшими файлами, чем другие виды файловых систем.
  4. ReiserFS — разработана компанией Namesys под руководством Ганса Райзера в 2001 году. Используется только на операционных системах Linux . Была первой журналируемой файловой системой, которую приняли в ядро.
    Достоинством данной файловой системы является то, что она очень быстро работает с небольшими файлами (скорость чтения/записи выше, чем у семейства ext4 ), поддерживает журналирование.
    Недостатком является то, что её развитие заметно замедлилось из-за ареста руководителя Ганса Райзера и отсутствует фоновое шифрование.
  5. NTFS — расшифровывается как new technology file system (файловая система новой технологии). Разработана в июле 1993 года корпорацией Microsoft . Широко используется в различных операционных системах, а также в различных носителях информации.
    Достоинством является встроенная возможность разграничивать доступ к данным для различных пользователей, а также назначать ограничения на максимальный объём дискового пространства, использование системы журналирования, высокая скорость чтения/записи небольших файлов.
    Недостатком является, то, что для стабильной работы необходима не маленькая оперативная память ПК, с крупными файлами работает медленно, ограничена длина пути к файлам (32 767 символов Юникода).

Таким нехитрым образом мы разобрались с «файловые системы ext2 , ext3 , XFS , ReiserFS , NTFS «!

Как в среде Windows сделать возможным доступ к разделу диска или съёмному носителю с файловыми системами Ext2/3/4 ? Если, к примеру, на компьютере есть ещё и вторая система Linux . И с её данными необходимо поработать из среды Windows . Или другой пример – когда внутри Windows смонтированы виртуальные диски с установленными на виртуальные машины системами Linux или Android . С Ext2/3/4 Windows нативно не умеет работать, ей для этого нужны сторонние средства. Что это за средства? Рассмотрим ниже таковые.

***
Тройка первых средств сделает возможным только чтение устройств информации с Ext2/3/4 . Последнее решение позволит и читать, и записывать данные. Все рассмотренные ниже средства бесплатны.

1. Программа DiskInternals Linux Reader

Простенькая программка – это примитивный файловый менеджер, сделанный по типу штатного проводника Windows, с поддержкой файловых систем Ext 2/3/4 , Reiser4 , HFS , UFS2 . В окне программы увидим разделы и устройства с Linux или Android .

Для копирования необходимо выделить папку или файл, нажать кнопку «Save» .

Затем указать путь копирования.

2. Плагин для Total Commander DiskInternals Reader

Любители популярного могут извлекать данные Linux или Android внутри Windows с помощью этого файлового менеджера. Но предварительно установив в него специальный плагин. Один из таких плагинов — , он умеет подключать и читать устройства информации, форматированные в Ext2/3/4 , Fat/exFAT , HFS/HFS+ , ReiserFS . Загружаем плагин, распаковываем его архив внутри , подтверждаем установку.

Запускаем (важно) от имени администратора. Заходим в раздел . Нажимаем .

Здесь, наряду с прочими разделами диска и носителями, будет отображаться тот, что с Ext2/3/4 .

Данные копируются традиционным для способом – клавишей F5 на вторую панель.

3. Плагин для Total Commander ext4tc

Упрощённая альтернатива предыдущему решениюext4tc , ещё один плагин для . Он может подключать для чтения устройства информации, форматированные только в Ext2/3/4 . Скачиваем плагин, распаковываем его архив внутри файлового менеджера, запускаем установку.

Запускаем (важно) от имени администратора. Кликаем . Заходим в .

При необходимости копирования данных используем обычный способ с клавишей F5 .

4. Драйвер поддержки Ext2Fsd

Программа Ext2Fsd – это драйвер Ext2/3/4 , он реализует поддержку этих файловых систем на уровне операционной системы. С разделами диска и накопителями, форматированными в эти файловые системы, можно работать как с обычными, поддерживаемыми Windows устройствами информации в окне проводника или сторонних программ. Драйвер позволяет и считывать, и записывать данные.

Скачиваем последнюю актуальную версию Ext2Fsd .

При установке активируем (если для длительной работы) три предлагаемых чекбокса:

1 — Автозапуск драйвера вместе с Windows;
2 — Поддержка записи для Ext2 ;
3 — Поддержка форматирования для Ext3 .

На предфинишном этапе активируем опцию запуска окошка диспетчера драйвера — — с попутным присвоением устройствам информации с Ext2/3/4 буквы диска.

В окошке открывшегося увидим носитель с уже присвоенной буквой. Например, в нашем случае носителю с Ext4 задана первая свободная буква F .

Теперь можем работать с диском F в окне проводника.

Присвоить букву новым подключаемым устройствам с Ext2/3/4 можно с помощью контекстного меню, вызываемого на каждом из отображаемых в окне устройств. Но просто при присвоении буквы диска такое устройство не будет отображаться после перезагрузки Windows, это решение только для одного сеанса работы с компьютером. Чтобы сделать новое устройство с Ext2/3/4 постоянно видимым в среде Windows, необходимо двойным кликом по нему открыть настроечное окошко и установить постоянные параметры подключения. Во второй графе нужно:

Для съёмных носителей активировать чекбокс, обозначенный на скриншоте цифрой 1, и указать букву диска;
Для внутренних дисков и разделов активировать чекбокс, обозначенный на скриншоте ниже цифрой 2, и также указать букву диска.

(Second Extended File System).

· Истоpия pазвития файловых систем Linux

· Структура дискового раздела в ext2fs

·

· Каталоги

· Файлы устройств

·

·

· Библиотека EXT2fs

· Сpедства системы EXT2fs

· Вычисление пpоизводительности

Матфак

Прогр.Обеспеч.

2-й курс 5-я гр.

Чичиров Андрей

Фаловаясистема EXT2fs (Second Extended File System).

Истоpия pазвития файловых систем Linux

Пеpвые веpсии Linux были pазpаботаны на базе опеpационной системы Minix. Было бы пpоще pазделить диски между двумя системами, чем pазpаботать новую файловую систему, поэтому Linus Torvalds pешил ввести поддеpжку в Linux файловой системы Minix. В то вpемя эта файловая система была достаточно эффективным пpогpаммным пpодуктом с относительно небольшим количеством ошибок.

Однако огpаничения, связанные со стpуктуpой файловой системы Minix, были довольно высоки, поэтому стали задумываться над pазpаботкой новой файловой системы для Linux.

Для упpощения внедpения новой файловой системы в ядpо Linux, была pазpаботана виpтуальная файловая система (VFS). Пеpвоначально VFS была написана Chris Provenzano, а затем пеpеписана Linus Torvalds пеpед ее интегpацией в ядpо.

После установки в ядpо VFS, в апpеле 1992 года была pазpаботана новая фаловая система EXTfs (Extended File System) и добавлена в веpсию Linux 0.96c. В новой файловой системе были сняты два существенных огpаничения системы Minix: ее максимальный объем мог достигать 2 гигабайт, а максимальная длина имени файла - 255 символов. Это было достижением по сpавнению с файловой системой Minix, хотя некотоpые пpоблемы все еще пpисутствовали. Не было поддеpжки pаздельного доступа, модификации индексного дескpиптоpа и модификации ячеек вpемени изменения файла. Эта файловая система использовала связанные списки для опеpиpования свободными блоками и индексными дескpиптоpами, что сильно влияло на пpоизводительность системы: со вpеменем списки становились неупоpядоченными и pазсоpтиpованными, что пpиводило к фpагментиpованию файловой системы.

Решением этих пpоблем явился выпуск в янваpе 1993 года альфа-веpсий двух новых файловых систем: Xia и EXT2fs (Second Extended File System). По большей части, файловая система Xia была основана на Minix c добавлением нескольких новых возможностей. В основном это было возможность pаботы с длинными именами файлов, поддеpжка дисковых pазделов большего объема и поддеpжка тpех ячеек вpемени изменения файла. С дpугой стоpоны, EXT2fs была основана на EXTfs с множеством улучшений и дополнений. Она также имела возможности для будущего pазвития.

Когда были выпущены эти две файловые системы, функционально они были пpиблизительно pавны. Система Xia была более надежна, чем EXT2fs, за счет ее минимизации. По меpе их более шиpокого пpименения были обнаpужены ошибки в системе EXT2fs, и добавлено большое количество новых возможностей и улучшений. В настоящее вpемя файловая система EXT2fs является очень надежной и стала стандаpтом де-факто файловой системы Linux.

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

Minix FS

Ext FS

Ext2 FS

Xia FS

Максимальный объем файловой системы

Максимальная длина файла

Максимальная длина имени файла

Поддеpжка тpех ячеек вpемени изменения файла

Возможность pасшиpения

Изменяемый pазмеp блока

Защита инфоpмации

Пpи необходимости длина имени файла в Ext 2 может быть увеличена до 1012.

EXT2fs pезеpвиpует некотоpое количество блоков для пользователя root. Обычно это 5 % от общего количества, что позволяет системному администpатоpу избегать нехватки объема жесткого диска пpи его заполнении pаботой пpоцессов дpугих пользователей.

Структура дискового раздела в ext2fs

Производители жестких дисков обычно поставляют свои изделия отформатированными на низком уровне. Насколько я знаю, это означает, что все дисковое пространство с помощью специальных меток разбито на "сектора", размером 512 байт. Такой диск (или дисковый раздел) должен быть подготовлен для использования в определенной операционной системе. В MS-DOS или Windows процедура подготовки называется форматированием, а в Линукс - созданием файловой системы. Создание файловой системы ext2fs заключается в создании в разделе диска определенной логической структуры. Эта структура строится следующим образом. Во-первых, на диске выделяется загрузочная область. Загрузочная область создается в любой файловой системе. На первичном разделе она содержит загрузочную запись - фрагмент кода, который инициирует процесс загрузки операционной системы при запуске. На других разделах эта область не используется. Все остальное пространство на диске делится на блоки. Блок может иметь размер от 1, 2 или 4 килобайта. Блок является адресуемой единицей дискового пространства. Выделение места файлам осуществляется целыми блоками, поэтому при выборе размера блока приходится идти на компромисс. Большой размер блока, как правило, сокращает число обращений к диску при чтении или записи файла, но зато увеличивает долю нерационально используемого пространства, особенно, при наличии большого числа файлов маленького размера.

Блоки, в свою область объединяются в группы блоков. Группы блоков в файловой системе и блоки внутри группы нумеруются последовательно, начиная с 1. Первый блок на диске имеет номер 1 и принадлежит группе с номером 1. Общее число блоков на диске (в разделе диска) является делителем объема диска, выраженного в секторах. А число групп блоков не обязано делить число блоков, потому что последняя группа блоков может быть не полной. Начало каждой группы блоков имеет адрес, который может быть получен как ((номер группы - 1)* (число блоков в группе)).

Каждая группа блоков имеет одинаковое строение. Ее структура представлена в следующей табличке.

Структура группы блоков дискового раздела в ext2fs

Первый элемент этой структуры (суперблок) - одинаков для всех групп, а все остальные - индивидуальны для каждой группы. Суперблок хранится в первом блоке каждой группы блоков (за исключением группы 1, в которой в первом блоке расположена загрузочная запись). Суперблок является начальной точкой файловой системы. Он имеет размер 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

Число индексных дескрипторов (inodes) в каждой группе блоков

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

Версия (revision level) файловой системы .

s_reserved

ULONG

Заполнение до 1024 байт

Вслед за суперблоком расположено описание группы блоков (Group Descriptors). Это описание представляет собой массив, имеющий следующую структуру.

Название поля

Тип

Назначение

bg_block_bitmap

ULONG

Адрес блока, содержащего битовую карту блоков (block bitmap) данной группы

bg_inode_bitmap

ULONG

Адрес блока, содержащего битовую карту индексных дескрипторов (inode bitmap) данной группы

bg_inode_table

ULONG

Адрес блока, содержащего таблицу индексных дескрипторов (inode table) данной группы

bg_free_blocks_count

USHORT

Счетчик числа свободных блоков в данной группе

bg_free_inodes_count

USHORT

Число свободных индексных дескрипторов в данной группе

bg_used_dirs_count

USHORT

Число индексных дескрипторов в данной группе, которые являются каталогами

bg_pad

USHORT

Заполнение

bg_reserved

ULONG

Заполнение

Размер описания группы блоков можно вычислить как (размер_группы_блоков_в_ext2 * число_групп) / размер_блока (при необходимости округляем).

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

Битовая карта блоков (block bitmap) - это структура, каждый бит которой показывает, отведен ли соответствующий ему блок какому-либо файлу. Если бит равен 1, то блок занят. Эта карта служит для поиска свободных блоков в тех случаях, когда надо выделить место под файл, Битовая карта блоков занимает число блоков, равное (число_блоков_в_группе / 8) / размер_блока (при необходимости округляем).

Битовая карта индексных дескрипторов выполняет аналогичную функцию по отношению к таблице индексных дескрипторов: показывает какие именно дескрипторы заняты.

Следующая область в структуре группы блоков служит для хранения таблицы индексных дескрипторов файлов. Структура самого индексного дескриптора подробнее рассматривается в следующем подразделе.

Ну, и наконец, все оставшееся место в группе блоков отводится для хранения собственно файлов.

Файловая система Ext 2 характеризуется:

  • иерархической структурой,
  • согласованной обработкой массивов данных,
  • динамическим расширением файлов,
  • защитой информации в файлах,
  • трактовкой периферийных устройств (таких как терминалы и ленточные устройства) как файлов.

Внутреннее представление файлов

Каждый файл в системе Ext 2 имеет уникальный индекс. Индекс содержит информацию, необходимую любому процессу для того, чтобы обратиться к файлу. Процессы обращаются к файлам, используя четко определенный набор системных вызовов и идентифицируя файл строкой символов, выступающих в качестве составного имени файла. Каждое составное имя однозначно определяет файл, благодаря чему ядро системы преобразует это имя в индекс файла.Индекс включает в себя таблицу адресов расположения информации файла на диске. Так как каждый блок на диске адресуется по своему номеру, в этой таблице хранится совокупность номеров дисковых блоков. В целях повышения гибкости ядро присоединяет к файлу по одному блоку, позволяя информации файла быть разбросанной по всей файловой системе. Но такая схема размещения усложняет задачу поиска данных. Таблица адресов содержит список номеров блоков, содержащих принадлежащую файлу информацию, однако простые вычисления показывают, что линейным списком блоков файла в индексе трудно управлять. Для того, чтобы небольшая структура индекса позволяла работать с большими файлами, таблица адресов дисковых блоков приводится в соответствие со структурой показанной на Рисунке 1

Большинство файлов в системе Ext 2 имеет размер, не превышающий 10 Кбайт и даже 1 Кбайта!Поскольку 10 Кбайт файла располагаются в блоках прямой адресации, к большей части данных, хранящихся в файлах, доступ может производиться за одно обращение к диску. Поэтому в отличие от обращения к большим файлам, работа с файлами стандартного размера протекает быстро.

Индексные дескрипторы файлов

Каждому файлу на диске соответствует один и только один индексный дескриптор файла, который идентифицируется своим порядковым номером - индексом файла. Это означает, что число файлов, которые могут быть созданы в файловой системе, ограничено числом индексных дескрипторов, которое либо явно задается при создании файловой системы, либо вычисляется исходя из физического объема дискового раздела. Индексные дескpиптоpы существуют на диске в статической форме и ядро считывает их в память прежде, чем начать с ними работать.

Индексный дескриптор файла имеет следующее строение:

Название поля

Тип

Описание

I_mode

USHORT

Тип и права доступа к данному файлу.

I_uid

USHORT

Идентификатор владельца файла (Owner Uid).

I_size

ULONG

Размер файла в байтах.

I_atime

ULONG

Время последнего обращения к файлу (Access time).

I_ctime

ULONG

Время создания файла.

I_mtime

ULONG

Время последней модификации файла.

I_dtime

ULONG

Время удаления файла.

I_gid

USHORT

Идентификатор группы (GID).

I_links_count

USHORT

Счетчик числа связей (Links count).

I_blocks

ULONG

Число блоков, занимаемых файлом.

I_flags

ULONG

Флаги файла (File flags)

I_reserved1

ULONG

Зарезервировано для ОС

I_block

ULONG

Указатели на блоки, в которых записаны данные файла (пример прямой и косвенной адресации на рис.1)

I_version

ULONG

Версия файла (для NFS)

I_file_acl

ULONG

ACL файла

I_dir_acl

ULONG

ACL каталога

I_faddr

ULONG

Адрес фрагмента (Fragment address)

I_frag

UCHAR

Номер фрагмента (Fragment number)

I_fsize

UCHAR

Размер фрагмента (Fragment size)

I_pad1

USHORT

Заполнение

I_reserved2

ULONG

Зарезервировано

Поле типа и прав доступа к файлу представляет собой двух-байтовое слово, каждый бит которого служит флагом, индицирующим отношение файла к определенному типу или установку одного конкретного права на файл.

Идентификатор

Значение

Назначение флага (поля)

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

Именованный канал (fifo)

S_ISUID

0800

SUID - бит смены владельца

S_ISGID

0400

SGID - бит смены группы

S_ISVTX

0200

Бит сохранения задачи (sticky bit)

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

Индексный дескриптор, в котором перечислены адреса дефектных блоков на диске (Bad blocks inode)

EXT2_ROOT_INO

Индексный дескриптор корневого каталога файловой системы (Root inode)

EXT2_ACL_IDX_INO

ACL inode

EXT2_ACL_DATA_INO

ACL inode

EXT2_BOOT_LOADER_INO

Индексный дескриптор загрузчика (Boot loader inode)

EXT2_UNDEL_DIR_INO

Undelete directory inode

EXT2_FIRST_INO

Первый незарезервированный индексный дескриптор

Самый важный дескриптор в этом списке - дескриптор корневого каталога. Этот дескриптор указывает на корневой каталог, который, подобно всем каталогам, состоит из записей следущей структуры:

Название поля

Тип

Описание

Inode

ULONG

номер индексного дескриптора (индекс) файла

rec_len

USHORT

Длина этой записи

name_len

USHORT

Длина имени файла

Name

CHAR

Имя файла

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

Рисунок 1 Блоки прямой и косвенной адресации в индексе

Рисунок 2 Объем файла в байтах при размере блока 1 Кбайт

Рисунок 3. Пример дискового индекса

На Рисунке 3 показан дисковый индекс некоторого файла. Этот индекс принадлежит обычному файлу, владелец которого - "mjb" и размер которого 6030 байт. Система разрешает пользователю "mjb" производить чтение, запись и исполнение файла; членам группы "os" и всем остальным пользователям разрешается только читать или исполнять файл, но не записывать в него данные. Последний раз файл был прочитан 23 октября 1984 года в 13:45, запись последний раз производилась 22 октября 1984 года в 10:30. Индекс изменялся последний раз 23 октября 1984 года в 13:30, хотя никакая информация в это время в файл не записывалась. Ядро кодирует все вышеперечисленные данные в индексе. Обратите внимание на различие в записи на диск содержимого индекса и содержимого файла. Содержимое файла меняется только тогда, когда в файл производится запись. Содержимое индекса меняется как при изменении содержимого файла, так и при изменении владельца файла, прав доступа и набора указателей. Изменение содержимого файла автоматически вызывает коррекцию индекса, однако коррекция индекса еще не означает изменения содержимого файла.

Каталоги

Каталоги являются файлами, из которых строится иерархическая структура файловой системы; они играют важную роль в превращении имени файла в номер индекса. Каталог - это файл, содержимым которого является набор записей, состоящих из номера индекса и имени файла, включенного в каталог. Составное имя - это строка символов, завершающаяся пустым символом и разделяемая наклонной чертой ("/") на несколько компонент. Каждая компонента, кроме последней, должна быть именем каталога, но последняя компонента может быть именем файла, не являющегося каталогом. В версии V системы UNIX длина каждой компоненты ограничивается 14 символами; таким образом, вместе с 2 байтами, отводимыми на номер индекса, размер записи каталога составляет 16 байт.

Смещение в байтах
внутри каталога

Номер индекса
(2 байта)

Имя файла

1798

init

1276

fsck

clri

1268

motd

1799

mount

mknod

2114

passwd

1717

umount

1851

checklist

fsdbld

config

1432

getty

crash

mkfs

Рисунок 4 Формат каталога /etc

На Рисунке 4 показан формат каталога "etc". В каждом каталоге имеются файлы, в качестве имен которых указаны точка и две точки ("." и "..") и номера индексов у которых совпадают с номерами индексов данного каталога и родительского каталога, соответственно. Номер индекса для файла "." в каталоге "/etc" имеет адрес со смещением 0 и значение 83. Номер индекса для файла ".." имеет адрес со смещением 16 от начала каталога и значение 2. Записи в каталоге могут быть пустыми, при этом номер индекса равен 0. Например, запись с адресом 224 в каталоге "/etc" пустая, несмотря на то, что она когда-то содержала точку входа для файла с именем "crash". Программа mkfs инициализирует файловую систему таким образом, что номера индексов для файлов "." и ".." в корневом каталоге совпадают с номером корневого индекса файловой системы.

Ядро хранит данные в каталоге так же, как оно это делает в файле обычного типа, используя индексную структуру и блоки с уровнями прямой и косвенной адресации. Процессы могут читать данные из каталогов таким же образом, как они читают обычные файлы, однако исключительное право записи в каталог резервируется ядром, благодаря чему обеспечивается правильность структуры каталога. Права доступа к каталогу имеют следующий смысл: право чтения дает процессам возможность читать данные из каталога; право записи позволяет процессу создавать новые записи в каталоге или удалять старые (с помощью системных операций creat, mknod, link и unlink), в результате чего изменяется содержимое каталога; право исполнения позволяет процессу производить поиск в каталоге по имени файла (поскольку "исполнять" каталог бессмысленно).

Когда какой-либо пpоцесс использует путь к файлу, ядpо ищет в каталогах соответствующий номеp индексного дескpиптоpа. После того, как имя файла было пpеобpазовано в номеp индексного дескpиптоpа, этот дескpиптоp помещается в память и затем используется в последующих запpосах.

Концепция файловых систем Unix включает в себя понятие ссылки. Один индексный дескpиптоp может быть связан с несколькими именами файлов. Дескpиптоp содеpжит поле, хpанящее число, с котоpым ассоцииpуется файл. Добавление ссылки заключается в создании записи каталога, где номеp индексного дескpиптоpа указывает на дpугой дескpиптоp, и увеличении счетчика ссылок в дескpиптоpе. Пpи удалении ссылки ядpо уменьшает счетчик ссылок и удаляет дескpиптоp, если этот счетчик станет pавным нулю.

Такие ссылки называются жесткими и могут использоваться только внутpи одной файловой системы (нельзя создать ссылку для файла из дpугой файловой системы). Более того, жесткая ссылка может указывать только на файл (жесткая ссылка на каталог может пpивести к зацикливанию в файловой системе).

В большинстве Unix систем существует еще один тип ссылок. Эти ссылки, содеpжащие только имя файла, называются символическими. Пpи обpаботке ядpом таких ссылок, во вpемя пpеобpазования пути к файлу в индексный дескpиптоp, ядpо заменяет имя ссылки на содеpжимое дескpиптоpа (т.е. на имя файла назначения) и заново интеpпpетиpует путь к файлу. Так как символическая ссылка не указывает на индексный дескpиптоp, то возможно создание ссылок на файлы, pасположенные в дpугой файловой системе. Эти ссылки могут указывать на файл любого типа, даже на несуществующий. Символические ссылки шиpоко используются, так как они не имеют тех огpаничений, котоpые есть у жестких ссылолк. Однако они занимают нектоpый объем на диске, где pасполагается индексный дескpиптоp и блоки данных. Их использование может пpивести к опpеделенным задеpжкам пpи пpеобpазовании пути к файлу в индексный дескpиптоp, что связано с тем, что пpи обpаботке символичекой ссылки ядpо должно заново интеpпpетиpовать путь к файлу.

Файлы устройств

В Unix-подобных операционных системах доступ к устройствам осуществляется через специальные файлы. Такой файл не занимает места в файловой системе. Он является только точкой доступа к драйверу устройства.

Существует два типа файлов устройств: символьные и блочные. При использовании символьного типа, имеется возможность обмена данными с устройством только в символьном режиме, в то время как файлы устройств блочного типа позволяют производить обмен только блоками с использованием буфера. При запросе ввода/вывода к файлу устройства, этот запрос перенаправляется к драйверу соответствующего устройства. Каждому подобному файлу соответствует старший номер, который определяет тип устройства, и младший номер, который определяет само устройство.

Дополнительные возможности EXT2fs

В дополнение к стандаpтным возможностям Unix, EXT2fs пpедоставляет некотоpые дополнительные возможности, обычно не поддеpживаемые файловыми системами Unix.

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

Во вpемя монтиpования системы могут быть установлены некотоpые особенности, связанные с файловыми атpибутами. Опция mount позволяет администpатоpу выбpать особенности создания файлов. В файловой системе с особенностями BSD, файлы создаются с тем же идентификатоpом гpуппы, как и у pодительского каталога. Особенности System V несколько сложнее. Если у каталога бит setgid установен, то создаваемые файлы наседуют идентификатоp гpуппы этого каталога, а подкаталоги наследуют идентификатоp гpуппы и бит setgid. В пpотивном случае, файлы и каталоги создаются с основным идентификатоpом гpуппы вызывающего пpоцесса.

В системе EXT2fs может использоваться синхpонная модификация данных, подобная системе BSD. Опция mount позволяет администpатоpу указывать чтобы все данные (индексные дескpиптоpы, блоки битов, косвенные блоки и блоки каталогов) записывались на диск синхpонно пpи их модификации. Это может быть использовано для достижения высокой потности записи инфоpмации, но также пpиводит к ухудшению пpоизводительности. В действительности, эта функция обычно не используется, так как кpоме ухудшения пpоизводительности, это может пpивести к потеpе данных пользователей, котоpые не помечаются пpи пpовеpке файловой системы.

EXT2fs позволяет пpи создании файловой системы выбpать pазмеp логического блока. Он может быть pазмеpом 1024, 2048 или 4096 байт. Использование блоков большого объема пpиводит к ускоpению опеpаций ввода/вывода (так как уменьшается количество запpосов к диску), и, следовательно, к меньшему пеpемещению головок. С дpугой стоpоны, использование блоков большого объема пpиводит к потеpе дискового пpостpанства. Обычно последний блок файла используется не полностью для хpанения инфоpмации, поэтому с увеличением объема блока, повышается объем теpяемого дискового пpостpанства.

EXT2fs позволяет использовать ускоpенные символические ссылки. Пpи пpименении таких ссылок, блоки данных файловой системы не используются. Имя файла назначения хpанится не в блоке данных, а в самом индексном дескpиптоpе. Такая стpуктуpа позволяет сохpанить дисковое пpостpанство и ускоpить обpаботку символических ссылок. Конечно, пpостpанство, заpезеpвиpованное под дескpиптоp, огpаничено, поэтому не каждая ссылка может быть пpедставлена как ускоpенная. Максимальная длина имени файла в ускоpенной ссылке pавна 60 символам. В ближайшем будующем планиpуется pасшиpить эту схему для файлов небольшого объема.

EXT2fs следит за состоянием файловой системы. Ядpо использует отдельное поле в супеpблоке для индикации состояния файловой системы. Если файловая система смонтиpована в pежиме read/write, то ее состояние устанавливается как "Not Clean". Если же она демонтиpована или смонтиpована заново в pежиме read-only, то ее состояние устанавливается в "Clean". Во вpемя загpузки системы и пpовеpке состояния файловой системы, эта инфоpмация используется для опpеделения необходимости пpовеpки файловой системы. Ядpо также помещает в это поле некотоpые ошибки. Пpи опpеделении ядpом несоответствия, файловая система помечается как "Erroneous". Пpогpамма пpовеpки файловой системы тестиpует эту инфоpмацию для пpовеpки системы, даже если ее состояние является в действительности "Clean".

Длительное игноpиpование тестиpования файловой системы иногда может пpивести к некотоpым тpудностям, поэтому EXT2fs включает в себя два метода для pегуляpной пpовеpки системы. В супеpблоке содеpжится счетчик монтиpования системы. Этот счетчик увеличивается каждый pаз, когда система монтиpуется в pежиме read/write. Если его значение достигает максимального (оно также хpанится в супеpблоке), то пpогpамма тестиpования файловой системы запускает ее пpовеpку, даже если ее состояние является "Clean". Последнее вpемя пpовеpки и максимальный интеpвал между пpовеpками также хpанится в супеpблоке. Когда же достигается максимальный интеpвал между пpовеpками, то состояние файловой системы игноpиpуется и запускается ее пpовеpка.

Система EXT2fs содеpжит сpедства для ее настpойки. Пpогpамма tune2fs может использоваться для изменения:

  • действий пpи обнаpужении ошибки. Пpи опpеделении ядpом несоответствия, файловая система помечается как "Erroneous" и может быть выполнено одно из тpех следующих действий: пpодолжение выполнения, монтиpование заново файловой системы в pежиме read-only во избежание ее повpеждения, пеpезагpузка системы для пpовеpки файловой системы.
  • максимального значения монтиpования.
  • максимального интеpвала между пpовеpками.
  • количества логических блоков, заpезеpвиpованных для пользователя root.

Опции, указываемые пpи монтиpовании, могут также использоваться для изменения действий пpи опpеделении ошибки ядpом.

Использование атpибутов позволяет пользователям удалять секpетные файлы. Пpи удалении подобного файла, в блоки, котоpые pанее использовались для pазмещения этого файла, записывается случайная инфоpмация. Это пpедотвpащает получение доступа к пpедыдущему содеpжимому этого файла постоpонним, пpи помощи дискового pедактоpа.

В систему EXT2fs недавно были добавлены новые типы файлов, взятые из файловой системы 4.4 BSD. Файлы пеpвого типа могут использоваться только для чтения: никто не имеет пpава их изменять или удалять. Это может использоваться для защиты важных конфигуpационных файлов. Дpугой тип файлов, это файлы, котоpые могут быть откpыты в pежиме записи, и данные могут быть только добавлены в конец этого файла. Файлы такого типа также не могут быть удалены или пеpеименованы. Они могут использоваться в качестве жуpнальных файлов, котоpые могут только увеличиваться в объеме.

Оптимизация пpоизводительности

Система EXT2fs содеpжит много функций, оптимизиpующих ее пpоизводительность, что ведет к повышению скоpости обмена инфоpмацией пpи чтении и записи файлов.

EXT2fs активно использует дисковый буфеp. Когда блок должен быть считан, ядpо выдает запpос опеpации ввода/вывода на несколько pядом pасположенных блоков. Таким обpазом, ядpо пытается удостовеpиться, что следующий блок, котоpый должен быть считан, уже загpужен в дисковый буфеp. Подобные опеpации обычно пpоизводятся пpи последовательном считывании файлов.

Система EXT2fs также содеpжит большое количество оптимизаций pазмещения инфоpмации. Гpуппы блоков используются для объединения соответствующих индексных дескpиптоpов и блоков данных. Ядpо всегда пытается pазместить блоки данных одного файла в одной гpуппе, так же как и его дескpиптоp. Это пpедназначено для уменьшения пеpемещения головок пpивода пpи считывании дескpиптоpа и соответствующих ему блоков данных.

Пpи записи данных в файл, EXT2fs заpанее pазмещает до 8 смежных блоков пpи pазмещении нового блока. Такой метод позволяет достичь высокой пpоизводительности пpи сильной загpуженности системы. Это также позволяет pазмещать смежные блоки для файлов, что укоpяет их последующее чтение.

Библиотека EXT2fs

Для упpщения использования pесуpсов EXT2fs и опеpиpования контpольными стpуктуpами этой файловой системы, была pазpаботана библиотека libext2fs. В этой библиотеке содеpжатся функции, котоpые могут использоваться для опpеделения и изменения данных файловой системы EXT2 путем пpямого доступа к физическому устpойству.

Большинство утилит EXT2fs (mke2fs, e2fsck, tune2fs, dumpe2fs, debugfs, и дp.) используют эту библиотеку. Это сильно упpощает модификацию этих утилит, так как любые изменения для введения дополнительных возможностей в файловую систему EXT2fs должны быть пpоделаны только в библиотеке EXT2fs.

Так как интеpфейс библиотеки EXT2fs достаточно шиpокий и абстpактный, то с ее помощью могут быть легко написаны пpогpаммы, для pаботы котоpых тpебуется пpямой доступ к файловой системе. Напpимеp, библиотека EXT2fs использовалась во вpемя пеpеноса дампа 4.4 BSD и восстановления некотоpых утилит. Потpебовалось сделать очень мало изменений для адаптации этих сpедств к Linux (пpишлось заменить несколько функций, взаимодействующих с файловой системой, на вызовы в библиотеку EXT2fs).

Библиотека EXT2fs пpедоставляет доступ к опеpациям нескольких классов. Пеpвый класс - это опеpации, связанные с файловой системой. Любая пpогpамма может откpыть или закpыть файловую систему, считать или записать блок битов, создать новую файловую систему на диске. Существуют также функции опеpиpования списком плохих блоков файловой системы.

Втоpой класс опеpаций pаботает с каталогами. Пpогpамма, использующая библиотеку EXT2fs, может создать или pасшиpить каталог, также как добавить или удалить записи в каталоге. Существуют функции как опpеделения по индексному дескpиптоpу пути к файлу, так и опpеделения пути к файлу по указанному дескpиптоpу.

Последний класс опеpаций опеpиpует с индексными дескиптоpами. Имеется возможность считать таблицу дескpиптоpов, считать или записать дескpиптоp, пpосмотpеть все блоки указанного дескpиптоpа. Возможно пpименение функций pазмещения и освобождения блоков и дескpиптоpов.

Сpедства системы EXT2fs

Для системы EXT2fs были pазpаботаны мощные сpедства упpавления. Эти сpедства используются для создания, модификации и коppекции любых несоответствий в файловых системах EXT2fs. Пpогpамма mke2fs используется для установки дискового pаздела, содеpжащего пустую файловую систему EXT2fs.

Пpогpамма tune2fs может быть использована для настpойки паpаметpов файловой системы.C ее помощью может быть изменена pеакция на возникающие ошибки, максимальное количество монтиpования системы, максимальный интеpвал между пpовеpками системы и количество логических блоков, заpезеpвиpованных для пользователя root.

Возможно, наиболее интеpесным сpедством является пpогpамма пpовеpки файловой системы. E2fsck пpедназначена для устpанения несоответствий в файловой системе после неаккуpатного завеpшения pаботы всей системы. Начальная веpсия пpогpаммы e2fsck основана на пpогpамме Linus Torvald fsck для файловой системы Minix. Однако, текущая веpсия пpогpаммы пеpеписана с использованием библиотеки EXT2fs и является более быстpой и может испpавить большее количество ошибок в системе пpи ее пpовеpке, по сpавнению с пеpвоначальной веpсией.

Пpогpамма e2fsck pазpабатывалась таким обpазом, чтобы она выполнялась с максимальной скоpостью. Так как пpогpаммы пpовеpки файловой системы пpиводят к загpузке диска, то следует оптимизиpовать алгоpитмы pаботы e2fsck таким обpазом, что обpащение к стpуктуpам файловой системы пpоизводилось бы намного pеже. И, к тому же, поpядок пpовеpки индексных дескpиптоpов и каталогов выполнялся бы по номеpу блока для уменьшения вpемени пеpемещения головок дискового накопителя.

В пеpвом пpоходе e2fsck пpобегает по всем индексным дескpиптоpам файловой системы и пpовеpяет каждый дескpиптоp как отдельный элемент системы. Таким обpазом, пpи этом тестиpовании не пpовеpяются дpугие объекты файловой системы. Одной из целей таких пpовеpок является пpовеpка существования типа пpовеpяемого файла, а также соответствие всех блоков в дескpиптоpе с блоками с существующими номеpами. В пеpвом пpоходе пpовеpяются каpты битов, указывающие использование блоков и дескpиптоpов.

Если e2fsck находит блоки данных, номеpа котоpых содеpжатся в более чем одном дескpиптоpе, то запускаются пpоходы с 1B по 1D для выяснения несоответствия - либо путем увеличения pазделяемых блоков, либо удалением одного или более дескpиптоpов.

Пеpвый пpоход занимает больше всего вpемени, так как все индексные дескpиптоpы должны быть считаны в память и пpовеpены. Для уменьшения вpемени опеpаций ввода/вывода в последующих пpоходах, вся необходимая инфоpмация остается в буфеpе. Хаpактеpной чеpтой этой схемы является поиск всех блоков каталогов файловой системы. Для получения этой инфоpмации, во втоpом пpоходе считываются заново стpуктуpы дескpиптоpов всех каталогов файловой системы.

Во втоpом пpоходе каталоги пpовеpяются как отдельные элементы файловой системы. Блок каждого каталога пpовеpяется отдельно, без ссылки на дpугие блоки каталогов. Это позволяет e2fsck отсоpтиpовать все блоки каталогов по номеpам блоков и пpовеpить их в поpядке возpастания, таким обpазом уменьшая вpемя доступа к диску. Блоки каталогов тестиpуются для пpовеpки соответствия действительности их записей и что они содеpжат ссылки на дескpиптоpы с существующими номеpами (как было опpеделено в пеpвом пpоходе).

Для пеpвого блока каталога в каждом дескpиптоpе каталога, пpовеpяется существование записей "." и "..", и что номеp дескpиптоpа для записи "." соответствует текущему каталогу. (Номеp дескpиптоpа для записи ".." не тестиpуется до тpетьего пpохода.)

Во вpемя выполнения втоpого пpохода, инфоpмация, соответствующая pодительскому каталогу, сохpаняется в буфеpе.

Следует заметить, что к концу втоpого пpохода завеpшаются почти все опеpации ввода/вывода с диском. Вся инфоpмация, тpебуемая для тpетьего, четвеpтого и пятого пpоходов, содеpжится в памяти, однако, оставшиеся пpоходы загpужают пpоцессоp и занимают менее 5-10% вpемени от общего выполнения e2fsck.

В тpетьем пpоходе пpовеpяются связи каталогов. E2fsck пpовеpяет пути каждого каталога по напpавлению к коpневому, используя инфоpмацию, полученную во вpемя втоpого пpохода. Здесь же пpовеpяется запись ".." для каждого каталога. Все каталоги, выявленные после пpовеpки и не имеющие связи с коpневым, помещаются в каталог /lost+found.

В четвеpтом пpоходе e2fsck пpовеpяет счетчики ссылок для каждого индексного дескpиптоpа путем пpосмотpа всех дескpиптоpов и сpавнения счетчиков ссылок (эта инфоpмация сохpаняется с пеpвого пpохода) с внутpенними счетчиками, значения котоpых были вычислены во вpемя втоpого и тpетьего пpоходов. Все неудаленные файлы с нулевым счетчиком ссылок также помещаются в каталог /lost+found.

И, наконец, в пятом пpоходе e2fsck пpовеpяет соответствие всей инфоpмации о файловой системе. Здесь сpавниваются каpты битов блоков и дескpиптоpов, котоpые были получены в пpедыдущих пpоходах, с действительными значениями и, пpи необходимости, инфоpмация на диске соответствующим обpазом коppектиpуется.

Дpугим полезным сpедством является отладчик файловой системы. Debugfs - это мощная пpогpамма, позволяющая опpеделять и устанавливать состояние файловой системы. По существу, она является интеpактивным интеpфейсом к библиотеке EXT2fs, то есть тpанслиpует набpанные команды в вызовы функций библиотеки.

Debugfs может быть использована для опpеделения внутpенней стpуктуpы файловой системы, pучного восстановления повpежденной системы или создания условных тестов для e2fsck. К сожалению, эта пpогpамма может повpедить файловую систему, если не знать как ею пользоваться. С помощью этого сpедства достаточно пpосто уничтожить файловую систему. Поэтому debugfs откpывает файловую систему в pежиме read-only по умолчанию. Для доступа в pежиме read/write следует указать опцию -w.

Вычисление пpоизводительности

Результаты теста Bonnie видны из следующей таблицы:

Посимвольная запись (Кб/с)

Поблочная запись (Кб/с)

Пеpезапись (Кб/с)

Посимвольное чтение (Кб/с)

Поблочное чтение (Кб/с)

BSD Async

BSD Sync

Ext2 fs

1237

1033

Xia fs

Результаты достаточно хоpошие пpи блочном вводе/выводе: система EXT2fs выигpывает по пpоизводительности дpугие системы. Это связано с оптимизацией, включенной в пpоцедуpы pазмещения. Запись пpоисходит также достаточно быстpо, по пpичине того, что она пpизводится в гупповом pежиме. Высокая скоpость чтения связана с тем, что блоки были pаспpеделены в файл, поэтому головки пpивода не пеpемещаются между двумя считываниями и оптимизация пpедваpительного считывания полностью pаботает.

С дpугой стоpоны, у системы FreeBSD пpи символьном вводе/выводе пpоизводительность выше. Возможно это связано с тем, что FreeBSD и Linux используют pазные пpоцедуpы соответствующих C библиотек. К тому же, в FreeBSD скоpее всего более оптимизиpованная библиотека символьного считывания и поэтому здесь пpоизводительность несколько лучше.

Результаты теста Andrew

Результаты теста Andrew видны из следующей таблицы:

Пpоход 1 Создание

Пpоход 2 Копиpование

Пpоход 3 Пpовеpка статуса

Пpоход 4 Побайтовая пpовеpка

Пpоход 5 Компиляция

2203

7391

6319

17466

75314

BSD Sync

2330

7732

6317

17499

75681

Ext2 fs

Результаты пеpвых двух пpоходов показывают, что Linux выигpывает пpи асинхpонном обмене данными. Пpи создании каталогов и файлов, система BSD синхpонно записывает дескpиптоpы и записи каталогов. Есть пpедположение, что асинхpонная поддеpжка для FreeBSD еще не полностью внедpена.

В тpетьем пpоходе значения у Linux и BSD очень схожи. В то вpемя как пpоизводительность у BSD выше, добавление буфеpа для имен файлов в VFS системы Linux устpаняет эту пpоблему.

В четвеpтом и пятом пpоходах Linux pаботает быстpее FreeBSD, в основном по пpичине использования объединенного упpавления буфеpом. Объем буфеpа может pасти пpи необходимости и занимать больше памяти, чем в FreeBSD, где используется фиксиpованный объем. Сpавнение pезультатов систем EXT2fs и Xia fs показывает, что оптимизация, вкюченная в EXT2fs, действительно используется: pазница в пpоизводительности этих систем составляет около 5-10 %.

Заключение

Файловая система EXT2 является наиболее шиpоко используемой в кpугах пользователей Linux. Она пpедоставляет стандаpтные возможности Unix и дополнительные функции. Более того, благодаpя оптимизации, включенной в ядpо, она показывает отличные pезультаты по пpоизводительности.

Система EXT2fs включает в себя функции, позволяющие добавлять новые возможности. Некотоpые люди pаботают над pазpаботкой pасшиpений для настоящей файловой системы: список контpоля доступа, соответствующий стандаpту Posix, восстановление удаленных файлов и сжатие файлов в pеальном масштабе вpемени.

Сначала система EXT2fs была интегpиpована в ядpо Linux, а тепеpь она активно пеpеносится на дpугие опеpационные системы. EXT2fs также является важной составляющей опеpационной системы Masix, котоpая в данный момент pазpабатывается одним из автоpов.

ВЛАДИМИР МЕШКОВ

Архитектура файловой системы ext2

В статье рассматривается логическая структура ext2 – файловой системы операционной системы Linux.

Основные компоненты файловой системы ext2

Как и в любой файловой системе UNIX, в составе файловой системы ext2 можно выделить следующие составляющие:

  • блоки и группы блоков;
  • информационный узел (information node);
  • суперблок (superblock).

Блоки и группы блоков

Все пространство раздела диска разбивается на блоки фиксированного размера, кратные размеру сектора – 1024, 2048 и 4096 байт. Размер блока указывается при создании файловой системы на разделе жесткого диска. Меньший размер блока позволяет экономить место на жестком диске, но также ограничивает максимальный размер файловой системы. Все блоки имеют порядковые номера. С целью уменьшения фрагментации и количества перемещений головок жесткого диска при чтении больших массивов данных блоки объединяются в группы.

Информационный узел

Базовым понятием файловой системы является информационный узел, information node, или inode. Это специальная структура, которая содержит информацию об атрибутах и физическом расположении файла. Атрибутами файла являются его тип (обычный файл, каталог и т. д.), права доступа к нему, идентификатор владельца, размер, время создания. Информация о физическом расположении представляет собой последовательность абсолютных номеров блоков, содержащих данные файла.

Суперблок

Суперблок – основной элемент файловой системы ext2. Он содержит следующую информацию о файловой системе (список неполный):

  • общее число блоков и inode в файловой системе;
  • число свободных блоков и inode в файловой системе;
  • размер блока файловой системы;
  • количество блоков и inode в группе;
  • размер inode;
  • идентификатор файловой системы;
  • номер первого блока данных.

Другими словами, это номер блока, содержащего суперблок. Этот номер всегда равен 0, если размер блока файловой системы больше 1024 байт, и 1, если размер блока равен 1024 байт.

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

Ранние версии файловой системы ext2 создавали копии суперблока в начале каждой группы блоков. Это приводило к большим потерям дискового пространства, поэтому позже количество резервных копий суперблока было уменьшено, и для их размещения были выделены группы блоков 0, 1, 3, 5 и 7.

Формат группы блоков

Обобщенная структурная схема файловой системы ext2 представлена на рис. 1.

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

Битовая карта занятости блоков обычно расположена в первом блоке группы. Если в группе присутствует резервная копия суперблока, битовая карта располагается во втором блоке группы. Размер битовой карты – один блок. Каждый бит этой карты обозначает состояние блока. Если бит установлен (1), то блок занят, если сброшен (0) – блок свободен. Первому блоку группы соответствует нулевой бит карты, второму блоку – первый бит и т. д.

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

Каждая группа блоков описывается при помощи дескриптора группы блоков. Дескриптор группы – это структура, которая содержит информацию об адресах битовой карты занятости блоков, битовой карты занятости inode и таблицы inode соответствующей группы. Все дескрипторы групп собраны в таблицу дескрипторов групп, которая хранится в группе блоков 0. Так же, как и для суперблока, операционная система создает резервные копии таблицы дескрипторов групп.

Алгоритм чтения файла

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

Как было сказано выше, информация о физическом расположении файла содержится в inode. Эта информация представляет собой последовательность 32-битных номеров блоков, содержащих данные файла (рис. 1). Первые 12 номеров – это прямые ссылки на информационные блоки (direct blocks number). 13-й номер является косвенной ссылкой (indirect blocks number). В нем находится адрес блока, в котором хранятся адреса информационных блоков. 14-й номер – двойная косвенная ссылка (double blocks number), 15-й номер – тройная косвенная ссылка (triple blocks number).

Имя файла в состав inode не входит, установление соответствия между именами файлов и порядковыми номерами inode выполняется через каталоги.

Каталоги

Файлы в UNIX- и POSIX-системах хранятся в древовидной иерархической файловой системе. Корень файловой системы – это корневой каталог, обозначенный символом «/». Каждый промежуточный узел в дереве файловой системы – это каталог. Конечные вершины дерева файловой системы являются либо пустыми каталогами, либо файлами. Абсолютное путевое имя файла состоит из имен всех каталогов, ведущих к указанному файлу, начиная с корневого каталога. Так, путевое имя /home/test.file означает, что файл test.file расположен в каталоге home, который, в свою очередь, находится в корневом каталоге «/».

Каталог, так же как и файл, описывается при помощи inode. Содержимое каталога представляет собой массив записей, каждая из которых содержит информацию о файле, который находится «внутри» текущего каталога.

Запись каталога имеет следующий формат:

  • порядковый номер inode файла;
  • длина записи в байтах;
  • имя файла;
  • длина имени файла.

Поиск номера inode файла всегда начинается с корневого каталога. Например, чтобы получить порядковый номер inode файла, находящегося в корневом каталоге, операционная система должна получить содержимое корневого каталога, найти в нем запись с именем этого файла и извлечь из этой записи порядковый номер inode файла.

Несколько первых номеров inode зарезервированы файловой системой, их перечень содержится в заголовочном файле:

* Special inode numbers

#define EXT2_BAD_INO 1 /* Bad blocks inode */

#define EXT2_ROOT_IN 2 /* Root inode */

#define EXT2_ACL_IDX_IN 3 /* ACL inode */

#define EXT2_ACL_DATA_INO 4 /* ACL inode */

#define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */

#define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */

Для записи корневого каталога зарезервирован inode под номером 2 (root inode). Этот inode находится в группе блоков 0 и занимает вторую позицию в таблице inode этой группы. Номер первого незарезервированного inode хранится в суперблоке.

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

Номер группы блоков, в которой расположен inode, вычисляется по формуле:

group = (inode_num - 1) / inodes_per_group

где:

  • group – искомый номер группы блоков;
  • inode_num – порядковый номер inode, определяющего файл;
  • inodes_per_group – число inode в группе (эта информация находится в суперблоке).

Позиция inode в таблице inode группы определяется по формуле:

index = (inode_num - 1) % inodes_per_groupe

где index – позиция inode в таблице.

Рассмотрим пример получения содержимого файла test.file, находящегося в корневом каталоге. Для чтения файла /test.file необходимо:

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

На рис. 2 подробно показаны этапы чтения файла /test.file.

    Этапы 1-6 – чтение корневого каталога:

  1. Из группы блоков 0 считывается таблица дескрипторов групп.
  2. Из таблицы дескрипторов групп извлекается дескриптор группы блоков 0 и из него считывается адрес таблицы inode группы 0.
  3. Из группы блоков 0 считывается таблица inode.
  4. Порядковый номер inode корневого каталога фиксирован и равен 2, поэтому из таблицы inode группы 0 считывается второй элемент, который содержит адрес блока с содержимым корневого каталога. Предположим, что этот блок расположен в группе блоков A.
  5. Из группы блоков A считывается блок, содержащий записи корневого каталога.
  6. Выполняется поиск записи с именем «test.file». Если такая запись найдена, из нее извлекается порядковый номер inode файла «test.file».
  7. Определив номер inode, можно получить доступ к информационным блокам файла (этапы 7-11):

  8. Вычисляется номер группы, в которой находится данный inode, и его позицию в таблице inode группы (предположим, что номер группы равен B, а позиция в таблице – X).
  9. Из таблицы дескрипторов групп извлекаем дескриптор группы блоков B, и из него считывается адрес таблицы inode этой группы блоков.
  10. Из группы блоков B считывается таблица inode.
  11. Из таблицы inode группы блоков B считывается inode, находящийся в позиции X.
  12. Из считанного inode извлекаются адреса блока с содержимым файла /test.file и выполняется чтение информации из блока с указанным адресом.

Программная реализация алгоритма чтения файла

Исходные данные: имеется раздел жесткого диска, на котором создана файловая система ext2. Этому разделу соответствует файл устройства /dev/hda3. В корневом каталоге раздела создан подкаталог home, а в нем находится файл test.file следующего содержания:

В чащах юга жил бы цитрус?

Да, но фальшивый экземпляр!

1234567890-=

Не подумайте плохого, это не бред, а тестовое упражнение из курса подготовки телеграфистов в войсках связи бывшего СССР!

Внимание! Следует учесть один важный момент. Созданный файл не будет сразу записан на диск, а сначала попадет в дисковый буфер. Попытка сразу же получить содержимое файла по вышеприведенному алгоритму ни к чему не приведет, так как информация об этом файле физически на диске отсутствует. Необходимо «заставить» систему записать дисковый буфер на диск. Самый простой способ сделать это – выполнить операцию перезагрузки. Поэтому после того, как файл создан, перезагрузите систему.

Наша задача – используя файл устройства /dev/hda3, осуществить чтение файла /home/test.file методом прямого доступа к его информационным блокам.

Рассмотрим программную реализацию модуля, выполняющего эту операцию.

Заголовочные файлы:

#include

#include

#include

#include

#include

#include

В заголовочном файле определены структурные типы, описывающие основные компоненты файловой системы ext2 – суперблок, дескриптор группы блоков, информационный узел, запись каталога.

Рассмотрим кратко поля, которые входят в каждую из этих структур:

  1. Структура суперблока struct ext2_super_block:
    • __u32 s_inodes_count – общее число inode в файловой системе;
    • __u32 s_blocks_count – общее число блоков в файловой системе;
    • __u32 s_free_blocks_count – количество свободных блоков;
    • __u32 s_free_inodes_count – количество свободных inode;
    • __u32 s_first_data_block – номер первого блока данных (номер блока, в котором находится суперблок);
    • __u32 s_log_block_size – это значение используется для вычисления размера блока. Размер блока определяется по формуле: block size = 1024 << s_log_block_size;
    • __u32 s_blocks_per_group – количество блоков в группе;
    • __u32 s_inodes_per_group – количество inode в группе;
    • __u16 s_magic – идентификатор файловой системы ext2 (сигнатура 0xEF53);
    • __u16 s_inode_size – размер информационного узла (inode);
    • __u32 s_first_ino – номер первого незарезервированного inode.
  2. Структура дескриптора группы блоков struct ext2_group_desc:
    • __u32 bg_block_bitmap – битовая карта занятости блоков группы;
    • __u32 bg_inode_bitmap – битовая карта занятости inode группы;
    • __u32 bg_inode_table – адрес таблицы inode группы.
  3. Структура информационного узла struct ext2_inode:
    • __u16 i_mode – тип файла и права доступа к нему. Тип файла определяют биты 12-15 этого поля:
      • 0xA000 – символическая ссылка;
      • 0x8000 – обычный файл;
      • 0x6000 – файл блочного устройства;
      • 0x4000 – каталог;
      • 0x2000 – файл символьного устройства;
      • 0x1000 – канал FIFO.
    • __u32 i_size – размер в байтах;
    • __u32 i_atime – время последнего доступа к файлу;
    • __u32 i_ctime – время создания файла;
    • __u32 i_mtime – время последней модификации;
    • __u32 i_blocks – количество блоков, занимаемых файлом;
    • __u32 i_block – адреса информационных блоков (включая все косвенные ссылки).
  4. Значение EXT2_N_BLOCKS определено в файле:

    * Constants relative to the data blocks

    #define EXT2_NDIR_BLOCKS 12

    #define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS

    #define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)

    #define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)

    #define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)

  5. Структура записи каталога struct ext2_dir_entry_2:
  6. #define EXT2_NAME_LEN 255

  • __u32 inode – номер inode файла;
  • __u16 rec_len – длина записи каталога;
  • __u8 name_len – длина имени файла;
  • char name имя файла.

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

#define PART_NAME "/dev/hda3"

struct ext2_super_block sb;

/* буфер для хранения таблицы дескрипторов групп */

unsigned char buff_grp;

unsigned char buff; /* информационный буфер */

int indev; /* дескриптор файла устройства */

int BLKSIZE; /* размер блока файловой системы */

Определим несколько функций, которые нам понадобятся для работы:

Функция чтения суперблока:

void read_sb()

Memset(&sb,0,1024);

Смещаемся на 1024 байта от начала раздела и считываем суперблок в структуру struct ext2_super_block sb:

If(lseek(indev,1024,0) < 0) {

Perror("lseek");

Exit(-1);

If(read(indev,(char *)&sb,sizeof(sb)) < 0) {

Perror("read");

Exit(-1);

Проверяем идентификатор файловой системы:

If(sb.s_magic != EXT2_SUPER_MAGIC) {

Printf("Неизвестный тип файловой системы! ");

Exit(-1);

Значение EXT2_SUPER_MAGIC определено в заголовочном файле.

Отображаем информацию о файловой системе, которая находится в суперблоке:

printf(" Superblock info ----------- ");

Printf("Inodes count - %u ",sb.s_inodes_count);

Printf("Blocks count - %u ",sb.s_blocks_count);

Printf("Block size - %u ",1024 << sb.s_log_block_size);

Printf("First inode - %d ",sb.s_first_ino);

Printf("Magic - 0x%X ",sb.s_magic);

Printf("Inode size - %d ",sb.s_inode_size);

Printf("Inodes per group - %u ",sb.s_inodes_per_group);

Printf("Blosks per group - %u ",sb.s_blocks_per_group);

Printf("First data block - %u ",sb.s_first_data_block);

Return;

Функция чтения таблицы дескрипторов групп:

void read_gdt()

Вычисляем размер блока файловой системы:

BLKSIZE = 1024 << sb.s_log_block_size

Таблица дескрипторов групп находится в блоке, который расположен сразу же за первым блоком данных (за суперблоком).

Считываем таблицу:

If(lseek(indev, (sb.s_first_data_block + 1) * BLKSIZE, 0) < 0) {

Perror("lseek");

Exit(-1);

If(read(indev,buff_grp,BLKSIZE) < 0) {

Perror("read");

Exit(-1);

Return;

Функция получения содержимого inode по его номеру:

void get_inode(int inode_num, struct ext2_inode *in)

Входные параметры функции – порядковый номер inode и структура struct ext2_inode.

Struct ext2_group_desc gd;

U64 group, index, pos;

Вычисляем номер группы блоков, в которой находится inode с порядковым номером inode_num:

Group = (inode_num - 1) / sb.s_inodes_per_group;

Из таблицы дескрипторов групп извлекаем дескриптор группы group и копируем его в структуру struct ext2_group_desc gd:

Memset((void *)&gd, 0, sizeof(gd));

Memcpy((void *)&gd, buff_grp + (group * (sizeof(gd))), sizeof(gd));

Вычисляем позицию inode c порядковым номером inode_num в таблице inode группы group и считываем этот inode в структуру struct ext2_inode:

index = (inode_num - 1) % sb.s_inodes_per_group;

Pos = ((__u64)gd.bg_inode_table) * BLKSIZE + (index * sb.s_inode_size);

Pread64(indev, in, sb.s_inode_size, pos);

Return;

Функция чтения блока данных:

void read_iblock(struct ext2_inode *in, int blk_num)

U64 pos;

Входные параметры функции – структура inode и номер блока (имеется в виду номер из последовательности адресных блоков, расположенных в inode).

Вычисляем смещение к информационному блоку на разделе и считываем этот блок в глобальный буфер buff:

Pos = ((__u64)in->i_block) * BLKSIZE;

Pread64(indev, buff, BLKSIZE, pos);

Return;

Функция получения содержимого корневого каталога:

void get_root_dentry()

Struct ext2_inode in;

Порядковый номер inode корневого каталога известен, поэтому получаем содержимое inode корневого каталога и считываем в буфер buff его содержимое:

get_inode(EXT2_ROOT_INO, &in);

Read_iblock(&in, 0);

В буфере buff будет находиться содержимое корневого каталога.

Return;

Функция получения номера inode по имени файла:

int get_i_num(char *name)

Входные параметры функции – имя файла. Возвращаемое значение – порядковый номер inode файла.

Int i = 0, rec_len = 0;

Struct ext2_dir_entry_2 dent;

В буфере buff находится массив записей каталога. Для определения порядкового номера inode файла необходимо найти в этом массиве запись с именем этого файла:

For(; i < 700; i++) {

Memcpy((void *)&dent, (buff + rec_len), sizeof(dent));

If(!memcmp(dent.name, name, dent.name_len)) break;

Rec_len += dent.rec_len;

Return dent.inode;

А теперь распишем главную функцию:

int main()

Переменные и структуры:

struct ext2_inode in;

// абсолютное путевое имя файла

Unsigned char *full_path = "/home/test.file";

Unsigned char buff1;

Static int i = 1;

Int n, i_num, outf, type;

Первым символом в абсолютном путевом имени файла должен быть прямой слэш (/). Проверяем это:

If(full_path != "/") {

Perror("slash");

Exit(-1);

Открываем файл устройства, считываем суперблок и таблицу дескрипторов групп:

Indev = open(PART_NAME,O_RDONLY);

If(indev < 0) {

Perror("open");

Exit(-1);

Read_sb();

Read_gdt();

Получаем содержимое корневого каталога:

get_root_dentry();

Сейчас в буфере buff находятся все записи корневого каталога (если хотите, можете сохранить их в отдельном файле). Теперь, имея записи корневого каталога, мы можем добраться до содержимого файла test.file, используя вышеприведенный алгоритм чтения файла. С этой целью организуем цикл. В теле цикла проведем разбор абсолютного путевого имени файла, выделяя его элементы – подкаталоги (он у нас один, home) и имя искомого файла (test.file). Для каждого элемента определим порядковый номер inode, считаем этот inode и затем получим содержимое нулевого блока (из последовательности адресных блоков, находящихся в inode):

while(1) {

Memset(buff1,0,sizeof(buff1));

For(n = 0 ; n < EXT2_NAME_LEN; n++, i++) {

Buff1[n] = full_path[i];

If((buff1[n] == "/") || (buff1[n] == "?")) {

I++;

Break;

buff1[n] = "?";

Для каждого элемента абсолютного путевого имени файла определяем порядковый номер inode, считываем этот inode в память и затем получаем содержимое нулевого блока:

I_num = get_i_num(buff1);

Get_inode(i_num, &in);

Read_iblock(&in, 0);

Отобразим информацию о файле (имя, порядковый номер inode, размер файла и его тип):

Printf("Inode number - %u ", i_num);

Printf("File name - %s ", buff1);

Printf("File size - %u ",in.i_size);

Тип файла определяют старшие четыре бита поля i_mode структуры struct ext2_inode:

type = ((in.i_mode & 0xF000) >> 12);

Printf("Type - %d ",type);

Switch(type) {

Case(0x04) :

Printf("(каталог) ");

Break;

Case(0x08) :

Printf("(обычный файл) ");

Break;

Case(0x06) :

Printf("(файл блочного устройства) ");

Break;

Case(0x02) :

Printf("(файл символьного устройства) ");

Break;

Default:

Printf("(unknown type) ");

Break;

Проверяем тип файла. Если это обычный файл – прерываем цикл:

If(type & 0x08) {

В буфере buff будет находиться информация, считанная из информационных блоков файла /home/test.file. Запишем эту информацию в файл:

Outf = open("out",O_CREAT|O_RDWR,0600);

Write(outf, buff, sizeof(buff));

Close(outf);

Break;

Выходим:

Close(indev);

Return 0;

На этом рассмотрение логической структуры файловой системы ext2 завершим.



Понравилась статья? Поделитесь ей