Конфиденциальная информация WindowsПарадокс файловой системы

Рэймонд Чен (Raymond Chen)

Если вы интересовались расположением файлов на жестком диске, вы наверняка замечали, что не так уж мало файлов операционной системы находятся в корневом каталоге загрузочного диска. Если присмотреться к этим файлам, можно заметить интересную вещь: файлы boot.ini, NTLDR и NTDETECT.COM являются основными загрузочными файлами, а файл hiberfil.sys — это файл спящего режима. Все эти файлы используются на наиболее важных первых этапах загрузки операционной системы или, в случае с файлом hiberfil.sys, на этапах восстановления после спящего режима. Эти файлы должны входить в корневой каталог загрузочного диска. Почему их нельзя переместить в какой-либо другой каталог?

Мой коллега, Эдриан Онэй (Adrian Oney), дает следующее объяснение: для чтения загрузочных файлов, находящихся не на диске, нужен драйвер файловой системы, но драйвер файловой системы находится на диске, чтение которого невозможно, если драйвер файловой системы не загружен. Замкнутый круг.

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

  

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

Пользователям ранних версий MS-DOS® хорошо знакома проблема, связанная с местоположением загрузочных файлов операционной системы. Старая команда SYS превращала ничем не примечательную дискету в магическую загрузочную дискету. Однако попытки использовать дискету, на которой хранятся данные, могли с большой долей вероятности закончиться неудачей, потому что для ранних версий MS-DOS загрузочные файлы должны были занимать определенное место на дискете, чтобы загрузочный сектор мог их найти. В более поздних версиях MS-DOS программа начальной загрузки была усовершенствована, что несколько упростило процесс загрузки. И все же даже в улучшенных версиях системные файлы должны были находиться в корневом каталоге.

Один клиент как-то спросил «Можно переместить файл спящего режима в подкаталог?» В конце концов, какая разница, где расположен файл? Списки управления доступом останутся прежними, куда бы файл ни был перемещен. Поскольку пользователи хотели переместить файл на жесткий диск, который не являлся загрузочным, пришлось объяснить им, что этого нельзя делать. Они не совсем поняли причину запрета, поэтому не сразу отказались от своей идеи: если переместить файл в подкаталог, то можно создать каталог и использовать его как соединение, позволяющее указать размещение файла спящего режима. Ура! Мне удалось переместить файл спящего режима!

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

Когда-нибудь нас обязательно спросят, можно ли переместить файл спящего режима в узел DFS. Это лишь вопрос времени.

Рэймонд Чен (Raymond Chen) на своем веб-узле The Old New Thing (Хорошо забытое старое) и в книге с таким же названием (издательство Addison-Wesley, 2007 г.) рассказывает об истории развития Windows и касается вопросов программирования в среде Win32. В Интернете его зовут Raymond, а может быть, и Chenster.

© 2008 Корпорация Майкрософт и компания CMP Media, LLC. Все права защищены; полное или частичное воспроизведение без разрешения запрещено.