How to make a PC-bootable CD
Initial release 29-Apr-1997
Last update 02-Jun-1998
Version 9'th/V1.02/006
If you can't understand Japanese, See English version(Draft).
What's New !
02-Jun-98 一年ぶりのmkbootcd新版1.02リリース。
22-Jun-97 テスト結果7'th->8'th GateWay P5/90 AMI BIOSの結果を追加
18-Jun-97 getbtimg β005->β006.ファイナルβの予定。
16-Jun-97 Diamond FirePort 40テスト結果追加。
13-Jun-97 getbtimg β004->β005.
09-Jun-97 mkbootcd V008d w/ document, multi entryテスト結果。
注意: 良く読んで、全て自分の責任で試してください。
英語ページ/掲示板も読んでください。翻訳しただけのものではありません。構成から違います。
始めに
構造
作り方
テスト結果
掲示板(関連最新情報があります。レポート、質問もこちらへ)
ユーティリティ:
MkBootCD Version1.02 - ISOイメージを加工してBootableに。
GetBtImg Version006 - floppy/Diskからブートイメージを取り出す。
始めに
Bootable CD-ROMフォーマットの規格、El Torito CD-ROM Boot v1.0はBIOSメーカー、Phoenixの資料ページから入手することが出来ます。なるべく入手してから始めてください。
構造
Boot Record Volume Descriptor
最初にBoot Record Volume Descriptorが必要です。これはセクタ17(0x11)に無ければなりません。このセクタは通常、ISOイメージに最初から含まれています。
typedef struct BRVD_t {
byte Indicator; /*0x00: 必ず0 */
byte Identifier[5]; /*0x02: 文字列"CD001" */
byte Version; /*0x07: このディスクリプターのVersion 必ず1 */
byte BSIdentifier[32]; /*0x08-27: 文字列"EL TORITO SPECIFICATION" あまりは0で埋める */
byte stab0[32]; /*0x28-47: 未使用、0で埋める */
dword BootCatalogP; /*0x48-4b: Boot Catalogへのポインター */
byte stab1[0x7b5]; /*0x4c-7ff:未使用、0で埋める */
} BRVD;
CDの場合1セクタ=2048byteなのでISOイメージのアドレスで言うと0x8800hになります。その前のPrimary Volume,セクタ10h,アドレス0x8000hにも"CD001"と書いてあるので間違ってそちらを編集しないように注意してください。
00008800 0043 4430 3031 0145 4C20 544F 5249 544F .CD001.EL TORITO
00008810 2053 5045 4349 4649 4341 5449 4F4E 0000 SPECIFICATION..
00008820 0000 0000 0000 0000 0000 0000 0000 0000 ................
00008830 0000 0000 0000 0000 0000 0000 0000 0000 ................
00008840 0000 0000 0000 0015 0000 0000 0000 0000 ................
.
.
00008FFF 0000 0000 0000 0000 0000 0000 0000 0000 ................
ここでは赤で示したBoot Catalogへのポインターのみ可変です。
Boot catalog
次はBoot Record Volume Descriptorが指していたBooting Catalogです。Booting Catalogの最初にはValiditation Entryが必要です。ここは通常のISOイメージにはありませんので、この内容を書き込んだファイルを含むISOイメージを作成してそのファイルの位置をISOイメージ中のBoot Record Volume DescriptorのBootCatalogPへ書き込むことになります。
Validation Entry
typedef struct VE_t {
byte HeaderID; /*0x00: 必ず 1 */
byte PlatformID; /*0x01: 0=80x86, 1=PowerPC, 2=Mac ここでは必ず1 */
word reserve; /*0x02-03: リザーブ、必ず0 */
char ID[24]; /*0x04-1B: CD-ROMの作成者 */
short int CheckSum; /*0x1C-1D: Check Sum */
byte KeyByte1; /*0x1E: Key Byte必ず0x55 */
byte KeyByte2; /*0x1F: Key Byte必ず0xAA */
} VE;
この例では 0x00000015ですからISOイメージのA800から始まります。
0000A800 0100 0000 4769 676F 2773 2042 6F6F 7461 ....Gigo's Boota
0000A810 626C 6520 4344 2054 4553 5400 0F7E 55AA ble CD TEST..~U.
ここではオレンジ色で示した作成者のところが変えられます。書き換えた場合は0x00-0x1fをワード単位で加算したときに0になるように赤色で示したチエックサムを再計算してください。。80x86では上位と下位がひっくり返っていることを忘れたり、バイト単位のチエックサムを入れたりすると無効になってしまうので注意が必要です。
Entry
VEの後にはInitial/Default Entryが続きます。ここが一番、重要です。
typedef struct bootEntry_t {
byte bootIndicator; /*0x00: 0x88=Bootable, 0x00 not Bootable */
byte bootMediaType; /*0x01: 0=NO Emulation, 1=1.2MFD, 2=1.44MFD, 3=2.88MFD,4 =HDD */
word bootLoadSegment; /*0x02-03: ロードするセグメント。0の時、伝統に従って0x7c0 */
byte bootSystemType; /*0x04: ブートイメージ中のパーティションテーブルのバイト5と一致すること */
byte stab; /*0x05: 未使用、必ず0 */
word bootSectorCount; /*0x06-07: ブート時に読み込むセクタ数 */
dword bootLoadRBA; /*0x08-0b: BootImageへのポインタ */
byte stab2[20]; /*0x0c-1f: 未使用、必ず0 */
} bootEntry;
0000A820 8802 0000 0000 0100 1600 0000 0000 0000 ................
0000A830 0000 0000 0000 0000 0000 0000 0000 0000 ................
- bootIndicator
Bootableかどうかを示します。Bootableで無いときはドライバー無しで読めるイメージという扱いになります。この例では0x88 -> Bootableです。
- bootMediaType
0x00、No Emulationではディスクイメージのエミュレーションは行いません。イニシャルブートローダだけ読み込み、後は全てそのコードの責任です。ちなみにNT4.0のCDはこのタイプです。
0x01,02,03は全てフロッピーイメージで大きさだけが違います。この場合、CDに納めたイメージがAドライブになり、本来のAドライブはBドライブに代わり、もしBドライブがあればそれは無いことになります。
04はディスクのイメージを示し、イメージがCドライブになり、以下CはDにという順にずれていきます。
例では0x02 -> 1.44Mフロッピーのイメージになっています。
- bootLoadSegment
イメージの先頭にあるブートローダをどのアドレスにロードするかを決めます。特別な意図が無い限りデフォルトで良いでしょう。
例も0x0000 -> デフォルトの0x7c0にロードです。
- bootSystemType
ブートイメージ中のパーティションテーブルのバイト5(system indicator)と一致すること。フロッピーの場合はどうするのか書いてないのでとりあえず0にしてあります。01(DOS with 12 bit FAT, 16 bit sector number)辺りかも??
- bootSectorCount
ブートローダのサイズを指定します。例では0x0001->1セクタロードとなっています。よく分からないときは常識の範囲で大きめにしておけば良いでしょう。ちなみにNT4.0では4です。
- bootLoadRBA
イメージの位置です。これもあらかじめ用意しておいたファイルを書き込んだISOイメージを作り、そのファイルのISOイメージ中のアドレスを調べて書くことになります。例では0x00000016 -> イメージの位置は0x16( * 0x800 = 0xB000)となっていることが判ります。
mkbootcd 002版以降を使っての作り方
- 準備
当たり前ですがCD-Rを作れる環境と、ブートできる環境(テスト結果を参考にしてください)が必要です。
後ば取りあえずこのページにあるものだけで作成できます。
- ブートフロッピー/ディスクの作成
まず、ブートするフロッピーもしくはディスクを作ります。
CDになってしまうと書き込めません。交換もできません。書き込めなくても立ち上がり、交換出来なくても困らないよう注意する必要があります。出来合いの物、例えばインストールフロッピーや95の修復フロッピーを使うのも良いですが以上の注意を忘れないようにしてください。
注意:ディスクイメージは先頭のパーティション一つだけが有効です。
- ブートイメージの抽出
満足のいくブートフロッピーもしくはディスクが出来たらそれを丸ごとダンプしてイメージにします。
GtBtImxx.zipを適当なディレクトリに展開し、マニュアルに従ってイメージをファイル化します。
イメージを作成するユーティリティはこれ以外にもNorton DISKEDIT,WinImage,SAVEDSKFなどいろいろあります。あるいはPC Unix系のDDコマンドを使うのも良いでしょう。根性があればDOS標準のdebugでも出来ますね。
- ISOイメージの作成
お好きなCD-Rライタソフトを使って添付のスペーサーファイル、validat.imgと作成したブートイメージを含むISOイメージを作ります。
- El Torito構造の構築
MkBtCDxx.zipを適当なディレクトリに展開します。Win32 Console VersionとDOS版の両方が入っていますので好きな方を使ってください。テストは主にNTで行っています。
mkbootcd 作成したISOイメージ validat.img 作成したブートイメージ
とするとEl Torito構造を構築します。構築時には大したチェックをしていないので
mkbootcd 作成したISOイメージ
とやって確認してください。
- ISOイメージの書き込み
BootableになったISOイメージを好みのCD-Rライタで最初のセッションに書き込み、bootすることを確認します。次のセッション以降は普通にファイルを書き込めます。(disk at onceやsingle sessionでboot imageを書かないこと!)
ワンポイント
ディスクイメージを焼きたがる人が多いようですが最初はフロッピーイメージの使用をお勧めします。書き込めないのですからディスクイメージを使ってブートさせるには作成時に細心の注意を払う必要があります。この辺りはフロッピーでも同じなんですがほとんどのものは書き込めなくても立ち上がりますし、Cドライブがあればそれで済む場合の方が多いからです。
私はDOS6.2とドライバ類を入れたBootするフロッピーイメージを焼きこみ、その後に各種インストールCDの内容を追記して使っています。メーカー製にも少ない自分でBootする修復CDという訳です。慣れたらディスクイメージに挑戦しましょう。
BIOS設定、Config.sys, Autoexec.bat
SCSI CD-ROMの場合、BIOSやドライバなどのint13hルーティングの関係で妙な状態になることがあります。詳細はT.B.D.(掲示板に少し書いてあります)
ユーティリティ
MkBootCD
MkBootCDはあらかじめ必要なファイルを書き込んでおいたISOイメージにEl Toritoに沿った構造を作ってブート可能にするユーティリティでISOイメージがEl Toritoに従っているかどうかチェックする機能も持っています。
β007から複数のブートイメージを焼きこんでブート時に選択できるようにするマルチエントリ対応、それに伴ってコマンドパラメータをインタラクティブもしくはファイルで指定するオプション、β008は追記用のISOイメージ対応と言った機能が追加されています。
mkbtcd1.zip(52KB) ISOイメージを加工してBootableに。
mkbtcd102.zip(24KB) Adaptec Eazy CD creator対応。Joliet対応(petry@rbg.informatik.tu-darmstadt.deによるβ)
オプション
Usage:
verify:mkbootcd isoimage
make: mkbootcd isoimage bootentryfile bootimage
mkbootcd isoimage bootentryfile - <indirect
options:
- Use stdin このオプション以降は標準入出力から読み込みます。
-Cnn Set bootSectorCount ブートセクターのサイズ(ダイレクトモード用)
-Fx Set bootMediaTypeFlags ブートメディアフラグ
-Ixx Set bootIndicator ブートする/しないの指定
-Lxxxx Set bootLoadSegment ブートコードをロードするセグメント(ダイレクトモード用)
-Mx Set bootMediaType, F means Auto ブートメディアタイプ(ダイレクトモード用)
-Bnnnnnn Set offset for multisession ISOイメージオフセット(マルチセッション用)
-Pnn Set entryPlatformID プラットフォームID(誰が使うの?)
-Sstring Make Section entry with string セクション作成
ex.
mkbootcd mycd.iso bootcat.bin osboot.ima -i00 noboot.ima -i88 osboot2.ima
これらのオプションは読み込んだ時点から次に変更されるまでの間、有効です。
- "-"
標準入出力から読み込む場合は一行一オプションなので例は、
mycd.iso
bootcat.bin
osboot.ima
-i00
noboot.ima
-i88
osboot2.ima
という形になります。このオプションを指定すると間違ったオプションを指定してもそのオプションを読み飛ばすだけでアボートされません。
- "-S"
セクションの作成を指定します。通常は複数のエントリを指定すると自動的に作成されるので明示的に作成したい場合に使用します。
- "-I"
ブータブルかどうか指定します。ブータブルでない場合はドライバ無しでアクセス出来るドライブという扱いになります。
- "-F"
ブートイメージがCDのドライバを含んでいるかの指定です。干渉を防ぐための物だと思うのですが未確認。
- "-B"
追記用ISOイメージの時、ベースセクタ番号を指定します。この値の設定ができる人は少なそうなので自動化しようかと思っています。通常の使い方の範囲ではオプションが不要になりますし..
使い方
- ISOイメージをブータブルにする。
mkbootcd ISOイメージファイル名 ブートエントリ用スペーサーファイル名 ブートイメージ名
例えば、
ISOイメージファイル名:Bootable.ISO
ブートエントリ用スペーサーファイル名:validat.img
ブートイメージ名:DC390WFU.IMG
なら、
mkbootcd Bootable.ISO validat.img DC390WFU.IMG
です。このうちブートエントリ用スペーサーファイル名とブートイメージ名はあらかじめISOイメージ内に納めたファイルの名前です。同名のファイルがディレクトリにあってもなんの関係もないので注意してください。
- ISOイメージがブータブルかどうかベリファイする
mkbootcd ISOイメージファイル名
ベリファイの実例
NT 4.0 Server CDの結果
mkbootcd NT4S.ISO
== Boot Record Volume Descriptor ==
Indicator:0
Identifier:'CD001'
Version:1
BSIdentifier:'EL TORITO SPECIFICATION'
BootCatalogP:0x00000013(0x00000000)
*Warnning - Some Garbage in stab1
== Validation Entry ==
HeaderID:1
PlatformID:0
ID String:'Microsoft Corporation'
CheckSum:'0x494c'
== Initial/Default Entry ==
Indicator:0x88 - Bootable
MediaType:0x00 - No Emulation
LoadSegment:0x07c0
SystemType:0
SectorCount:4
LoadRBA:0x00000014(0x00000000)
=== Verification Success ===
|
この手順で作成したイメージの結果
mkbootcd dc390ubt.iso
== Boot Record Volume Descriptor ==
Indicator:0
Identifier:'CD001'
Version:1
BSIdentifier:'EL TORITO SPECIFICATION'
BootCatalogP:0x00000015(0x00000000)
== Validation Entry ==
HeaderID:1
PlatformID:0
ID String:'Gigo's Bootable CD TEST'
CheckSum:'0x7e0f'
== Initial/Default Entry ==
Indicator:0x88 - Bootable
MediaType:0x02 - 1.44MFD
LoadSegment:0x07c0
SystemType:0
SectorCount:1
LoadRBA:0x00000016(0x00000000)
== Floppy Diskette Boot Sector Image ==
NumberOfSectors:2880(0b40)
=== Verification Success ===
|
注意事項
- ベリファイは厳格な物なのでエラーが発生したからと言って絶対にブートしない訳ではありません。また、一部のBIOSでは規格上、0の時、0x7c0になるはずのロードセグメントを本当に0と解釈するといった不備があり、合格したからと言って絶対にブートするとも言い切れません。
- BootMediaImage自体のチェックは一応していますが頼りきりに出来る程ではありません。結局はブートざせて見ないと判らないからです。
- 規格通りのイメージを作成してもBIOSによっては正しく動きません。テスト結果を参照してください。
GetBtImg
El Torito規格のbootable CDを作るにはブートするメディアのイメージが必要です。そのためのツールはいろいろありますが製品だったり、シェアウェアだったりしてちよっと試してみるという訳にはいきません。
また、Bootable CD作成用に作られたわけでは無いのでいくつか不便な点があります。
そこで、それ用のユーティリティ、GetBtImgを作ってみました。
gtbtim06.zip(20KB) floppy/Diskからブートイメージを取り出す。
GetBtImgはDOSアプリケーションで、DOS/Windows95/WindowsNT上でFloppy 720K, 1.2M, 1.44M( ,2.88M)のイメージ、DOS/Windows95上でDiskのイメージを作ることが出来ます。
Diskの場合El Torito規格のBootable CDで有効な第一パーティションの終わりまでをファイルにコピーします。まるごとでは無いので第一パーティションより大きなパーティションが他に有れば1台しかディスクがなくてもイメージを作ることが出来ます。
- 003版からは第一パーティション以外のパーティションを第一パーティションとしてコピー(-Pn)、Head,Sectorを実績のある64Heads,32Sectorとしてコピーする。(-A)
- 004版からは
パーティションがFAT16の場合、FATを調べて後ろの空き領域はコピーしない。(-R)
この場合、あらかじめデフラグをかけておくことをお勧めします。容量さえあればイメージをとるパーティションにイメージファイルをセーブできます。イメージファイル自身はイメージに含まれません。
- 005版からはもう一度CHSを変えたりREDUCEしたりするためにデバイスだけで無くイメージファイルも指定出来る。直接、ヘッド数(-Hnn)、セクタ数(-Snn)を指定して変換できる。
- 006版からはDOSの拡張パーティション内のパーティションもプライマリパーティションとしてコピーする。(-En) 以前のパーティション指定のシンタックスは廃止。
となっています。-Aと-Rの両方を指定するのがお勧めです。
006版は以前の版よりずっとテストされていますが、パーティションの構成、
切り方の癖は千差万別ですので注意して使ってください。
getbtimg - get boot media image for making bootable CD
18-Jun-97 imaizumi@nisiq.net Ver.beta006
usage:
Syntax:
getbtimg device filename
device := A: | B: | HDn: | imagefile
Options:
-Pn partition n
-En dos extended partition n
partition := 0 | 1 | 2 | 3
-r reduce partition size.
-a adjust 64Heads, 32Sectors
-Hnn adjust heads to nn
-Snn adjust sectors to nn
example:
getbtimg A: floppy14.img
getbtimg B: floppy12.img
getbtimg HD0: dsk0pat0.img
getbtimg HD1: -r dsk1pat0.img
getbtimg HD0: -a dsk0pt0a.img
getbtimg HD0: dsk0p1e0a.img -a -p1 -e0
mailto:gigo@os.rim.or.jp
http://www.os.rim.or.jp/~gigo/
注意
DiskのMasterBootRecordにはそのパーティションがどのシリンダ、ヘッド、セクタから始まるかしか書いてありません。このため、ヘッド数やセクタ数が異なっていると間違ったところをアクセスしてしまいます。従って、そのディスクからブートしてgetbtimgを使った方が安全です。違うマシンに繋ぐと異なる値になっている場合があり、無意味なイメージが出来てしまうことがあります。
また、作ったイメージのヘッド数、セクタ数がCD-ROMからブートしようとするシステムの仮定する値と同じでなければいけません。まだ、確認中ですがどうやらブート時は1GB以下のLBAモードを仮定しているようなので小容量のIDEのようにCHSモードだったり1GBを越えるIDEのようにLBAでも異なる値をとるディスクからとったイメージはブートしない可能性が大です。
getbtimgにこれらの補正を行う機能を付けたので、テストしてみてください。
テスト結果(8版)
Maker&odel
chip
BIOS
DRIVE |
Mode 0 - direct
NT4.0 Sever CD
(JP) |
Mode 1,2,3 - FD
mkbootcd 002 |
Mode 4 - HD
(SCSI Image)
mkbootcd 004a |
MultiSession
mkbootcd 008a |
MultiEntry
mkbootcd 008d |
GateWay P5/90
cmd640
AMI 1.00.13.AX1T
XM5602B (IDE) |
NG |
OK |
OK |
NG
(1st) |
OK
(Menu Broken a little,
But work well.) |
ASUS T2P4
Intel 439HX
2.03
XM5602B(IDE) |
NG |
OK |
OK |
NG
(1st) |
OK
Ignore Section
Bootable entry only |
TEKRAM DC390
AMD 53C974A
2.00
SCSI |
OK |
OK |
OK |
Not yet
maybe NG
(1st) |
Not yet
may same as 390U |
TEKRAM DC390U
SYMBIOS 875
2.00
SCSI |
OK |
OK |
OK |
NG
(1st) |
OK
only one entry/Section
Bootable entry only |
Adaptec AHA2940
AIC7870
1.21/1.23
Plextor x4 SCSI |
NG |
OK |
OK |
OK
(last) |
OK
Bootable entry only.
Best implementation |
Adaptec AHA2940AU
AIC7860
1.21/1.23
SCSI |
NG |
NG |
NG |
NG
Menu last
but not boot |
NG
Menu OK
But never Boot |
I WILL SIDE 2930U
Advansys
SCSI |
NG |
OK |
OK |
1st |
OK
Ignore Section
only 10 entrys
Bootable entry only |
Diamond FirePort 40
SYMBIOS875
4.03.08ca
SCSI |
NG |
OK |
OK |
NG
(1st) |
NG
Default/initial only |
使用したライターソフト: Applix CD-R Writer 3.0, Adaptec EZ CD Pro 1.11D, Adaptec EZ CD Pro 2.01
マルチセッションはAdaptec EZ CD Pro 1.11D,2.01のみ対応
- 推測ですがAward 4.51PGを元にしたBIOSであればすべてIDEからブートできるようです。
- NT 4.0のCDはダイレクトモードで独自のIPLを使っています。どうやらこれがIDEに対応していないらしくIDEではブートしません。
- NT4.0とDC390Uの組み合わせはブート自体は成功しますがドライバがないのでインストーラーがへたります。
- 2940は最後に書いたセッションが有効のようで最後がブータブルでないとブートしません。以前の結果でFDイメージが駄目だったのは追記した後だったのが原因で2940に罪はないようです。この最後のセッションが有効というのが正しい仕様ですね。ちよっとAdaptecを見直しました。これだとブータブルで無かった物をブータブルに出来る訳でなかなか便利です。
- 既に掲示板に報告がありますがアダプテックはCD用のドライバを入れて置けばブートしたイメージとは別に普通のCDとしても読めます。他はブートさせたドライブ用のドライバがあるとハングしてしまうのでこれも美点ですね。2940AUでは全くブートしないのが唯一の汚点です。
皆さんのレポートをお待ちしています。
レポートしてくださった/したい方にはご希望により未公開の最新β版の送付、非公開のβテスター用掲示板へのアクセス、最新BIOS ROMの書き込みサービスなどの特典があります。^-^;
[Return to home]|[掲示板]|[Bulletin board]