Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #104, АВГУСТ 2007 г.

NTFS: учимся читать и писать

Крис Касперски

Хакер, номер #104, стр. 102

Обеспечиваем полный доступ к NTFS-разделам под Linux/BSD

Половина юниксоидов уверена, что поддержка NTFS в Linux/BSD отсутствует. Другая половина знает, что NTFS-тома доступы по крайней мере на чтение, но писать они опасаются, наслушавшись ужасных историй о разрушенных данных десятилетней давности. В действительности NTFS-драйверы уже несколько лет как отлажены и достаточно стабильны. Однако в работе с NTFS есть куча тонкостей, игнорирование которых приводит к развалу файловой системы. Как избежать краха? Как восстановить поломанный том? Мыщъх знает. И не только знает, но и готов рассказать тебе.

Потребность в работе с NTFS-разделами в Linux/BSD возникает достаточно часто, особенно при совместном использовании нескольких операционных систем (одной из которых является NT, или что-то производное от нее) на мультизагрузочном винчестере. Проблема в том, что NT крайне враждебно относится к своим конкурентам и принципиально не переваривает «чужеродные» файловые системы. А Linux и BSD из всех файловых систем, входящих в NT, штатным образом поддерживают только FAT12/16/32 (причем русские имена часто превращаются в «крякозябры»).

Как организовать обмен данными между Linux/BSD и NT? Некоторые предпочитают использовать флешки, благо их объем постоянно растет и они вполне годятся на роль файлообменника. Еще можно отформатировать один или несколько разделов диска под FAT, однако это не лучший выход из ситуации. FAT страдает множеством ограничений: он часто теряет кластеры, не поддерживает файлы и диски большого объема, также отсутствуют атрибуты защиты и т.д. Чем скорее мы забудем это наследие времен MS-DOS – тем лучше.

Другой вариант — установить NT-драйвер, позволяющий винде работать с Linux/BSD-разделами как со своими собственными. Такие драйверы действительно есть, хотя и не получили большого распространения. Написанные энтузиастами (у которых нет ни средств, ни времени для продвижения их на рынок), они пылятся на серверах, никем не рекламируемые, и большинство пользователей даже не подозревает об их существовании. А зря! Взять хотя бы ffsdrv-драйвер, добавляющий в NT поддержку FFS/UFS (основных файловых систем Free/Net/OpenBSD). Отличная штука, которую (вместе с исходными текстами) можно бесплатно скачать с ffsdrv.sf.net.

Обратную операцию (то есть заставить Linux/BSD понимать NTFS) осуществить намного сложнее. И совсем не потому, что NTFS - весьма продвинутая файловая система, которая open source программистам не по зубам. Вовсе нет! В мире UNIX встречаются и более навороченные ФС (например, ReiserFS). Причина в том, что Microsoft держит NTFS под спудом, отказываясь ее документировать, и потому расшифровку всех ключевых структур приходится выполнять путем обратного проектирования, что требует высокой квалификации исследователей, а сама реконструкция спецификации отнимает кучу времени и сил, так что по большому счету это не программистская, а хакерская работа.

С момента появления NTFS прошло более 15 лет, и за это время она была изучена вдоль и поперек. Свободные драйверы уже давно миновали стадию бета-версий, освоившись не только с чтением, но и с записью. Риск разрушения тома из-за ошибки в свободном драйвере является скорее психологическим, чем техническим фактором. Миллионы пользователей Linux/BSD монтируют NTFS-разделы на запись, доверяя свободным драйверам свои данные, и никто не жалуется! Единичные отказы, естественно, случаются, но имеют поправимый характер.

Составители *nix-дистрибутивов, проявляя свойственную им осторожность, либо вообще не включают в них свободные NTFS-драйверы, либо по умолчанию монтируют NTFS-разделы только на чтение, вызывая у пользователей уверенность, что запись реализована не лучшим образом и от нее следует держаться подальше. Действительно, NTFS-драйверы не свободны от проблем, и неподготовленному пользователю лучше с ними не связываться, однако все проблемы решаемы! Главное — это желание! Ну и документацию тоже невредно почитать.

NTFS в Linux

Первые свободные NTFS-драйверы возникли в рамках проекта Linux-NTFS Project. Он был основан хакером по прозвищу Martin von Loewis в далеком 1995 году (напоминаем, что Microsoft выбросила NTFS на рынок в 1993 году) и объединил целую плеяду знаменитых кодокопателей, которым потребовалось 2 года напряженных исследований на расшифровку базовых структур данных и создание первой стабильной версии свободного NTFS-драйвера, включенного в Linux-ядро в 1997 году (версия 2.1.74).

