Категория: Windows
На домашнем компьютере озадачился выбором файловой системы для своего домашнего раздела и специального раздела для backup, пока что по критерию - производительность, о надёжности пока не беспокоюсь ибо бекапы рулят
Желание подобрать ФС возникло после того как ощутил разницу между копирование больших файлов на Ext4 и ReiserFS, ReiserFS видимо не для этого должна использоваться
Для тестов использовал наиболее типичные для моего домашнего компьютера задачи (копирование больших и маленьких файлов, поиск текста в исходниках, удаление хлама, make clean)
cmd1="cp -r /media/media4/video/best $dest"
cmd2="rsync -rlhtgopu /media/media4/backup $dest"
cmd3="grep linux -sir $dest/backup/wine-src/"
cmd4="find $dest -type f -delete"
1,7G /media/media4/backup/ - 40285 файлов (AD0 Foto home.e2i.bz2 Transmission video Video wine-src)
7,4G /media/media4/video/best/ - 4 файла DVDRIP
Дэниел Роббинс (Daniel Robbins), перевод Владимира Холманова, под редакцией Алексея Федорчука
В прошлых статьях имелся обзор нетрадиционных файловых систем типа tmpfs. Теперь пришло время вернуться к файловым системам на блочных устройствах (disk-based), и это делается на примере ext3. Файловая система Ext3, разработанная доктором Стефеном Твиди (Dr. Stephen Tweedie), сформирована на структурах существующей файловой системы ext2; фактически, ext3 очень похожа на ext2 за исключением маленького (но важного) отличия - она поддерживает journaling. После такого "маленького" добавления в ext3 появились некоторые удивительные и интригующие возможности. В этой статье дается сравнение ext3 с другими journaling filesystems, доступными для использования уже сегодня. Планируется выход еще одной статьи об использовании ext3.
Пояснения к Ext3Что собой представляет ext3 в сравнении с ReiserFS? В предыдущих статьях отмечалось, насколько хорошо ReiserFS подходит для работы с маленькими файлами (до 4КБ), и в отдельных случаях работа с такими файлами в ReiserFS в десять - пятнадцать раз эффективней, чем в ext2 (и ext3). Однако, кроме достоинств, ReiserFS имеет и свои слабости. В текущем релизе ReiserFS (версия 3.6) некоторые виды доступа к файлу фактически приводят к заметному снижению производительности в сравнении с ext2 и ext3 (особенно при чтении больших почтовых каталогов). Кроме того, ReiserFS не имеет хорошей совместимости с NFS и имеет проблемы с производительностью при дефиците свободного дискового пространства. Напротив, ext3 с этими задачами справляется великолепно. Она во многом подобна ext2; не ставит рекордов при обработке маленьких файлов, но хорошо прогнозируемая и не боится работы при ограниченных дисковых ресурсах.
Еще одно достоинство ext3 происходит из того, что она основана на коде ext2. Дисковый формат ext2 и ext3 идентичен; из этого следует, что при необходимости файловую систему ext3 можно монтировать как ext2 без каких либо проблем. И это еще не все. Благодаря факту, что ext2 и ext3 используют идентичные метаданные, имеется возможность оперативного обновления ext2 в ext3. Именно так. Имеется ряд системных утилит, работающих с современными ядрами (например, tune2fs ) позволяющих конвертировать имеющуюся ext2 в журналируемую ext3. Удивительно, но сделать это можно даже на смонтированной файловой системе ext2. Переход безопасен, обратим и сравнительно легок (в отличие от конвертирования в XFS, JFS или ReiserFS - какого либо копирования данных на другой раздел не требуется). Теперь представьте на мгновение тысячи промышленных серверов с ext2 (уже работающих), для которых обновление до ext3 минутное дело; можно получить хорошее представление о перспективности ext3 в Linux семействе.
Если от меня потребуют дать характеристику ext3 в одном слове, я бы сказал - удобная. Это действительно удобно как следствие насколько только возможной совместимости ext3 с существующей ext2. После обновления вам не придется сталкиваться с любыми неожиданностями. Есть еще одна характеристика, положительно отличающая ext3 от остальных журналируемых файловых систем под Linux - высокая надежность. но об этом ниже.
Надежность Ext3В дополнение к ext2-compatible, ext3 наследует другие преимущества общего формата метаданных. Пользователи ext3 имеют в своем распоряжении годами проверенный инструментарий fsck. Конечно, основная причина перехода на журналируемую файловую систему - отказ от необходимости периодических и долгих проверок непротиворечивости метаданных на диске. Однако "журналирование" не способно защитить от сбоев ядра или повреждения поверхности диска (или кое-чего подобного). В аварийной ситуации вы оцените факт преемственности ext3 от ext2 с ее fsck. Напротив, ReiserFS fsck еще находится в младенчестве и устранение нарушений в метаданных может стать трудным и опасным процессом.
Журналирование только метаданныхИнтересно то, что ext3 выполняет журналирование совсем иначе, чем ReiserFS и другие журналируемые файловые системы. В ReiserFS, XFS и JFS журналируются метаданные их и не предусмотрено какое либо журналирование самих данных. При при журналировании метаданных (metadata-only journaling ) метаданные хранятся так надежно, что, скорее всего вам не придется пользоваться fsck. Однако, неожиданные перезагрузки и сбои в электропитании могут приводить к утере данных. которые в момент сбоя записывались на диск. Ext3 использует несколько творческих решений для избежания таких проблем.
Сначала поясним ситуацию с журналированием только метаданных. Например, вы редактировали файл /tmp/myfile.txt в момент, когда машина неожиданно блокировалась. В случае с журналируемыми системами, журналирующими только метаданные (например, ReiserFS, XFS или JFS), метаданные вашей файловой системы утрачены не будут и запуска fsck не потребуется.
Однако, в случае такого сбоя имеется высокая вероятность, что в файле /tmp/myfile.txt останется один мусор, а то и просто он станет нечитабельным.
Причина в следующем. "Обычные" журналируемые файловые системы, подобные ReiserFS, XFS и JFS опекают метаданные, но для повышения производительности заботу о данных не проявляют. В нашем примере происходила модификация некоторых блоков и соответствующих им метаданных, но синхронизация была неожиданно прервана. "Непротиворечивость" файловых блоков будет восстановлена, чего нельзя сказать об их "наполнении".
Журнализация в ext3Теперь, когда имеется общее понимание проблемы, посмотрим, как ext3 осуществляет журналирование. В коде журнализации для ext3 используется специальный API, называемый Уровень журналирования блочного устройства (Journaling Block Device layer или JBD). JBD был разработан для журнализации на любых блочных устройств. Ext3 привязана к JBD API. При этом код файловой системы ext3 сообщает JBD о необходимости проведения модификации и запрашивает у JBD разрешение на ее проведение. Журналом управляет JBD от имени драйвера файловой системы ext3. Такое соглашение очень удобно, так как JBD развивается как отдельный, универсальный объект и может использоваться в будущем для журналирования в других файловых систем.
Имеется два важных момента в управлении журналом ext3 через JBD, вытекающих из хранения журнала в inode файле (в базовом варианте). Первое, в зависимости от ключей монтирования файловой системы ext3, этот файл можно "видеть" или "не видеть" (расположен в /.journal). Второе, такое хранение журнала делает возможным переход к ext3 через простое добавление единственного файла (и замену драйвера) без использования несовместимых расширений к метаданным ext2. Это ключ к пониманию "обратной совместимости" файловой системы ext3 с ext2 метаданными и "прямой совместимости" ext2 с ext3 драйвером.
Различные подходы к journalingНетрудно догадаться, что имеется несколько способов ведения журнала. Например, разработчик файловой системы может спроектировать журнал, который хранит промежуточные байты, подлежащие модификации в файловой системе. Преимущество такого подхода в том, что журнал хранил бы большое число крошечных модификаций очень эффективным способом, так как требуется запись только отдельных байтов и ничего больше.
JBD использует иной подход. Вместо регистрации промежуточных байтов сохраняются полностью измененные блоки файловой системы. Драйвер Ext3, аналогично, хранит полные точные копии модифицируемых блоков (1КБ, 2КБ или 4КБ) в памяти до завершения операции ввода/вывода. Это может показаться расточительным. Полные блоки содержат не только изменившиеся данные, но и не модифицированные .
Подход, используемый JBD, называется "физическим журналированием". что отражает использование JBD "физических блоков" как основную единицу ведения журнала. Подход, когда хранятся только изменяемые байты, а не целые блоки, называется "логическим журналированием" (используется XFS). Поскольку ext3 использует "физическое журналирование", журнал в ext3 имеет размер больший, чем в XFS. За счет использования в ext3 полных блоков, как драйвером, так и подсистемой журналирования нет сложностей, которые возникают при "логическом журналировании". Кроме того, использование полных блоков позволяет исполнение некоторой дополнительной оптимизации, например объединение нескольких ожидающих обработки операции ввода/вывода в пределах моноблока в одной структуре оперативной памяти. Это позволяет ext3 записывать на диск несколько смежных модификаций одной операцией. Как дополнение, при операциях записи существенно сокращается нагрузка на CPU.
Защита данных в Ext3Теперь можно поговорить о том, как файловая система ext3 обеспечивает журналирование и данных, и метаданных. Фактически в ext3 имеются два метода достижения гарантии непротиворечивости.
Первоначально ext3 разрабатывалась для журналирования и всех данных, и метаданных. В этом режиме (называется "data=journal" mode ), JBD журналирует все изменения в файловой системе, связанные как с данными, так и с метаданными. При этом JBD может использовать журнал для отката и восстановления метаданных и данных. Недостаток "полного" журналирования в достаточно низкой производительности и расходе большого объема дискового пространства под журнал.
Недавно для ext3 был добавлен новый режим журналирования, который сочетает высокую производительность и гарантию непротиворечивости структуры файловой системы после сбоя (как у "обычных" журналируемых файловых систем). Новый режим работы обслуживает только метаданные. Однако драйвер файловой системы ext3 по-прежнему отслеживает обработку целых блоков данных (если они связаны с модификацией метаданных), и группирует их в отдельный объект, называемый тразакцией (transaction). Транзакция будет завершена только после записи на диск всех данных. "Побочный" эффект такой "грубой" методики (называемой "data=ordered" mode ) - ext3 обеспечивает более высокую вероятность сохранности данных (по сравнению с "продвинутыми" журналируемыми файловыми системами) при гарантии непротиворечивости метаданных. При этом происходит журналирование изменений только структуры файловой системы. Ext3 использует этот режим по умолчанию.
ЗаключениеВ настоящее время многие пытаются определиться, какая из поддержанных в Linux журналируемых файловых систем является "лучшей". По большому счету, все определяется тем, для каких целей и каких приложений файловую систему планируется использовать; каждая имеет свои достоинства и недостатки. Безусловное преимущество пользователей Linux - возможность выбора между файловыми системами нового поколения. Вместо приклеивания ярлыка "лучшей" файловой системы, следует понять силу и слабость каждой и принять обоснованное решение.
Ext3 имеет множество преимуществ. Она разработана для максимальной простоты развертывания. Она основана на годами проверенном коде ext2 и получила "по наследству" замечательный инструментарий fsck. Ext3 в первую очередь предназначена для приложений, не имеющих встроенных возможностей по гарантированию сохранности данных. В целом, ext3 - замечательная файловая система и достойное продолжение ext2. В моей следующей статье будет описана установка и работа с ext3.
ext2 или 2я расширенная файловая система — файловая система для ядра Linux. Она была разработана Remy Card'ом в качестве замены для extended file system. Она достаточно быстра для того, чтобы служить эталоном в тестах производительности файловых систем. Она не является журналируемой файловой системой и это её главный недостаток. Развитием ext2 стала журналируемая файловая система ext3. полностью совместимая с ext2.
Содержание ИсторияНа заре развития Linux использовала файловую систему ОС Minix. Эта файловая система была довольно стабильна, но была 16-разрядной и как следствие имела жёсткое ограничение в 64 Мегабайта на раздел. Также присутствовало ограничение имени файла: оно составляло 14 символов. Эти и не только ограничения повлекли появление в апреле 1992 года «расширенной файловой системы» (extended file system), решавшей 2 главные проблемы Minix. Новая файловая система расширила ограничения на размер файла до 2 гигабайт и установила предельную длину имени файла в 255 символов. Но она всё равно имела проблемы: не было поддержки раздельного доступа, временных меток модификации данных.
Решением всех проблем стала новая файловая система, разработанная в январе 1993 года. В ext2 были сразу реализованы соответствующие стандарту POSIX списки контроля доступа ACL и расширенные атрибуты файлов.
Логическая организация файловой системы ext2Сетевая иерархия каталогов файловой системы ext2
Граф. описывающий иерархию каталогов файловой системы ext2, представляет собой сеть, это достигается тем, что один файл может входить сразу в несколько каталогов.
Все типы файлов имеют символьные имена. В иерархически организованных файловых системах обычно используются три типа имен — файлов: простые, составные и относительные. Не является исключением и «вторая расширенная файловая система». Ограничения на простое имя состоят в том что, его длина не должна превышать 255 символов, а также в имени не должны присутствовать символ NUL и ‘/’. Ограничения на символ NUL связаны с представлением строк на языке Си. а на символ ‘/’ с тем, что он используются как разделительный символ между каталогами. Полное имя представляет собой цепочку простых символьных имен всех каталогов. через которые проходит путь от корня до данного файла. В файловой системе ext2 файл может входить в несколько каталогов, а значит, иметь несколько полных имен; здесь справедливо соответствие «один файл — много полных имен». В любом случае полное имя однозначно определяет файл.
Атрибуты файлов хранятся не в каталогах, как это сделано в ряде простых файловых систем. а в специальных таблицах. В результате каталог имеет очень простую структуру, состоящую всего из двух частей: номера индексного дескриптора и имени файла.
Физическая организация файловой системы ext2 Структура дискового разделаКак и в любой файловой системе UNIX. в составе ext2 можно выделить следующие составляющие:
Всё пространство раздела диска разбивается на блоки фиксированного размера, кратные размеру сектора — 1024, 2048, 4096 или 8120 байт. Размер блока указывается при создании файловой системы на разделе диска. Меньший размер блока позволяет экономить место на жёстком диске, но также ограничивает максимальный размер файловой системы. Все блоки имеют порядковые номера. С целью уменьшения фрагментации и количества перемещений головок жёсткого диска при чтении больших массивов данных блоки объединяются в группы блоков.
Базовым понятием файловой системы является индексный дескриптор (информационный узел), information node, или inode. Это специальная структура, которая содержит информацию об атрибутах и физическом расположении файла. Inode объединены в таблицу индексных дескрипторов, которая содержится в начала каждой группы блоков
Обобщенная структурная схема ФС ext2
Каждая группа блоков имеет одинаковое строение. Суперблок — основной элемент файловой системы ext2. Он содержит общую информацию о файловой системе:
Суперблок находится в 1024 байтах от начала раздела. От целостности суперблока напрямую зависит работоспособность файловой системы. Операционная система создает несколько резервных копий суперблока для возможности его восстановления в случае повреждения. В следующем блоке после суперблока располагается глобальная дескрипторная таблица - описание групп блоков, представляющее собой массив, содержащий общую информацию обо всех группах блоков раздела.
Группа блоковВсе блоки раздел ext2 разделяется на группы блоков. Для каждой группы блоков создается отдельная запись в глобальной дескрипторной таблице, в этой записи хранятся основные параметры:
Битовая карта блоков — это структура, каждый бит которой показывает, отведён ли соответствующий ему блок какому-либо файлу. Если бит равен 1, то блок занят. Аналогичную функцию выполняет битовая карта индексных дескрипторов, показывая какие именно индексные дескрипторы заняты, а какие нет. Ядро Linux. используя число inode, содержащих каталоги, пытается равномерно распределить inode каталогов по группам, а inode файлов помещает, если это возможно, в группу с родительским каталогом Все оставшееся место, обозначенное в таблице как данные, отводится для хранения файлов.
Система адресации данныхСистема адресации ФС ext2
Система адресации данных — это одна из самых существенных составных частей файловой системы. Именно система адресации позволяет находить нужный файл среди множества как пустых, так и занятых блоков на диске. Файловая система ext2 использует следующую схему адресации блоков файла. Для хранения адреса файла выделено 15 полей, каждое из которых состоит из 4 байт. Если размер файла меньше или равен 12 блоков, то номера этих кластеров непосредственно перечисляются в первых двенадцати полях адреса. Если размер файла превышает 12 блоков, то следующее 13-е поле содержит адрес кластера, в котором могут быть расположены номера следующих блоков файла. Таким образом, 13-й элемент адреса используется для косвенной адресации. При максимальном размере блока равном 4096 байт, 13-й элемент, может содержать до 1024 номеров следующих кластеров данных файла. Если размер файла превышает 12+1024 блоков, то используется 14-е поле, в котором находится номер блока, содержащего 1024 номеров блоков, каждый из которых хранят 1024 номеров блоков данных файла. Здесь применяется уже двойная косвенная адресация. И наконец, если файл включает более 12+1024+1048576 = 1049612 блоков, то используется последнее 15-е поле для тройной косвенной адресации.
Таким образом, описанная выше система адресации, позволяет при максимальном размере блока 4 Кб иметь файлы размера до 2 терабайт. или больше
См. также СсылкиWikimedia Foundation. 2010 .
Смотреть что такое "Ext2" в других словарях:ext2 — Разработчик Реми Кард (англ.) Файловая система Second extended file system Дата представления Январь 1993 (Linux) Метка тома Apple UNIX SVR2 (Apple Partition Map) 0x83 (Master Boot Record) EBD0A0A … Википедия
Ext2 — Hersteller Remy Card Vollstandige Bezeichnung Second extended file system Erstveroffentlichung Januar 1993 (Linux) Partitionskennung Apple UNIX SVR2 (Apple Partition Map) 0x83 (Master Boot Record) EBD0A0A2 B9E5 4433 87C0 68B6B72699C7 (GPT … Deutsch Wikipedia
ext2 — Hersteller Remy Card Vollstandige Bezeichnung Second extended file system Erstveroffentlichung Januar 1993 (Linux) Partitionskennung Apple UNIX SVR2 (Apple Partition Map) 0x83 (Master Boot Record) EBD0A0A2 B9E5 4433 87C0 68B6B7269 … Deutsch Wikipedia
Ext2 — Saltar a navegacion, busqueda ext2 Desarrollador Remy Card Nombre completo Second extended file system Introducido Enero de 1993 (Linux) Identificador de la particion Apple UNIX SVR2 (Apple Partition Map) 0x83 ( … Wikipedia Espanol
Ext2 — Diffuseur de logiciel Remy Card Nom anglais Extended file system 2 Introduction Janvier 1993 (Linux 2.?) Identificateur de partition 0x83 ( … Wikipedia en Francais
ext2 — Developpeur Remy Card Nom anglais Extended file system 2 Introduction Janvier 1993 (Linux 0.99.?) Identificateur de partition 0x83 (MBR) Structure Contenu des repertoires … Wikipedia en Francais
EXT2 — can refer to:*EXT2, a human gene *ext2, a file system for the Linux kernel … Wikipedia
EXT2 — (second extended filesystem o segundo sistema de archivos extendido ) fue el sistema de archivos estandar en el sistema operativo GNU/Linux por varios anos y continua siendo ampliamente utilizado. Fue disenado originalmente por Remy Card. La… … Enciclopedia Universal
Ext2 — infobox filesystem name = ext2 full name = Second extended file system developer = Remy Card introduction os = Linux introduction date = January 1993 partition id = Apple UNIX SVR2 (Apple Partition Map) 0x83 (Master Boot Record) EBD0A0A2 B9E5… … Wikipedia
ext2 — noun A type of Linux file system aimed at improving on the ext file system. 2004: Whats all this about a new filesystem? Is it like ext2? mdash; from See Also: ext, ext1, ext3 … Wiktionary
Архитектура файловой системы ext2
В статье рассматривается логическая структура ext2 – файловой системы операционной системы Linux.
Основные компоненты файловой системы ext2
Как и в любой файловой системе UNIX, в составе файловой системы ext2 можно выделить следующие составляющие:
Блоки и группы блоков
Все пространство раздела диска разбивается на блоки фиксированного размера, кратные размеру сектора – 1024, 2048 и 4096 байт. Размер блока указывается при создании файловой системы на разделе жесткого диска. Меньший размер блока позволяет экономить место на жестком диске, но также ограничивает максимальный размер файловой системы. Все блоки имеют порядковые номера. С целью уменьшения фрагментации и количества перемещений головок жесткого диска при чтении больших массивов данных блоки объединяются в группы.
Базовым понятием файловой системы является информационный узел, information node, или inode. Это специальная структура, которая содержит информацию об атрибутах и физическом расположении файла. Атрибутами файла являются его тип (обычный файл, каталог и т. д.), права доступа к нему, идентификатор владельца, размер, время создания. Информация о физическом расположении представляет собой последовательность абсолютных номеров блоков, содержащих данные файла.
Суперблок – основной элемент файловой системы ext2. Он содержит следующую информацию о файловой системе (список неполный):
Другими словами, это номер блока, содержащего суперблок. Этот номер всегда равен 0, если размер блока файловой системы больше 1024 байт, и 1, если размер блока равен 1024 байт.
От целостности суперблока напрямую зависит работоспособность файловой системы. Операционная система создает несколько резервных копий суперблока для возможности его восстановления в случае повреждения. Главная копия находится по смещению 1024 байт от начала раздела, на котором создана файловая система (первые 1024 байта зарезервированы для загрузчика операционной системы).
Ранние версии файловой системы ext2 создавали копии суперблока в начале каждой группы блоков. Это приводило к большим потерям дискового пространства, поэтому позже количество резервных копий суперблока было уменьшено, и для их размещения были выделены группы блоков 0, 1, 3, 5 и 7.
Формат группы блоков
Обобщенная структурная схема файловой системы ext2 представлена на рис. 1.
Рисунок 1. Обобщенная структурная схема файловой системы ext2
Практически все группы блоков имеют одинаковый формат. В каждой группе, помимо информационных блоков, хранится информация о занятости блоков и 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 зарезервированы файловой системой, их перечень содержится в заголовочном файле.
* 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
Позиция inode в таблице inode группы определяется по формуле:
index = (inode_num - 1) % inodes_per_groupe
где index – позиция inode в таблице.
Рассмотрим пример получения содержимого файла test.file, находящегося в корневом каталоге. Для чтения файла /test.file необходимо:
На рис. 2 подробно показаны этапы чтения файла /test.file.
Рисунок 2. Порядок выполнения процедуры чтения файла в файловой системе ext2 (на примере файла /test.file)
Этапы 1-6 – чтение корневого каталога:
Определив номер inode, можно получить доступ к информационным блокам файла (этапы 7-11):
Программная реализация алгоритма чтения файла
Исходные данные: имеется раздел жесткого диска, на котором создана файловая система ext2. Этому разделу соответствует файл устройства /dev/hda3. В корневом каталоге раздела создан подкаталог home, а в нем находится файл test.file следующего содержания:
В чащах юга жил бы цитрус?
Да, но фальшивый экземпляр!
Не подумайте плохого, это не бред, а тестовое упражнение из курса подготовки телеграфистов в войсках связи бывшего СССР!
Внимание! Следует учесть один важный момент. Созданный файл не будет сразу записан на диск, а сначала попадет в дисковый буфер. Попытка сразу же получить содержимое файла по вышеприведенному алгоритму ни к чему не приведет, так как информация об этом файле физически на диске отсутствует. Необходимо «заставить» систему записать дисковый буфер на диск. Самый простой способ сделать это – выполнить операцию перезагрузки. Поэтому после того, как файл создан, перезагрузите систему.
Наша задача – используя файл устройства /dev/hda3, осуществить чтение файла /home/test.file методом прямого доступа к его информационным блокам.
Рассмотрим программную реализацию модуля, выполняющего эту операцию.
В заголовочном файле определены структурные типы, описывающие основные компоненты файловой системы ext2 – суперблок, дескриптор группы блоков, информационный узел, запись каталога.
Рассмотрим кратко поля, которые входят в каждую из этих структур:
Значение 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)
#define EXT2_NAME_LEN 255
Определим имя раздела, на котором создана файловая система, глобальные структуры и переменные.
#define PART_NAME "/dev/hda3"
struct ext2_super_block sb;
/* буфер для хранения таблицы дескрипторов групп */
unsigned char buff_grp[4096];
unsigned char buff[4096]; /* информационный буфер */
int indev; /* дескриптор файла устройства */
int BLKSIZE; /* размер блока файловой системы */
Определим несколько функций, которые нам понадобятся для работы:
Функция чтения суперблока:
Смещаемся на 1024 байта от начала раздела и считываем суперблок в структуру struct ext2_super_block sb:
if(lseek(indev,1024,0) < 0) <
if(read(indev,(char *)&sb,sizeof(sb)) < 0) <
Проверяем идентификатор файловой системы:
printf("Неизвестный тип файловой системы! ");
Значение 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);
Функция чтения таблицы дескрипторов групп:
Вычисляем размер блока файловой системы:
BLKSIZE = 1024 << sb.s_log_block_size
Таблица дескрипторов групп находится в блоке, который расположен сразу же за первым блоком данных (за суперблоком).
if(lseek(indev, (sb.s_first_data_block + 1) * BLKSIZE, 0) < 0) <
if(read(indev,buff_grp,BLKSIZE) < 0) <
Функция получения содержимого 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);
Функция чтения блока данных:
void read_iblock(struct ext2_inode *in, int blk_num)
Входные параметры функции – структура inode и номер блока (имеется в виду номер из последовательности адресных блоков, расположенных в inode).
Вычисляем смещение к информационному блоку на разделе и считываем этот блок в глобальный буфер buff:
pos = ((__u64)in->i_block[blk_num]) * BLKSIZE;
pread64(indev, buff, BLKSIZE, pos);
Функция получения содержимого корневого каталога:
struct ext2_inode in;
Порядковый номер inode корневого каталога известен, поэтому получаем содержимое inode корневого каталога и считываем в буфер buff его содержимое:
В буфере buff будет находиться содержимое корневого каталога.
Функция получения номера inode по имени файла:
int get_i_num(char *name)
Входные параметры функции – имя файла. Возвращаемое значение – порядковый номер inode файла.
int i = 0, rec_len = 0;
struct ext2_dir_entry_2 dent;
В буфере buff находится массив записей каталога. Для определения порядкового номера inode файла необходимо найти в этом массиве запись с именем этого файла:
memcpy((void *)&dent, (buff + rec_len), sizeof(dent));
if(!memcmp(dent.name, name, dent.name_len)) break;
А теперь распишем главную функцию:
Переменные и структуры:
struct ext2_inode in;
// абсолютное путевое имя файла
unsigned char *full_path = "/home/test.file";
unsigned char buff1[EXT2_NAME_LEN];
static int i = 1;
int n, i_num, outf, type;
Первым символом в абсолютном путевом имени файла должен быть прямой слэш (/). Проверяем это:
Открываем файл устройства, считываем суперблок и таблицу дескрипторов групп:
Получаем содержимое корневого каталога:
Сейчас в буфере buff находятся все записи корневого каталога (если хотите, можете сохранить их в отдельном файле). Теперь, имея записи корневого каталога, мы можем добраться до содержимого файла test.file, используя вышеприведенный алгоритм чтения файла. С этой целью организуем цикл. В теле цикла проведем разбор абсолютного путевого имени файла, выделяя его элементы – подкаталоги (он у нас один, home) и имя искомого файла (test.file). Для каждого элемента определим порядковый номер inode, считаем этот inode и затем получим содержимое нулевого блока (из последовательности адресных блоков, находящихся в inode):
for(n = 0 ; n < EXT2_NAME_LEN; n++, i++) <
Для каждого элемента абсолютного путевого имени файла определяем порядковый номер inode, считываем этот inode в память и затем получаем содержимое нулевого блока:
Отобразим информацию о файле (имя, порядковый номер 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);