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 ................
  1. bootIndicator

     Bootableかどうかを示します。Bootableで無いときはドライバー無しで読めるイメージという扱いになります。この例では0x88 -> Bootableです。

  2. bootMediaType

     0x00、No Emulationではディスクイメージのエミュレーションは行いません。イニシャルブートローダだけ読み込み、後は全てそのコードの責任です。ちなみにNT4.0のCDはこのタイプです。
    0x01,02,03は全てフロッピーイメージで大きさだけが違います。この場合、CDに納めたイメージがAドライブになり、本来のAドライブはBドライブに代わり、もしBドライブがあればそれは無いことになります。
    04はディスクのイメージを示し、イメージがCドライブになり、以下CはDにという順にずれていきます。
    例では0x02 -> 1.44Mフロッピーのイメージになっています。

  3. bootLoadSegment

     イメージの先頭にあるブートローダをどのアドレスにロードするかを決めます。特別な意図が無い限りデフォルトで良いでしょう。
    例も0x0000 -> デフォルトの0x7c0にロードです。

  4. bootSystemType

     ブートイメージ中のパーティションテーブルのバイト5(system indicator)と一致すること。フロッピーの場合はどうするのか書いてないのでとりあえず0にしてあります。01(DOS with 12 bit FAT, 16 bit sector number)辺りかも??

  5. bootSectorCount

     ブートローダのサイズを指定します。例では0x0001->1セクタロードとなっています。よく分からないときは常識の範囲で大きめにしておけば良いでしょう。ちなみにNT4.0では4です。

  6. bootLoadRBA

     イメージの位置です。これもあらかじめ用意しておいたファイルを書き込んだISOイメージを作り、そのファイルのISOイメージ中のアドレスを調べて書くことになります。例では0x00000016 -> イメージの位置は0x16( * 0x800 = 0xB000)となっていることが判ります。

mkbootcd 002版以降を使っての作り方

  1. 準備

    当たり前ですがCD-Rを作れる環境と、ブートできる環境(テスト結果を参考にしてください)が必要です。
    後ば取りあえずこのページにあるものだけで作成できます。

  2. ブートフロッピー/ディスクの作成

     まず、ブートするフロッピーもしくはディスクを作ります。
    CDになってしまうと書き込めません。交換もできません。書き込めなくても立ち上がり、交換出来なくても困らないよう注意する必要があります。出来合いの物、例えばインストールフロッピーや95の修復フロッピーを使うのも良いですが以上の注意を忘れないようにしてください。
    注意:ディスクイメージは先頭のパーティション一つだけが有効です。

  3. ブートイメージの抽出

    満足のいくブートフロッピーもしくはディスクが出来たらそれを丸ごとダンプしてイメージにします。
    GtBtImxx.zipを適当なディレクトリに展開し、マニュアルに従ってイメージをファイル化します。
    イメージを作成するユーティリティはこれ以外にもNorton DISKEDIT,WinImage,SAVEDSKFなどいろいろあります。あるいはPC Unix系のDDコマンドを使うのも良いでしょう。根性があればDOS標準のdebugでも出来ますね。

  4. ISOイメージの作成

     お好きなCD-Rライタソフトを使って添付のスペーサーファイル、validat.imgと作成したブートイメージを含むISOイメージを作ります。

  5. El Torito構造の構築

    MkBtCDxx.zipを適当なディレクトリに展開します。Win32 Console VersionとDOS版の両方が入っていますので好きな方を使ってください。テストは主にNTで行っています。

    mkbootcd 作成したISOイメージ validat.img 作成したブートイメージ

    とするとEl Torito構造を構築します。構築時には大したチェックをしていないので

    mkbootcd 作成したISOイメージ

    とやって確認してください。

  6. 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
これらのオプションは読み込んだ時点から次に変更されるまでの間、有効です。

使い方

  1. ISOイメージをブータブルにする。

    mkbootcd ISOイメージファイル名 ブートエントリ用スペーサーファイル名 ブートイメージ名

    例えば、

    ISOイメージファイル名:Bootable.ISO
    ブートエントリ用スペーサーファイル名:validat.img
    ブートイメージ名:DC390WFU.IMG

    なら、

    mkbootcd Bootable.ISO validat.img DC390WFU.IMG

    です。このうちブートエントリ用スペーサーファイル名とブートイメージ名はあらかじめISOイメージ内に納めたファイルの名前です。同名のファイルがディレクトリにあってもなんの関係もないので注意してください。

  2. 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 ===
    

注意事項


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台しかディスクがなくてもイメージを作ることが出来ます。
となっています。-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のみ対応

皆さんのレポートをお待ちしています。
レポートしてくださった/したい方にはご希望により未公開の最新β版の送付、非公開のβテスター用掲示板へのアクセス、最新BIOS ROMの書き込みサービスなどの特典があります。^-^;

[Return to home]|[掲示板]|[Bulletin board]