Как самостоятельно сделать Bootable CD-ROMНесмотря на то, что многие крупные фирмы создают свои варианты замены 3.5" дискет, обычный дисковод все же находит свое место в подавляющем числе ПК, несмотря на низкую скорость и маленький объем (только загрузочные файлы Windows 98 занимают 25% дискеты!). Сегодня, в эпоху сетей и Интернета, дискеты, как переносчик информации используются все реже. Одним из основных их применений остается загрузка ОС ПК в случае установки нового диска, тестирования и настройки специфичного оборудования, проверки на вирусы, восстановления информации с испорченного жесткого диска. К сожалению даже для простейших из этих задач объема дискеты катастрофически не хватает (например, базы антивирусов уже давно перевалили отметку в 1.44Мб). Объем тестовых программ и дистрибутивов также не хочет уменьшаться. Конечно можно использовать накопители типа IOmega ZIP, LS-120, однако гораздо более распространенным устройством является CD-ROM. И к счастью уже года три существует стандарт, по которому с этого устройства можно загрузить ПК. Варианты применения: загрузочный диск для диагностики, проверки на вирусы, установки системы "с нуля"; backup системного раздела для быстрого восстановления системы; диски с демо версиями ПО, презентациями, видео, слайд шоу. В последнем варианте ПК может даже не иметь жесткого диска! Как оказалось, большинство информации по теме загрузочных CD в Internet не отличается полнотой и строгостью. Поэтому я решил сам разобраться в стандартах, и попробовать сделать какой-нибудь интересный диск. Тем более что с CD-RW это достаточно безопасно :) . Quick StartЧто нам понадобится:
Итак, все будет работать так: Для устройства ATAPI установить в BIOS порядок загрузки, начинающийся с CD-ROM. Если нужно загрузиться со SCSI CD-ROMа, то установить в SCSI BIOS опцию "Boot from CD-ROM" в "Enable" (а в BIOS SETUP обязательно на первом месте "A", например "A,C"). В момент загрузки ПК, один из упоминавшихся BIOSов выдаст на экран надпись, о том, что он обнаружил в устройстве загрузочный CD и он установлен как диск A: . После этого начнется процесс загрузки с этого устройства. Если при этом на машине установлен дисковод, то он станет скрываться за буквой B:, остальные диски своих имен не поменяют. При записи на CD-ROM еще какие-то файлов кроме образа дискеты, доступ к ним возможен только после загрузки правильного драйвера и MSCDEX.EXE. Таким образом можно при загрузке с CD получить доступ ко всем 640Мб емкости диска. Для того, чтобы добиться такого эффекта:
Некоторые замечания к плану. Пункт 3 - на самом деле можно создать загрузочный диск и с Joilet, просто ECDC не дает в этом случае поставить галочку у "Bootable". А вот выбор "Mode 1" скорее всего обязателен. Пункт 4 - перед использованием дискеты желательно удостовериться в ее работоспособности: попробуйте защитить ее от записи и загрузиться с нее. Очень важно помнить, что для доступа к обычным файлам на CD-ROM (не файлам с дискеты) необходимо запустить драйвер CDROM и MSCDEX. Естественно они должны быть на используемой дискете и в CONFIG.SYS/AUTOEXEC.BAT все должно быть прописано. Одним из хороших примеров такой дискеты может служить Startup Disk от Windows 98. На нем есть драйвера CD-ROM под множество контроллеров, что дает возможность использовать CD-ROM и на ATAPI устройствах и на многих SCSI. Можно немного подправить эту дискету под конкретные нужды. Я сделал так: Список файлов: AUTOEXEC.BAT DRVSPACE.BIN COMMAND.COM FORMAT.COM KEYB.COM MODE.COM SYS.COM VC.COM EGA3.CPI EMM386.EXE FDISK.EXE MSCDEX.EXE VC.INI ASPI2DOS.SYS ASPI4DOS.SYS ASPI8DOS.SYS ASPI8U2.SYS ASPICD.SYS BTCDROM.SYS BTDOSM.SYS CONFIG.SYS COUNTRY.SYS DISPLAY.SYS FLASHPT.SYS HIMEM.SYS IO.SYS KEYBRD3.SYS MSDOS.SYS OAKCDROM.SYS CONFIG.SYS files=10 buffers=10 dos=high,umb stacks=9,256 lastdrive=z device=himem.sys /testmem:off device=emm386.exe ram device=display.sys con=(ega,,1) country=007,866,country.sys device=oakcdrom.sys /D:MSCD001 device=btdosm.sys device=flashpt.sys device=btcdrom.sys /D:MSCD001 device=aspi2dos.sys device=aspi8dos.sys device=aspi4dos.sys device=aspi8u2.sys device=aspicd.sys /D:MSCD001 install=mscdex.exe /D:MSCD001 /L:R AUTOEXEC.BAT @echo off set temp=c:\ set tmp=c:\ mode.com con cp prepare=((866) ega3.cpi) mode.com con cp select=866 keyb.com ru,,keybrd3.sys path=a:\;r:\ Несмотря на простоту, даже в этом варианте есть подводные камни: он рассчитан на наличие в ПК только одного устройства CD-ROM (с которого и идет загрузка). Иначе возможно, что после загрузки с дискеты Вы не сможете получить доступ к остальному содержимому CD из-за конфликта драйверов. Для проверки всех тонкостей, обязательно проверьте перед записью возможность загрузки ПК с подготовленной дискеты, правильность подключения драйвера CD-ROM. Вообще лучше оставить с CONFIG.SYS единственный драйвер (что конечно снижает универсальность) или сделать меню для выбора его при загрузке. В крайнем случае можно нажать F8 и включить пошаговый режим загрузки, потом выбрать только необходимый драйвер. Обратите внимание, что рекомендуется не использовать явных указаний путей, например device=himem.sys вместо device=a:\himem.sys. Итак, если после этого ПК смог загрузиться со сделанного диска, первый этап пройден. Далее мы рассмотрим суть процесса загрузки с CD-ROM и опишем путь решения проблемы с доступом ко всему объему диска без драйверов. Как это на самом деле работаетБлагодаря стараниям фирм Phoenix и IBM на свет появился “El Torito” Bootable CD-ROM Format Specification, версия 1.0 которого датирована 25 января 1995г. Хотя спецификация допускает наличие множественных загрузочных образов (и выбор их из меню при загрузке) на одном диске, мы рассмотрим для простоты вариант с единственным образом. Этот стандарт определяет возможность эмуляции CD-ROMом диска A: или C: во время загрузки ПК. При этом возможны такие варианты:
CD-ROM представляет собой устройство с последовательной адресацией секторов с 0 до (обычно) 335249, которые имеют размер 2048 байт (в Mode 1). Интересная для нас часть логической структуры включает в себя:
При этом эмуляция включает в себя и трансляцию 4-х 512 байтных секторов в 2048 байтные на CD. Для работы технологии загрузки используется возможность иметь на одном диске несколько описаний томов. Например при записи в формате Joilet используется просто два дескриптора - для ISO9660 и для Joilet, что повышает совместимость диска очень незначительной ценой объема. Сравните с длинными именами в Windows 95 - там в каждом элементе каталога располагается две записи - стандартная MS-DOS 8.3 и длинное имя Windows 95. На CD немного по другому, там есть два разных каталога, один ISO9660 с короткими именами, а второй Joilet - с длинными в unicode. А сами файлы занимают одно и тоже место. Просто на них есть ссылки из обоих каталогов. И если система (ее драйвер cdfs) умеет читать Joilet, то он это и делает, а если нет, то читает стандартный ISO9660. Для исследования структуры CD-ROM используем его ISO образ - посекторную копию диска (об используемых для его получения программах см. в конце статьи). Сектор 16 - PVD, нам менять не надо. Его начало имеет такой вид (смотрим образ диска diskeditом) : Обратите внимание, что смещение 0x8000 соответствует 16*2048. Сектор 17 - Boot Volume Descriptor должен иметь такой вид: Его структура подробно:
Нужное нам здесь поле, это ссылка на Booting Catalog. Его необходимо изменить для соответствия ссылке на наш каталог. В следующем секторе находится индикатор окончания таблицы дескрипторов. Я не знаю наверняка, нужен он или нет, но с ним точно все работает и диски, которые пишет ECDC его имеют. Следующий интересный сектор, это собственно Booting Catalog. В моем примере он располагается в секторе 0x1D (0x1D * 2048 = 0xE800): Состоит он из двух записей по 32 байта. Первая это Validation Entry:
В принципе можно в любом случае (для 80x86) использовать приведенную на картинке. А вот если Вы захотите поменять ID string, то не забудьте исправить и контрольную сумму, так, чтобы сумма всех слов в этой 32 байтной записи была равна 0. Следующая запись называется Initial/Default Entry:
В случае нескольких загрузочных образов после этой записи могут следовать другие, но такой вариант мы не будем рассматривать. Boot Media Type Этот байт определяет, какой носитель будет эмулироваться. Для этого используются биты 0-3 (остальные должны быть 0): 0 - без эмуляции, 1 - дискета 1.2Мб, 2 - дискета 1.44Мб, 3 - дискета 2.88Мб, 4 - жесткий диск. Load Segment В этом слове содержится адрес сегмента, в который будет загружен MBR/Boot Sector образа. Для IBM PC это 0x7C0. (Если в этом поле 0, то также используется традиционный 0x7C0). System Type Этот байт должен соответствовать байту типа системы в таблице разделов загрузочного образа. Например DOS-12 - 0x01, DOS-16 - 0x04, BIGDOS - 0x06 (>32Мб). Для дискеты ECDC устанавливает его в 0, скорее всего он прав. Sector Count Это поле задает число секторов (эмулированных - в расчете 512 байт на сектор), которые считаются в вышеуказанный сегмент при загрузке. В нашем случае достаточно одного сектора. Load RBA Адрес первого сектора образа диска на CD. Далее необходимо подготовить загрузочный образ. Образ дискетыНу с этим ничего сложного нет. Любой программой (тем же diskedit например) считываем все сектора дискеты в файл. В нем последовательно находятся Boot Record, FAT1, FAT2, корневая директория, собственно файлы. Про формат дискеты (1.2, 1.44 ...) сказано и в Booting Catalog и в самом образе в Boot Record. Образ жесткого дискаА вот с этим пришлось сильно повозиться. Сильно смущали упоминания ISO, ghost, diskedit, при подготовке этого образа. Конечно, скорее всего, если взять диск не более 640Мб, создать на нем один раздел, поставить систему и т.д., то наверное и можно было использовать diskedit для приготовления образа такого диска, но где взять сегодня такой маленький диск и куда его подключить? Структура такого простого жесткого диска выглядит так:
Таким образом, видно, что единственное отличие от дискеты это использование таблицы разделов. Однако за ним скрывается гораздо более глубокая проблема - как определить геометрию диска по данным на нем? Ведь без этого любая работа с диском становится проблематичной. Тем более, что у самого CD-ROMа используется обычная линейная адресация и в рассмотренных структурах загрузочного CD-ROM нигде нет места такой информации. На самом деле это можно узнать по таблице разделов. Если предположить, что конец раздела обязательно приходится на последний сектор последней стороны некоторого цилиндра, то данные из MBR помогут нам узнать количество секторов в дорожке и сторон в цилиндре! Например (снова используем diskedit): Из этой таблицы видно, что последним сектором каждого раздела является сектор номер 63, что с учетом нумерации секторов с 1 дает нам 63 сектора на дорожку. Аналогично для количества сторон получается цифра 255 (нумерация с 0!). Кстати, тут же видно как решается проблема 8Гб предела - вместо начала/конца раздела используются поля относительного числа секторов и количества секторов в разделе, которые имеют размер двойного слова. Напомню, что в режиме LBA адресация через CHS
происходит так: Как известно SCSI всегда работает в LBA режиме - с прямой адресацией секторов. Просто ему приходится эмулировать CHS для стандартного вида MBR и совместимости. Часто при этом в SCSI BIOS можно выбрать режим трансляции из CHS для дисков до 1Гб и больше 1Гб. (Кстати именно с различной трансляцией у разных контроллеров может быть связана неработа SCSI диска, отформатированного на одном контроллере при установке на другой). Итак, было поведено несколько опытов (количество циллиндров в нашем случае не важно; диск на 270 действительно работает в LBA): IDE (Award 4.51)
SCSI (Tekram DC-390)
Как Вы видите, все эти ухищрения направлены на недостижение количества цилиндров отметки 1024. Это связано с тем, что MBR, BIOS и многие другие, рассчитаны на хранение номера цилиндра в 10 битах. И граница 8Гб как раз и идет от 1024*255*63 секторов. Или можно посчитать эту границу по другому - только 3 байта на номер сектора в режиме LBA. Формально, BIOS для загрузки должен сам обо всем догадаться, однако похоже это происходит не всегда. Многие испытатели отмечали, что есть некоторая закономерность в том, с какого диска - IDE или SCSI делать образ, и на каком CD-ROM он сможет загрузиться. Тем не менее единственное требование, упомянутое в стандарте, это использование только одной и только первой записи в Partition Table. К счастью этого легко добиться. Исходя из всего этого был придуман и опробован следующий способ получения образа жесткого диска:
Не забудьте только приготовить необходимое место на другом диске или разделе. Конечно у этого способа есть недостаток - для дальнейшего создания CD-ROM потребуется еще столько же места для ISO образа CD, однако будем надеяться, что сегодня найти 3*640Мб на диске достаточно легко, тем более при наличии в ПК CDR :). Что касается геометрии жесткого диска, то вот результаты проведенных экспериментов по загрузке ПК с различных образов:
(1) в этом тесте после загрузки правильно виден только раздел D: жесткого диска (был C:). Скорее всего это связано с реализацией SCSI BIOS, т.к. он перехватывает Int 13 и не совсем прозрачно его использует. (2) естественно раздел жесткого диска ПК с FAT32 не виден, т.к. система DOS 6.22 Таким образом никаких проблем с несовместимостью геометрии эмулируемого диска отмечено не было и можно сказать, что AWARD 4.51 BIOS и немного хуже Adaptec 7880 SCSI BIOS 1.32 справляются с идентификацией образа диска. Загрузка с эмуляцией жесткого дискаТеперь опишем, как все это можно сделать для варианта с жестким диском. Общий принцип такой: используем программу ECDC для подготовки ISO образа диска. Потом немного его правим diskeditом и записываем на CD. Единственное, что я не совсем чисто решил, как добавить в структуру описаний томов, необходимый Boot Volume Descriptor. Проблема в том, что он должен располагаться в секторе 17. А в подготовленном образе там может быть что-то еще. Я сделал так (ценой Joilet, хотя она и так без GUI не работает): для образа указал в тип файловой системы Joilet, это привело к тому, что в секторе 17 оказался дескриптор тома Joilet, потом просто заменил его на Boot Volume Descriptor. А в 18 секторе - как и надо завершающий Volume Descriptor. Booting Catalog и образ загрузочного диска могут располагаться в любом месте, поэтому мы их просто добавляем как файлы (желательно первыми, чтобы потом долго не искать). Для первого берем просто файл длинны 2048 с запоминающимся содержимым (например заполненный строчкой "BC**"). Второй и есть образ диска. Назовем его image.bin. После создания образа (File -> Create CD image, записываем как .ISO), определяем, в какие сектора ECDC записал наш bootcat.bin и image.bin. Для этого открываем файл в diskedit и ищем по "BC**". Это будет bootcat.bin. Скорее всего он находится в секторе 0x1D, смещение в файле 0xE800, следом за ним (0xF000) видим MBR нашего образа жесткого диска. Еще один вариант поиска местоположения этих файлов, основанный на ISO каталоге, это поискать их имена в ISO образе и взять двойное слово на 31 байт раньше названия: В 17 сектор (смещение 0x8800) записываем Boot Volume Descriptor, как указано выше, проверяем, что в байтах 0x47-0x4A правильная ссылка на Booting Catalog (у нас 0x0000001D): 0008800: 00 43 44 30 30 31 01 45 - 4C 20 54 4F 52 49 54 4F 0008810: 20 53 50 45 43 49 46 49 - 43 41 54 49 4F 4E 00 00 0008820: 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 0008830: 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 0008840: 00 00 00 00 00 00 00 1D - 00 00 00 00 00 00 00 00 Остальные нули. Такой файл можно скачать здесь - bootvd.bin. В адреса 47-4A для наглядности записано 0x12345678. Теперь создаем Booting Catalog (сектор 0x1D): 000E800: 01 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 000E810: 00 00 00 00 00 00 00 00 - 00 00 00 00 AA 55 55 AA 000E820: 88 04 C0 07 04 00 01 00 - 1E 00 00 00 00 00 00 00 000E830: 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 Здесь указаны такие параметры: загрузочный образ (88), эмуляция жесткого диска (04), адрес 0x7C0, раздел DOS-16, загружать один сектор, начало образа диска - сектор 0x0000001E. Вот этот файл bootcat.bin. Еще раз все проверив, записываем подправленный образ на CD: открываем ECDC, File -> Create CD from Disk image. Вот собственно и все что удалось найти и проверить по этому вопросу. Использовались:Программы:
Оборудование:
Ссылки:
|