Как самостоятельно сделать 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Мб емкости диска.

Для того, чтобы добиться такого эффекта:

  1. открываем Adaptec Easy CD Creator (ECDC)
  2. создаем обычный диск с необходимыми файлами (оставляем как минимум 1.44 Мб места для образа дискеты)
  3. параметры в CD Layout Properties — ISO9660, Mode 1: CDROM, ставим отметку «Bootable»
  4. после нажатия на Ok, программа попросит вставить в дисковод заранее подготовленную системную дискету, для того чтобы считать с нее образ
  5. после считывания видим, что в списке записываемых файлов появилось еще два — BOOTCAT.BIN и BOOTIMG.BIN. Первый это так называемый каталог загрузочных образов, а второй — побайтовая копия нашей дискеты, с помощью которой в момент загрузки будет эмулироваться дисковод A:
  6. последний штрих — запись на 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
...  

При этом эмуляция включает в себя и трансляцию четырех 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 должен иметь такой вид:



Его структура подробно:

Смещение Тип Описание
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. В моем примере он располагается в секторе 0x1D (0x1D * 2048 = 0xE800):



Состоит он из двух записей по 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 помогут нам узнать количество секторов в дорожке и сторон в цилиндре! Например (снова используем diskedit):



Из этой таблицы видно, что последним сектором каждого раздела является сектор номер 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. К счастью этого легко добиться.

Исходя из всего этого был придуман и опробован следующий способ получения образа жесткого диска:

  1. Создаем раздел необходимого размера на жестком диске.
  2. Форматируем (FAT12/16), делаем системным (можно сразу format /s, а можно и sys потом).
  3. Используем специально написанную программу (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.

Вот собственно и все что удалось найти и проверить по этому вопросу.

Использовались:

Программы:

  1. Adaptec Easy CD Creator
  2. Symantec DISKEDIT
  3. Golden Hawk CDRWIN
  4. Gilles Vollant WinImage

Оборудование:

  1. MB Chaintech 6BTS (с AHA7880), AWARD BIOS 4.51
  2. ASUS SD-S400 (ATAPI CD-ROM)
  3. Yamaha CRW6416S (SCSI CD-ROM/CD-RW)





Дополнительно