Группа просуществовала до конца 90-х, а затем распалась. Причиной тому послужила мелкая ошибка в драйвере, вылившаяся в крупные неприятности. Драйвер не проверял версию файловой системы, поскольку в тот момент других версий NTFS попросту не существовало в природе! Но с выходом W2K Microsoft преподнесла довольно пакостный сюрприз в виде несущественных (с точки зрения конечного пользователя), но фатальных (с точки зрения программиста) изменений файловой системы. В базовые структуры данных была добавлена пара новых полей. Соответственно, смещения всех остальных изменились, а драйвер, ожидающих их по старым адресам, при первой же попытке записи делал из диска кашу. Это не самым лучшим образом сказалось на его репутации, которую было уже не поднять и домкратом. Большинство историй о страшных разрушениях типа «дня Помпеи» берет свое начало именно здесь.

В 2002 году вышла новая версия NTFS-драйвера, переписанного с нуля уже новым командным составом: Anton Altaparmakov (лидер группы, создатель драйвера и служебных NTFS-утилит), Richard Russon, Jakob Kemi (создатели загружаемого модуля ядра), Pawel Kot (портирование нового драйвера в ядро) и другие.

Готовый к установке драйвер (вместе с исходными текстами и реконструированной спецификацией на NTFS) можно бесплатно скачать с сайта www.linux-ntfs.org, построенного по технологии wiki, существенно упрощающей процесс внесения изменений и уточнений в спецификацию, полученную, как уже говорилось, путем обратного проектирования и до сих пор незавершенную.

Microsoft не стоит на месте и непрерывно модифицирует свою файловую систему, вынуждая хакеров продолжать расшифровку, с чем они справляются вполне успешно, и текущая версия свободного драйвера поддерживает NTFS-разделы, созданные следующими операционными системами: NT 4.x, W2K, XP, Server 2003 и Vista (включая 32-битные и 64-битные версии).

Драйвер превосходно справляется с чтением NTFS-томов, однако до сих пор не поддерживает запись в сжатые, зашифрованные или разряженные файлы (sparse-files), что, собственно говоря, и неудивительно, поскольку поддержка записи появилась лишь в 2005 году и программистам еще предстоит проделать уйму работы, прежде чем они доведут ее до ума.

Практически все крупные дистрибутивы (за исключением RedHat/Fedora) уже поддерживают NTFS, и потому конечным пользователям нет никакой необходимости совершать какие-либо дополнительные телодвижения, ну разве что установить более свежую версию драйвера (примечание: RedHat и Fedora включают в себя альтернативный открытый драйвер NTFS-3G, о котором мы расскажем чуть ниже).

Проверить, поддерживает ли твой дистрибутив NTFS, поможет команда cat /proc/filesystems, и если NTFS действительно поддерживается, том смонтировать можно так:

# mkdir /mnt/windows

# mount /dev/hda1 /mnt/windows -t ntfs -r -o nls=utf8

Здесь ключ '-r' означает монтирование только на чтение, если его убрать, то раздел будет доступен и на запись.

А как быть, если нам очень хочется заполучить полноценную поддержку NTFS, включающую в себя работу с журналом транзакций, запись в сжатые или разряженные файлы? Тогда можно воспользоваться одной из многочисленных оберток штатного драйвера ntfs.sys, которая погружает его в виртуальную среду, эмулирующую исполнительную подсистему ntoskl.exe и обеспечивающую прозрачный ввод/вывод.

Достоинство этого метода в том, что мы получаем стопроцентную совместимость с NTFS-разделом, и потому риск испортить данные минимален. К тому же родной NTFS-драйвер обеспечивает намного более высокое быстродействие. Правда, эмулятор исполнительной системы съедает немалое количество памяти, что есть главный и, пожалуй, единственный существенный недостаток. Естественно, помимо обертки, нам потребуется дистрибутив Windows, поскольку лицензионные соглашения запрещают свободное распространение его компонентов. Но это не проблема! Если у нас есть NTFS-раздел, то логично предположить, что у нас имеется по меньшей мере одна копия Windows, так как у тру-юниксоидов потребности в работе с NTFS просто не возникает.

Осталось решить, какую обертку выбрать. Мыщъх долгое время пользуется оберткой от Jan'а Kratochvil'а, которую рекомендует и всем остальным. Последнюю версию, выпущенную в начале 2006 года, можно бесплатно скачать с www.jankratochvil.net/project/captive.

Архитектурно она состоит из свободной библиотеки FUSE (расшифровывающейся как Filesystem in Userspace — файловые системы в пользовательском пространстве (fuse.sf.net)), эмулятора исполнительной подсистемы NT, написанного на базе фрагментов исходных текстов, «позаимствованных» из открытого проекта ReactOS (www.reactos.com), транслятора запросов ввода/вывода, сделанного непосредственно самим Jan'ом Kratochvil'ом, и драйвера ntfs.sys, который пользователь должен самостоятельно выдрать из Windows-дистрибутива.

Монтирование дисков осуществляется вполне стандартным путем:

# mkdir /mnt/diskc

