В основном наши жесткие диски имеют более одного раздела и не всегда эти разделы могут быть одной и той же файловой системы. Например, ОС Windows зачастую имеет разделы FAT и NTFS, а ОС семейства UNIX - файловую систему ext. Нередко системные программисты имеют несколько ОС на своих машинах и доступ к различным файловым системам очень важен. Вот только ОС Windows не может видеть разделы файловой системы ext без дополнительного ПО.
Программа Ext2Fsd - это драйвер для файловой системы ext (версий 2\3\4), он реализует поддержку этих файловых систем на уровне ядра операционной системы. С разделами диска и накопителями, отформатированными в эти файловые системы, можно работать как с обычными, поддерживаемыми Windows устройствами информации в окне проводника или сторонних программ. Драйвер позволяет прозрачно читать и записывать данные [1].
Во время установки ПО пользователь может выбрать поддерживаемые версии файловой системы ext, а также автоматически монтировать разделы при запуске системы после установки будет запущен Volume Manager, где пользователь сможет смонтировать раздел ext c выбором буквы раздела.
Достоинства: простота использования, бесплатная лицензия, монтирование разделов ext на уровне ядра ОС Windows, ext разделы видны в проводнике Windows.
Недостатки: не поддерживает журналирование файловой системы ext4, давно не обновлялось и не планируются новые версии ПО.
Программа DiskInternals Linux Reader является бесплатной и позволяет получить доступ к файлам из файловых систем Ex2/3/4, UFS2, HFS и ReiserFS/4. Кроме того, инструмент может читать обычные файловые системы, поддерживаемые Windows, такие как NTFS, Fat, exFat и т.д.
Программа имеет аккуратный интерфейс, который схож с проводников Windows, что делает Linux Reader очень простым в использовании. Программа имеет практически все стандартные функции, такие как поисковое окно, кнопки навигации, последние файлы и папки. Также можно указать вид и сортировать файлы по всем доступным свойствам [1].
Достоинства: Большой список файловых систем, гарантированная поддержка продукта, понятный интерфейс.
Недостатки: открывает раздел в режиме "только чтение", для расширенных возможностей необходимо заплатить.
Рассмотренные утилиты не являются единственными для решения задачи доступа из Windows к разделам с файловой системой Ext4. Однако большинство программ имеет аналогичные недостатки - предоставление не полного доступа к такому разделу. Поэтому актуальной остается задача разработки приложения, предоставляющего из Windows полный доступ к разделам с Ext4.
Структура файловой системы Ext4, характерной для большинства ОС семейства UNIX, во многом отличается от файловых систем ОС Windows. Поэтому на первом этапе разработки приложения необходимо рассмотреть особенности этой файловой системы.
Ext4 - четвертая версия расширенной файловой системы (Fourth Extended File System). Основой Ext4 является разделение всего пространства раздела на блоки. Часть данных нулевого блока размером в 1024 байта зарезервирована для загрузчика, или других потребностей системы. Следом за этим массивом идет суперблок (ext4 Super Block). Номера блоков считаются с 0. Если размер блока равен 1024, то суперблок находится не в нулевом блоке, а в первом. За блоком суперблока следует группа 0. Структура группы показана на рисунке 1 [[2], [3]].
Одна из самых ценных особенностей файловой системы является низкая фрагментация данных. Это достигается при помощи следующих механизмов [4]:
Приложение, осуществляющее доступ к разделу с файловой системой ext4 из ОС Windows должно иметь возможность обращения к низкоуровневым функциям доступа к диску. Такие функции выполняет драйвер файловой системы - программа, которая работает в режиме ядра ОС Windows. Режим ядра - привилегированный режим, сопоставленный с аппаратным 0-м кольцом защиты процессора. Он характеризуется привилегиями доступа кода к ресурсам (памяти, процессору, устройствам и т.д.), что необходимо в процессе разработки программы [3].
Поэтому разработанное программное обеспечение должно состоять из программы, обеспечивающей интерфейс пользователя и из драйвера файловой системы.
Пользовательская программа может взаимодействовать с драйвером в системе двумя способами:
В первой случае в прикладной программе вызывается какая-либо функция Win32 API (например, CreateFile), которая, затем, в зависимости от целевого объекта (файла, каталога) может вызвать в цепочке своих вызовов функцию обмена с драйвером. Фактически, в этом случае код приложения не ставит своей задачей взаимодействовать с каким-либо драйвером, просто по цепочке вызовов процедур, на определенном этапе выполнение уходит в режим ядра и там происходит вызов функции драйвера. Все это остается сокрытым от разработчика, однако возможно отследить взаимодействие при помощи отладочных средств.
Второй случай возникает, когда под вызовом драйвера подразумевается не косвенный вызов (посредством вызова типовой функции), а передача при помощи специальной функции (например, DeviceIoControl) так называемого запроса ввода/вывода (I/O control request), который, в дальнейшем, инициирует формирование блока данных под названием пакет запроса ввода-вывода.
Так как любой драйвер считается участником ввода-вывода, Windows посылает им специальные пакеты - IRP (I/O Request Packet - пакет запроса ввода-вывода). При чем взаимодействие пользовательской программы с драйвером происходит только через системные вызовы (Windows API). Этот вызов приводит к тому, что диспетчер ввода-вывода формирует на основе него IRP. Драйвер, которому присылается этот пакет, может отложить выполнение задачи. Так в Windows реализована поддержка асинхронного ввода-вывода.
Драйвер файловой системы (FSD - File System Driver) - драйвер, который управляет форматом файловой системы. Для работы ему необходимо регистрироваться у диспетчера ввода-вывода, а также тесно взаимодействовать с диспетчером памяти для управления кэшем. После того, как драйвер зарегистрирован, диспетчер может вызвать его для распознавания томов файловой системы. Процесс распознавания включает в себя анализ загрузочного сектора и анализ метаданных файловой системы. Если том не распознался, ему назначают драйвер Raw, который предлагает отформатировать том. Драйвер Raw предоставляет чтение и запись на уровне секторов, что все-таки позволяет получить доступ к устройству [5].
Самым обычным способом доступа к файлам является вызов функций CreateFile, ReadFile, WriteFile. Открытие файла происходит при помощи функции CreateFile. Она вызывает функцию NtCreateFile, в которую передается полный путь к имени файла с префиксом "\\??". В свою очередь, NtCreateFile вызывает функцию ObOpenObjectByName, которая выполняет анализ имени и с помощью диспетчера объектов преобразует букву диска в имя \\Device\\HarddiskVolume(x), где (x) - номер, который присвоила разделу система. Функция IopParseDevice, которую она вызывает проверяет данные о безопасности и генерирует IRP запрос IRP_MJ_CREATE. Затем запрос передается, с помощью функции IoCallDriver, самому драйверу. Драйвер обязан найти нужный файл и, при успешном поиске, а также при соответствии учетных данных, должен вернуть код успешного завершения. Диспетчер объектов создает дескриптор для файлового объекта и вернет его по цепочке функций в CreateFile. Далее могут следовать различные вызовы для чтения и записи файлов.
С Windows 2000, на смену модели драйверов VxD, пришла модель WDM (Windows driver model). Она обладала расширенными возможностями, однако возросла сложность написания и поддержки кода. Для того, чтобы облегчить процесс разработки Microsoft выпустила фреймворк WDF (Window Driver Frameworks), который принес с собой два инструментария: Kernel Mode Driver Framework (KMDF) и User Mode Driver Framework (UMDF). Первое служит для написания стандартных драйверов уровня ядра, а второй - для написания определенных классов драйверов, которые могут исполняться на уровне пользователя.
Драйвер файловой системы ext4 для Windows необходим по причине того, что до сих пор нет полной реализации файловой системы в режиме записи. Дальнейшие исследования и разработка будут связаны с написанием драйвера на языке программирования С/С++. С помощью этого драйвера пользователь из ОС Windows сможет легко монтировать разделы, читать и редактировать файлы ФС ext4.
На основе анализа достоинств и недостатков существующих решений, изучив структуру и методы доступа к файловой системе ext4, мы можем поставить требования к драйверу, который сможет обеспечить доступ на чтение и редактирование файлов и каталогов ФС ext4 из-под ОС Windows: