div.main {margin-left: 20pt; margin-right: 20pt}
Как самостоятельно сделать Bootable
CD-ROM
Несмотря на то, что
многие крупные фирмы создают свои варианты замены 3.5" дискет, обычный дисковод
все же находит свое место в подавляющем числе ПК, несмотря на низкую скорость и
маленький объем (только загрузочные файлы Windows 98 занимают 25% дискеты!).
Сегодня, в эпоху сетей и Интернета, дискеты, как переносчик информации
используются все реже. Одним из основных их применений остается загрузка ОС ПК в
случае установки нового диска, тестирования и настройки специфичного
оборудования, проверки на вирусы, восстановления информации с испорченного
жесткого диска.
К сожалению даже для
простейших из этих задач объема дискеты катастрофически не хватает (например,
базы антивирусов уже давно перевалили отметку в 1.44Мб). Объем тестовых программ
и дистрибутивов также не хочет уменьшаться. Конечно можно использовать
накопители типа IOmega ZIP, LS-120, однако гораздо более распространенным
устройством является CD-ROM. И к счастью уже года три существует стандарт, по
которому с этого устройства можно загрузить ПК.
Варианты применения:
загрузочный диск для диагностики, проверки на вирусы, установки системы "с
нуля"; backup системного раздела для быстрого восстановления системы; диски с
демо версиями ПО, презентациями, видео, слайд шоу. В последнем варианте ПК может
даже не иметь жесткого диска!
Как оказалось,
большинство информации по теме загрузочных CD в Internet не отличается полнотой
и строгостью. Поэтому я решил сам разобраться в стандартах, и попробовать
сделать какой-нибудь интересный диск. Тем более что с CD-RW это достаточно
безопасно :) .
Quick
Start
Что нам понадобится:
устройство CD-R/RW.
Очень желательно использовать на начальном этапе CD-RW, это позволит легко
исправить возможные ошибки. Тем не менее, для окончательного создания
предпочтительнее CDR, поскольку они читаются на большем числе приводов
чистый диск для него
программа Adaptec
Easy CD Creator (можно и CDRWIN, WinOnCD, Nero, etc)
загрузочная дискета
Вашей ОС (желательно с драйвером для используемого устройства CD-ROM)
ПК, который может
загружаться с CD-ROM, для проверки :)
Итак, все будет работать
так:
Для устройства 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Мб емкости диска.
Для того, чтобы добиться
такого эффекта:
открываем Adaptec
Easy CD Creator (ECDC)
создаем обычный диск
с необходимыми файлами (оставляем как минимум 1.44Мб места для образа дискеты)
параметры в CD Layout
Properties - ISO9660, Mode 1: CDROM, ставим отметку "Bootable"
после нажатия на Ok,
программа попросит вставить в дисковод заранее подготовленную системную
дискету, для того чтобы считать с нее образ
после считывания
видим, что в списке записываемых файлов появилось еще два - BOOTCAT.BIN и
BOOTIMG.BIN. Первый это так называемый каталог загрузочных образов, а второй -
побайтовая копия нашей дискеты, с помощью которой в момент загрузки будет
эмулироваться дисковод A:
последний штрих -
запись на CD. В режиме TAO диск можно не закрывать
Некоторые замечания к
плану. Пункт 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 эмулирует диск
A: . Установленный на ПК дисковод A: становится B:, остальные диски своих имен
не меняют. Доступ ко всему (до 640Мб) содержимому CD-ROM возможен через
загрузку с эмулированного A: драйвера CD-ROM (который может отличаться на
разных ПК!) и MSCDEX.EXE .
CD-ROM эмулирует диск
C: . При этом нумерация установленных на ПК дисков смещается. Такой вариант
позволяет получить доступ к 640Мб информации независимо от устройства CD-ROM,
т.к. загрузка его (возможно специфичного) драйвера необязательна.
Без эмуляции. Это,
означает, что при загрузке просто считывается программа по указанному адресу
указанной длинны и ей передается управление. Что происходит дальше с ПК, это
ее личное дело. Такой вид имеет например установочный диск Microsoft Windows
NT.
CD-ROM представляет
собой устройство с последовательной адресацией секторов с 0 до (обычно) 335249,
которые имеют размер 2048 байт (в Mode 1). Интересная для нас часть логической
структуры включает в себя:
Сектор |
|
0-15 |
|
16 |
Primary Volume Descriptor |
17 |
Boot Record Volume |
... |
|
BC |
Booting Catalog |
... |
|
BI_1-BI_m |
Bootable Disk Image |
... |
|
При этом эмуляция
включает в себя и трансляцию 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, нам
менять не надо.
Обратите внимание, что
смещение 0x8000 соответствует 16*2048.
Сектор 17 - Boot Volume
Descriptor
Его структура
подробно:
Смещение |
Тип |
Описание |
0 |
Byte |
Boot Record индикатор, 0 |
1-5 |
Byte |
ISO-9660 ID, должен быть “CD001” |
6 |
Byte |
Версия этого дескриптора, должно быть 1 |
7-26 |
Byte |
Boot System ID, должно быть “EL TORITO SPECIFICATION”
далее 0 |
27-46 |
Byte |
не используется, должен быть 0 |
47-4A |
Dword |
Абсолютная ссылка на Boot Catalog. |
4A-7FF |
Byte |
не используется, должен быть 0 |
Нужное нам здесь поле,
это ссылка на Booting Catalog. Его необходимо изменить для соответствия ссылке
на наш каталог.
В следующем секторе
находится индикатор окончания таблицы дескрипторов. Я не знаю наверняка, нужен
он или нет, но с ним точно все работает и диски, которые пишет ECDC его
имеют.
Следующий интересный
сектор, это собственно Booting Catalog.
Состоит он из двух
записей по 32 байта. Первая это Validation Entry:
Смещение |
Тип |
Описание |
0 |
Byte |
Header ID, должен быть 01 |
1 |
Byte |
ID платформы - 0 = 80x86, 1=Power PC, 2=Mac |
2-3 |
Word |
должен быть 0 |
4-1B |
Character |
ID string |
1C-1D |
Integer |
Контрольная сумма |
1E |
Byte |
Key byte, должен быть 0x55 |
1F |
Byte |
Key byte, должен быть 0xAA |
В принципе можно в любом
случае (для 80x86) использовать приведенную на картинке. А вот если Вы захотите
поменять ID string, то не забудьте исправить и контрольную сумму, так, чтобы
сумма всех слов в этой 32 байтной записи была равна 0.
Следующая запись
называется Initial/Default Entry:
Смещение |
Тип |
Описание |
0 |
Byte |
Boot Indicator - 88 = Bootable, 00 = Not Bootable |
1 |
Byte |
Boot media type |
2-3 |
Word |
Load Segment |
4 |
Byte |
System Type |
5 |
Byte |
должен быть 0 |
6-7 |
Word |
Sector Count |
8-0B |
Dword |
Load RBA |
0C-1F |
Byte |
должен быть 0 |
В случае нескольких
загрузочных образов после этой записи могут следовать другие, но такой вариант
мы не будем рассматривать.
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 для приготовления образа такого диска, но где взять
сегодня такой маленький диск и куда его подключить?
Структура такого
простого жесткого диска выглядит так:
Первый сектор - MBR =
загрузочный код + таблица разделов
Первый сектор второй
стороны - BootRecord первого раздела
Затем идут как и в
дискете две копии FAT, корневая директория, данные.
Таким образом, видно,
что единственное отличие от дискеты это использование таблицы разделов. Однако
за ним скрывается гораздо более глубокая проблема - как определить геометрию
диска по данным на нем? Ведь без этого любая работа с диском становится
проблематичной. Тем более, что у самого CD-ROMа используется обычная линейная
адресация и в рассмотренных структурах загрузочного CD-ROM нигде нет места такой
информации.
На самом деле это можно
узнать по таблице разделов. Если предположить, что конец раздела обязательно
приходится на последний сектор последней стороны некоторого цилиндра, то данные
из MBR помогут нам узнать количество секторов в дорожке и сторон в цилиндре!
Из этой таблицы видно,
что последним сектором каждого раздела является сектор номер 63, что с учетом
нумерации секторов с 1 дает нам 63 сектора на дорожку. Аналогично для количества
сторон получается цифра 255 (нумерация с 0!).
Кстати, тут же видно как
решается проблема 8Гб предела - вместо начала/конца раздела используются поля
относительного числа секторов и количества секторов в разделе, которые имеют
размер двойного слова.
Напомню, что в режиме
LBA адресация через CHS происходит так: LBA 0 = Cylinder 0, Head 0, Sector
1 LBA X = ((Cylinder * Maximum Heads + Head) * Sector per Track ) + Sector
-1
Как известно SCSI всегда
работает в LBA режиме - с прямой адресацией секторов. Просто ему приходится
эмулировать CHS для стандартного вида MBR и совместимости. Часто при этом в SCSI
BIOS можно выбрать режим трансляции из CHS для дисков до 1Гб и больше 1Гб.
(Кстати именно с различной трансляцией у разных контроллеров может быть связана
неработа SCSI диска, отформатированного на одном контроллере при установке на
другой).
Итак, было поведено
несколько опытов (количество циллиндров в нашем случае не важно; диск на 270
действительно работает в LBA):
IDE (Award
4.51)
Объем Мб |
Heads |
Sectors |
Cylinders |
270 |
32 |
63 |
262 |
540 |
32 |
63 |
524 |
1200 |
64 |
63 |
847 |
3500 |
128 |
63 |
621 |
13400 |
255 |
63 |
1650 |
SCSI (Tekram
DC-390)
Объем |
Heads |
Sectors |
<1G |
64 |
32 |
>1G |
255 |
63 |
Как Вы видите, все эти
ухищрения направлены на недостижение количества цилиндров отметки 1024. Это
связано с тем, что MBR, BIOS и многие другие, рассчитаны на хранение номера
цилиндра в 10 битах. И граница 8Гб как раз и идет от 1024*255*63 секторов. Или
можно посчитать эту границу по другому - только 3 байта на номер сектора в
режиме LBA.
Формально, BIOS для
загрузки должен сам обо всем догадаться, однако похоже это происходит не всегда.
Многие испытатели отмечали, что есть некоторая закономерность в том, с какого
диска - IDE или SCSI делать образ, и на каком CD-ROM он сможет
загрузиться.
Тем не менее
единственное требование, упомянутое в стандарте, это использование только одной
и только первой записи в Partition Table. К счастью этого легко
добиться.
Исходя из всего этого
был придуман и опробован следующий способ получения образа жесткого диска:
Создаем раздел
необходимого размера на жестком диске.
Форматируем
(FAT12/16), делаем системным (можно сразу format /s, а можно и sys потом).
Используем специально
написанную программу (getimg.zip),
которая по информации в BootRecord указанного диска воссоздает MBR и считывает
всю информацию в один файл.
Не забудьте только
приготовить необходимое место на другом диске или разделе.
Конечно у этого способа
есть недостаток - для дальнейшего создания CD-ROM потребуется еще столько же
места для ISO образа CD, однако будем надеяться, что сегодня найти 3*640Мб на
диске достаточно легко, тем более при наличии в ПК CDR :).
Что касается геометрии
жесткого диска, то вот результаты проведенных экспериментов по загрузке ПК с
различных образов:
тест |
SCSI |
ATAPI |
H 32 S 63, DOS-16 |
Yes (1) |
Yes (2) |
H 255 S 63, Windows 98 |
Yes (1) |
Yes |
H 64 S 32, Windows 98 (Zip drive) |
Yes (1) |
Yes |
(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.
Вот собственно и все что
удалось найти и проверить по этому вопросу.
Использовались:
Программы:
Adaptec Easy CD
Creator
Symantec DISKEDIT
Golden Hawk CDRWIN
Gilles Vollant
WinImage
Оборудование:
MB Chaintech 6BTS (с
AHA7880), AWARD BIOS 4.51
ASUS SD-S400 (ATAPI
CD-ROM)
Yamaha CRW6416S (SCSI
CD-ROM/CD-RW)
Ссылки:
Phoenix PC Industry
Specifications http://www.ptltd.com/products/specs.html
Andy McFadden CDR FAQ
http://www.fadden.com/
Создание загрузочного
CD с Авророй http://www.os2.ru/techn_sol/installos2/bootable_aurora.shtml
Кирилл Кочетков, (kochet@ixbt.com) Опубликовано -- 2 декабря
1999 г.
|