# mount -t captive-ntfs /dev/hda1 /mnt/diskc

Кстати говоря, поскольку рассматриваемая обертка реализована как прикладной процесс, с одной стороны, она не уронит ядро, если что-нибудь пойдет не так, но с другой – «продвинутый» (в кавычках) пользователь может «покилять» процесс, не дав драйверу сохранить на диск модифицированные данные, что чревато крахом всего дискового тома.

NTFS в xBSD

ВSD-подобные системы намного менее популярны, по сравнению с Linux, а на рабочих станциях они вообще редкость, в связи с чем NTFS-драйверы под них появились с большим опозданием.

Первый экспериментальный драйвер (кстати говоря, написанный российским программистом, скрывающимся под ником Семен) датируется 1999 годом, то есть он появился спустя целых 2 года после выпуска стабильной версии открытого Linux-драйвера — в компьютерной индустрии это огромный срок! Однако, после выхода нескольких бета-версий, пыл автора начал постепенно угасать и менее чем через полгода достиг абсолютного нуля. Обещанная полнофункциональная версия так и не вышла, в чем можно убедиться, посетив сайт iclub.nsu.ru/~semen/ntfs.

Поисковики позволяют найти несколько аналогичных проектов, стартовавших приблизительно в то же самое время и прекративших свою деятельность аналогичным образом. Оно и понятно. Количество пользователей BSD невелико, программистов среди них еще меньше, да и денег в создание NTFS-драйвера никто вкладывать не собирается.

Ситуация изменилась с выходом Mac OS X (а она основана, как известно, на ядре FreeBSD), сумевшей собрать целую армию пользователей, реально заинтересованных в работе с NTFS. Спрос в очередной раз породил предложение, и Anton Altaparmakov перенес открытый NTFS-драйвер с Linux'а на Mac OS X, отбранчив от основного проекта побочный продукт под названием NTFS-3G project, в настоящее время поддерживающий Mac OS X, FreeBSD, NetBSD, BeOS и Haiku.

Последнюю версию драйвера, датируемую 17 июня 2007 года, вместе с исходными текстами и документацией можно бесплатно скачать с сайта www.ntfs-3g.org. Однако вполне возможно, что ничего скачивать и не потребуется, поскольку некоторые дистрибутивы (как, например, PC-BSD), уже включают в себя драйвер NTFS-3G (естественно, второй или даже третьей свежести):

# mount -t ntfs-3g /dev/hda1 /mnt/windows -o locale=ru_RU.utf8

Кстати говоря, при попытке использования драйвера NTFS-3G под виртуальной машиной VMWare версии 5.0 и выше, последняя завершает свою работу крахом, для преодоления которого достаточно добавить в vmx-файл следующую строку:

mainMem.useNamedFile=FALSE

Заключение

Судя по всему, Microsoft утратила к NTFS всякий интерес, и, вопреки громким заявлениям о создании файловой системы нового поколения, Виста вышла с той же самой версий NTFS, что и XP. Благодаря этому обстоятельству, хакеры получили огромное преимущество, успев завершить расшифровку основных структур данных и выпустить открытые драйверы, поддерживающие более или менее полноценную работу с NTFS-разделами без угрозы потери данных.

Меры предосторожности при записи на NTFS-разделы

* Перед записью данных на NTFS-раздел из Linux/BSD настоятельно рекомендуется загрузить Windows и запустить chkdsk, чтобы убедиться в отсутствии ошибок. Дело в том, что штатный драйвер автоматически диагностирует дефекты файловой системы, блокируя запись до момента их исправления, а свободные драйверы — нет.

* После удаления/перемещения большого количества файлов и/или каталогов из-под Linux/BSD обязательно загрузи Windows и запусти chkdsk, поскольку свободные драйверы не учитывают ряд тонкостей NTFS, что ведет к накоплению мелких ошибок.

* При проверке тома, в который что-либо записывали свободные NTFS-драйверы, chkdsk, как правило, выдает сообщения об ошибках, однако это не повод для волнений. Обратись к документации, прилагаемой к драйверу, — в ней перечислены все некритичные ошибки и коротко описаны причины их появления.

* Никогда, ни при каких обстоятельствах не монтируй NTFS-раздел на запись, если работа Windows была завершена неправильно! В этом случае в журнале транзакций могут остаться записи, обеспечивающие откат при последующей загрузке операционной системы. Однако открытые драйверы все еще не поддерживают транзакции, а последствия отката диска, на который уже что-то писалось, непредсказуемы.

* Раздел, хотя бы однажды заполненный более чем на 90%, подвергается большому риску при монтировании на запись из-под Linux/BSD, поскольку при этом происходит усечение области, зарезервированной под метаданные. Свободные NTFS-драйверы обрабатывают эту ситуацию не совсем корректно.

Содержание
ttfb: 571.9850063324 ms