|
|
|
|
このサイトは、もともと作者の自分用メモとして書き始めたものです。書いてあることが全て正しいとは限りません。他の文献、オフィシャルなサイトも確認して、自己責任にて利用してください。 |
|
どんがらりん - 道具としてのLinux -
このセクションでは、サーバだの設定だのは抜きにして、便利な「道具」としての Linux 活用法を、軽いスタンスで書き連ねていく。例えば、どんな種類のパーティションでも作成/削除できる Linux 版 fdisk には、かなりの人が世話になったことがあるだろう。ここでは Linux にこだわるつもりは全然ない。 Windows だろうが Linux だろうが、使えるモノは何でも使う。クロスオーバーごちゃ混ぜ活用術だ。
Table of Chapters
DOSブータブルCDを作る
未だに、PC のメンテナンスをするのに DOS ほど便利なツールはない。今どきの 32 ビットの Windows とは違い、例えば SATA のハードディスクでも PATA のハードディスクでも同様に扱えるなど、ハードウェアの扱いは大ざっぱだし、バッチファイルはテキストだから簡単に作ったりいじったりできるし、基本的な動作にはテンポラリファイルも必要なし、サイズも小さくメモリも欲張らない....と、メンテ用ブータブル CD の OS としては並ぶモノ無しだ。
DOS といっても MS-DOSに固執する必要もない。世の中には MS-DOS 互換のフリーな DOS がいくつもある。例えば DR-DOS は、MS-DOS より高機能で、 config.sys の分岐なども応用が利き大変便利。それを更に拡張した "Enhanced DR-DOS" なるものと組み合わせれば FAT32 も読み書きできる。 FreeDOS は、標準インストールの状態で FAT32 をサポートするが、「MS-DOS 完全互換」というコンセプトに固執するあまり、さまざまに拡張してメンテの道具にするにはやや使いづらい OS だと感じるのは私だけか?
ネット上を探したところ他にも様々なドライバが転がっていて、 NTFS ファイルシステムが読めたり、 USB 2.0 メモリーキーや IEEE 1394 外付けハードディスクの読み書きだって実現できる。今までにネットで捜索した DOS ドライバやツールに関しては DOSドライバ&ツール リンク集 にまとめた。
ブータブル CD の規格 El Torito には、よく使われているフロッピーエミュレーション以外にも幾つかのブートメカニズムが存在する。ここでは、2.88M の起動イメージが A: ドライブに見える「2.88M フロッピーディスクエミュレーション CD」と、イメージが C: ドライブになる「ハードディスクエミュレーション CD」の作り方を書く。
Table of Contents
ここで使う道具
まず、ブータブル CD 作りに使うツールを紹介しておこう。
- BFD [Win NT/2K/XP フリーウェア] -- 1.44M または 2.88M のブータブルフロッピーイメージが作れる、コマンドラインベースの 32 ビットプログラム。設定ファイルによってカスタマイズが可能。Linuxだけで2.88Mフロッピーイメージを作る方法 を使えば BFD は要らない。
- dd [Linux] -- ブロック単位コピーツール。ハードディスクやフロッピーディスクのデータを構造もろともファイルとして書き出したり、その逆を行う。ここでは主にブート FD やブート HD のイメージファイル化に使う。 Linux ならどのディストリビューションにも標準で入っているだろう。
- mkisofs [Linux] -- El Torito はもちろん、ありとあらゆる CD 規格に対応した CD イメージ作成ツール。コマンドラインツールだが超強力。たいていのディストリビューションで、インストールオプションで選べる。
以上のことを、お金を掛けてラクにやりたい人は、こんなページ読まずに WinImage や UltraISO を使ってください。あたしゃ地道に行くよ。とはいえ UltraISO はブート CD からブートファイルを取り出したりフロッピーイメージの内部を閲覧/編集できて便利なので、私も利用させてもらっています。
作業上の注意
- CD の構成ファイルを Windows マシン <=> Limux マシン間で FTP や SCP 転送する場合、テキストファイルであってもバイナリモードで転送すること。テキストモードで転送すると改行コードが変わって、 DOS 上で機能しないファイルになってしまう。
- 満足のいく CD が 1 度でできることはまずない。「どびん敷き」の大量生産をしないために、満足行くモノが出来るまでは CD-RW の活用をお勧めする。
ハードディスクエミュレーションCDの作り方
CD 内のブートイメージがハードディスク (C: ドライブ) として認識されるタイプ。
- メリット
- ブートイメージサイズがほぼ自由。CD の容量に納まりさえすればいいわけで、その気になれば 650M のイメージも理論的には可能 (ただし無駄)。機能満載の DOS システムが作れる。
- HD イメージとしてブート CD に封じ込めた内容は、BIOS の能力だけで読めるので、 CD-ROM ドライバは必須ではなくなる。だから、上記とは逆に、極めてシンプルな DOS システムに仕上げることもできる。つまりメモリマネージャも最低限で済み、メモリ構成に神経質なプログラムを動かしたい場合に有利。
- いちいち CD に焼かなくても HD 上で基本的な動作テストができるので、システムの作り込みはラク。
- デメリット
- 古い BIOS や、ノートPCではうまく動作しないことがある。
- ハードディスクエミュレーションを想定していないプログラムも存在する。例えば Ghost 2003 付属の GHSTWALK.EXE (WinNT 系の SID を書き換えたりするツール) は C: ドライブがリードオンリーであることにパニックするらしく、カタマる。
1. DOSシステムをハードディスク上で作り込み
好みの DOS とドライバやバッチを組み合わせて、ハードディスク上に DOS システムを構築。今までに気づいたポイントを挙げると;
- 標準 El Torito 規格に従うため、パーティションは基本 DOS 領域ひとつだけとし、ファイルシステムは FAT16。パーティションサイズはあまり欲張らないほうが、後で行うブートイメージ作りやマシン間転送に時間がかからなくてよい。盛り込むツールの量にもよるが、通常は 64M もあれば DOS のフルシステムを組んでもオツリが来る。
- edit.com など、動作上テンポラリファイルの生成が必要なプログラムも動かしたい場合、RAM ディスクの作成が不可欠。 RAM ディスクは、 DR-DOS の vdisk.sys または、 Win98/ME の緊急用起動フロッピーから取り出せる ramdrive.sys で作れる (関連情報: DOSに関するその他の覚え書き)。
- fdisk は、ドライブレターでなくディスク番号 (1から始まる) でターゲットを決めるが、ハードディスクエミュレーション CD で立ち上げた時には 1 番はブートイメージとなり、番号がひとつずつ後ろへズレるという点に注意。例えば最初のハードディスクにマスターブートレコードを書き込むのなら、fdisk /mbr 2 とコマンドしなくてはならず、バッチスクリプティングでは少し工夫が要る。
2. ハードディスクイメージの書き出し [Linux上で]
完成したハードディスクを Linux マシンにつなぎ、イメージファイル化する行程。例として DOS ディスクをプライマリのスレーブにつないだとする。
2-1. fdisk でアロケーションブロックの終端を調べる
root# fdisk /dev/hdb
Command (m for help): u
Changing display/entry units to sectors
Command (m for help): p
Disk /dev/hdb: 1091 MB, 1091371008 bytes
64 heads, 63 sectors/track, 528 cylinders, total 2131584 sectors
Units = sectors of 1 * 512 = 512 bytes
Device Boot Start End Blocks Id System
/deb/hdb1 * 63 133055 66496+ 6 FAT16
上記の調査で、1 ブロック (= ユニット) は 512 バイトであり、パーティションの終わりが 133055 ブロック目だと分かる。
2-2. イメージの書き出し
root# dd if=/dev/hdb of=doshd.bin bs=512 count=133055
「セカンダリ・マスター HD の先頭から、 512 バイトを 1 ブロックとして 133055 ブロックまでを doshd.bin というファイルに書き出せ」 という意味。
3. ブータブルISOイメージの作成 [Linux 上で]
3-1. 部品を配置する
mydir/
isofiles/ ソースディレクトリ。名称は任意
doshd.bin 手順 2 で作ったハードディスクイメージファイル
file1 以下は、通常の CD-ROM 上に置くファイルやディレクトリ
dir1 ...
3-2. ISOイメージファイルの作成
root# cd mydir
root# mkisofs -R -hard-disk-boot -b doshd.bin -c boot.cat \
-V DOSTOOL -sysid WIN16 -o dostool.iso isofiles/
説明がめんどくさいので root でやっているが、2-2 で書き出した HD イメージファイルの読込み権限さえ確保しておけば、 mkisofs はなにも root 権限で実行する必要はない。コマンドは長い。おそらくは何度も作り直しをすることになるだろうから、シェルスクリプトファイルに書いておくと便利。
mkisofs のオプションの意味:
-R |
-hard-disk-boot |
-b bootfile |
-c catalog_file_to_create |
-V label |
-sysid description |
-o output_file |
なお、mkisofs を走らせた時に、 「ブートイメージのブートレコードで定義されているセクタ数と、ブートイメージの実際のファイルサイズが食い違っている」 と警告が出ることがある。 実サイズがブートレコード定義より若干大きいならほっておいて構わないが、ショートしているということはイメージ内のパーティションがぶっちぎれている可能性があるので気持ち悪い。その場合は 2-2 の行程で count=xxx を 1 だけ増やして書き出す。
4. 焼く
お好きなライターでご自由に。
2.88MフロッピーディスクエミュレーションCDの作り方
CD 内のブートイメージが A: ドライブに見えるタイプ。 1.44M フロッピーイメージのブータブル CD ならどんな CD ライティングソフトでも簡単に作れるが、ここで取り上げるのは 2.88M フロッピーイメージを封じ込むもの。
- メリット
- たいていのマシンで機能する、汎用性の高さ。
- HD エミュレーションに比べて作成がラク。
- デメリット:
- 入れ込めるファイルの量が限られる。とはいっても、 1.44M のヤツに比べればかなりの容量。また、初期起動に必要のないファイルを cab ファイルに圧縮しておき extract.exe で RAM ドライブに解凍する仕組み (Win98/ME の緊急ディスケットがこれをやっている) にすれば、充分実用に足る。なお、cab 圧縮には MSZIP 方式と LZX21 方式がある。圧縮率の良い LZX21 方式を使いたいところだが、 MS の extract.exe は MSZIP 圧縮にしか対応していない ( LZX21 を解凍させると「メモリー不足」というエラーを吐き、解凍を途中で投げ出してしまう)
1. 土台となる2.88Mフロッピーイメージの作成
コマンドラインベースの 32 ビットプログラム BFD を利用する。ただし、さらにもっと泥臭いやり方で、 Linux だけで 2.88M フロッピーイメージを作る方法もある。ここでは、Enhanced DR-DOS を前提に綴ることにしよう。
1-1. 1.44Mフロッピーのブートセクタの取り出し [Linux上]
お目当ての DOS でシステム転送を行った 1.44M フロッピーを用意し、そこから先頭の 512 バイトを取り出す。
root# dd if=/dev/fd0 of=bootsect.bin bs=512 count=1
1-2. BFD の設定 [Windows上]
- BFD インストールディレクトリ下の os ディレクトリに drdos というフォルダを作る。
- 前行程で取り出したブートセクタファイル bootsect.bin を drdos フォルダにコピー。
- さっきの 1.44M 起動 FD から、最小限のシステムファイル (COMMAND.COM, DRBIO.SYS, DRDOS.SYS。DOS の種類によって異なる) を drdos フォルダにコピー。その他のファイルは後の行程でいくらでも追加/変更できるので気にしない。
- BFD インストールディレクトリ直下にある bfd.cfg に以下の記述を追加する:
# -----------------------------------------------------
# enhanced dr-dos boot img
# -----------------------------------------------------
n drdos
f
b
c os\%bfd_os%\command.com
c os\%bfd_os%\DRBIO.SYS
c os\%bfd_os%\DRDOS.SYS
n, f, b, c といったコマンドの意味は同 bfd.cfg の先頭にコメントで説明されているので読むべし。
1-3. 2.88Mフロッピーイメージの作成 [Windows上]
bfd drdos -o drdos -d -i drdos288.img -t 288 drdos288.img
これで、BFD インストールディレクトリに drdos288.img というフロッピーイメージが出来る。コマンドオプションの解説は BFD インストールディレクトリの usage.txt を読むように。
2. フロッピーイメージの作り込み [Linux上]
2-1. 前行程で作ったフロッピーイメージをループバックマウントする
root# mount -o loop -t msdos drdos288.img /mnt/dos
2-2. その他の必要ファイルやフォルダをコピー
FTP や SCP で Windows マシンから送る場合は 作業上の注意 に注意。
root# cp CONFIG.SYS /mnt/dos
root# cp AUTOEXEC.BAT /mnt/dos
root# cp -R honyara/TOOLS /mnt/dos
....
てな具合。あとどれくらい空き容量があるか調べるには df コマンド。
2-3. マウント解除
root# umount /mnt/dos
すれば、 drdos288.img ファイルは更新されている。
3. ブータブルISOイメージ作成
2.88M フロッピーイメージの取り込みに対応した CD ライティングソフトを持っているならこの行程は無用。
mkisofs での ISO イメージ作成 [Linux上]
部品の配置方法はハードディスクエミュレーションと同様。フロッピーエミュレーション CD イメージを作るコマンドはこんな塩梅:
root# cd mydir
root# mkisofs -R -b drdos288.img -c boot.cat \
-V DOSTOOL -sysid WIN16 -o dostool.iso isofiles/
4. 焼く
好きなツールで焼くべし。
DOSドライバ&ツール リンク集
- パナソニックコミュニケーションズ (USB ASPI マネージャ, ASPI CD ドライバ)
- DOSでUSBを使うには、 USB/FireWire 接続外付け CD ドライブのドライバセットに含まれている USBASPI.SYS と USBCD.SYS が秀逸。 USBASPI.SYS は DOS 用 USB ASPI マネージャのデファクトスタンダードと言えるもの。バージョンが幾つかあり、 CD-R/RW ドライブ用に含まれる USBASPI.SYS は 2.06 や 2.15、最近の DVD/CD-RW 用ドライバセットには 2.20 という バージョンも見られる。 USB 対応の CD-ROM ASPI ドライバ USBCD.SYS は 1.00 で充分安定しているらしく更新版は見あたらない。なお、これらは UHCI/OHCI/EHCI, USB1.0/2.0 いずれのホストコントローラにも対応しているが、 2.0 のポートで動作させたからといって 2.0 のスピードが出るわけではない。 USBASPI.SYS のコマンドラインオプション引数については後述 「DOSに関するその他の覚え書き」 にまとめた。
- NOVAC (ASPI マスストレージドライバ)
- USB/FireWire 外付け HD ケース 「はい~るKit」 を作っているメーカー。 HDDもっとはい~るKit(USB2.0/HD352U) などのドライバセットに含まれる ASPI マスストレージドライバ di1000dd.sys が重宝。 USBASPI.SYS や ASPI*HCI.SYS と併用し、私の環境では、外付けハードディスクの他、USB メモリキーや、コンパクトフラッシュアダプタに挿した CF カードも認識できた。同ドライバは FireWire ASPI マネージャとの組み合わせでも使える (ハズ)。
- POCKETEC (DUSE.EXE)
- USB 外付け HD ケースのメーカー。 DUSE.EXE がダウンロードできる。これは ASPI マネージャとストレージドライバをひとつにしたようなもので、 USBASPI.SYS + USBCD.SYS/di1000dd.sys とは違った、もうひとつの選択肢。 DUSE.EXE は、チップメーカー CYPRESS Semiconductor がサンプルとして公開したリファレンスアプリケーションの、ほぼそのまんま。利点はホットプラグが可能なこと。しかし、ファイルサイズが 106KB とデカく、メモリもバカ食い (140KB以上)、また、DPMS (プロテクトメモリモード) 下では使えないなど問題も多い。他の USB ドライバではどうにもならない時以外、極力使いたくないシロモノ。
- DAT Optic (FireWire ASPI マネージャ, ASPI マスストレージドライバ)
- IEEE1394 に力を入れている周辺機器メーカー。DOSでIEEE1394を使うには、ここが提供している NJ32DISK.SYS (WORKBIT 製) が便利。かつては SPEEDZTER 2.5 という FireWire HD ケースの DOS 用ドライバがダウンロードできたようだが、現在はリンク切れ。ただ、このURL (かつてのページの残骸?) で DAT.exe という自己解凍フロッピーイメージが入手可能。SBP2ASPI.SYS が FireWire ASPI マネージャ (Centuryのここでも見つけた)、NJ32DISK.SYS がマスストレージドライバ。 SBP2ASPI.SYS はいろいろな FireWire ストレージに添付されているようだが、コピーライトを見ると Medialogic Corp. 、バージョンは 1.02 しか見たことがない。 NJ32DISK.SYS は機能的には di1000dd.sys とほぼ同じらしいので、 いずれかひとつを USB と FireWire で兼用すればブートイメージの容量が節約できる。
- Iomega (FireWire/USB ASPI マネージャ)
- Symantec GHOST 2003 で USB や FireWire 対応のブートフロッピーを作ると、 ASPI1394.SYS (FireWire ASPI), ASPIOHCI.SYS (OHCI USB1.0 ASPI), ASPIUHCI.SYS (UHCI USB1.0 ASPI), ASPIEHCI.SYS (USB2.0 ASPI) がディスケットにコピーされる。これらは全てアイオメガ製のドライバファイルだ (Iomega のサイトからダウンロードも試みたが無理なようだった)。いずれも、Iomega 製以外のドライブ類でも動くことが確認できた。その際、 GHOST が作ったブートフロッピーの CONFIG.SYS ではこれらの ASPI マネージャだけをロードしているが、実際には、その後で ASPI マスストレージドライバなり ASPI CD ドライバなりもロードしてやらないとドライブはマウントされない。 Panasonic ドライバとの違いは以下;
- Iomega ドライバは EMM386 下では機器の検出に失敗する。 Panasonic ドライバはOK。
- Panasonic ドライバはデバイスの検出時に各デバイスをリセットするので、キーボードが USB 接続だと、USB が生きた途端にキーボードは死ぬ。USB-CDROM でブートした場合もブートイメージが読めなくなる。 /R か /NORST オプションで避けられそうだが、USB-CD ブートできる環境がないので、筆者はまだ検証できていない。対する Iomega ドライバでは、少なくともキーボードはそのまま使えた。
- [未検証] Iomega の ASPIEHCI.SYS はちゃんと USB 2.0 のスピードが出るらしい。
- Sysinternals Freeware (NTFS ドライバ)
- NTFS フォーマットのパーティションを DOS 上で読むことができる。フリー版は読み込みだけしかできないが、緊急時にファイルを救出する用には充分足りる。読み書きできるようにするためには有料版のキットが必要らしい。
- FAT32 ドライバ
- ノーマルな DR-DOS で FAT32 パーティションにアクセスするには FAT32 ドライバが必要となる。以前は Caldera DOS (DR-DOSの前身) が配布していたが、今では Goog りまくって探すしかなくなってしまった。やっと 1 箇所見つけたのが ここ。ただし、こいつで無理矢理 FAT32 をサポートさせるよりも、DR-DOS 自体を Enhanced DR-DOS で拡張して FAT32 をネイティブサポートさせるほうが確実。
- Free FDISK
- FreeDOS 版の FDISK。 MS-DOS や Win16 の FDISK よりも格段に拡張されていて便利。 128GB までのハードディスク (v.1.21 現在) をサポートし、 NTFS パーティションの識別/作成なども可能。 "/XO" オプションが面白い。FreeDOS BETA9sr1 には同 v.1.30 が付属しているが、 1.21 からの変更点は不明。
- 「コンソールやディスクのデータを環境変数に登録するには」 By Eric Pement
- 元の題名は Getting Console or Disk Data into Environment Variables。DOS は Unix と違って、例えば SET VAR=`command` のようなことができない。そこで、どうすれば実現できるか、が書かれている。ここで紹介されている ASET というユーティリティが超強力。 DOS へ移植した Sed の紹介もある。
- Short.Stop (Unix GNU ツールの DOS ポート)
- Free Software for DOS Unix >> DOS というページには、主立った Unix ツールを DOS 用にコンパイルしたものが置かれている。 grep, expr, tail, head, wc などが重宝。前述の ASET と組み合わせるとバッチの可能性がぐっと広がる。
- TUNZ.COM
- FreeDOS (少なくとも Beta9sr1) に含まれる info-zip (いわゆる zip ファイル) 解凍ツール。Tiny-Unzip の略だそうで、機能は最小限に絞られているが、とにかくサイズが小さく、たったの 4Kバイト程度。本来の UNZIP.EXE は 49K ある。
DR-DOS 設定サンプル
上記の USB, IEEE1394, マスストレージ, CD-ROM ドライバ諸々 (DUSEを除く) を起動時に対話式で選択できるブート CD を作った。参考、あるいは googる時の糸口になるかも知れないので、ブートイメージ用の設定サンプルを公開しておく。 DOS 環境は DR-DOS 7.03 + Enhanced DR-DOS 7.01.07。 使えるコマンドが違うので MS-DOS では機能しないだろう。基本的には FD/HD エミュレーション共通で使えるように作った。かなりギトギト。 ASET.EXE 必須。下記に挙げたサンプルファイルを理解し有効利用していただけるよう、コンセプトを説明しておく。
ブートイメージのディレクトリ構造
\ (ルートディレクトリ)
command.com, DRBIO.SYS, DRDOS.SYS などシステムファイル
CONFIG.SYS
AUTOEXEC.BAT
TOOLS.CAB <--AUTOEXEC.BATからextract.exeでRAMディスク上へ展開するサブ的ツール群を圧縮したもの(非必須)
\DRDOS\ <--[Enhanced]DR-DOS標準ツール群(attrib.exe, himem.sysなど)を入れる。drdos.iniやcountry.sysなども
\EXT\ <--非標準のドライバやツールを置く。DRVLET.BAT, DETECDRV.BATなどのカスタムバッチもここ
- CD面上に配置するファイル
- FD エミュレーション CD の場合に CD ドライバを介してしか読めないファイル。頻繁には使わないツールや、ブートイメージに収まりきらなかったものはここに置く。下記サンプルの AUTOEXEC.BAT では、もしもここに \GHOST\ というディレクトリがあれば %_CD_%\GHOST も PATH に含めるように仕組んである。
サンプルファイル
- CONFIG.SYS :"SHELL=..."の行を変えるだけで FD エミュレーションにも HD エミュレーションにも使える。メモリマネージャの種類、 USB/IEEE1394、CD/マスストレージドライバをロードするかなどを起動時に対話式で選択できる。また、メモリマネージャに応じたサイズの RAM ディスクも作成する。 RAM ドライブを作るのは、テンポラリディレクトリとして便利という他、 AUTOEXEC.BAT でツールやシステムファイルをコピーして最後にカレントディレクトリを RAM ドライブへ移動することによって、ブート CD をドライブから抜いても動作が続けられるようにするため。パラメータ選択は、放っておけばデフォルト値を選択して勝手に進んでいくようタイムアウトが設けてあるが、猶予が 6 秒では短すぎると感じたら、何箇所かある "TIMEOUT 6" を書き換えるべし。
- AUTOEXEC.BAT :HD エミュレーションか FD エミュレーションかによって、 RAM ディスクへコピーするツールの量を調節すること。具体的には HD エミュレーションの場合は中盤の "for all-in-one HD Emulation" の部分を生かして "for FD Emulation" の部分をコメントアウト、 FD エミュレーションでは "for FD Emulation" の部分を生かすとよい。また、 \EXT\DRDOS.LST と \EXT\EXT.LST は適宜作成のこと。このふたつのリストは xcopy を使って各々 \DRDOS\ ディレクトリと \EXT\ ディレクトリから RAM ドライブへコピーするファイルのリストで、 1 行にひとつずつの形でファイル名を書き連ねればいい。それと、終端にあるラベル ":HELPS" の部分は起動直後に表示する「使い方説明」なので適宜書き換えていただきたい (例えば EXTHELP なんてものは私が勝手に作ったバッチであって、あなたのところには存在しない)。
- DETECDRV.BAT :RAMDRIVE, USB/FireWire ディスクのドライブレターを検出する。VDISK.SYS, RAMDRIVE.SYS のどちらにも対応し、FINDRAMD.EXE 不要。DRVLET.BAT から呼び出される。
- DRVLET.BAT :上記 DETECDRV.BAT を引数付きでコールするための小バッチ。
- LSDRV.BAT :主要なドライブレターをリストするバッチ。CONFIG, AUTOEXEC 内で定義した環境変数をプリントしているだけ。
DOS に関するその他の覚え書き
MSCDEX.EXE の戻り値
DR-DOS の NWCDEX.EXE は、戻り値 (ERRORLEVEL) を返さないところがツラい。 Microsoft の MSCDEX.EXE は返すのに...。 実際に調べてみた MSCDEX.EXE の戻り値は以下:
- 0 : 正常にロードした (CD-ROM を 1 台認識しても 2 台認識しても同じ)
- 5 : 機能エラー。下位のドライバ (例えば OAKCDROM.SYS による CD001) がロードされていない。あるいは MSCDEX.EXE が既に起動済み (二重起動)
- 87 : コマンドエラー。不正なオプションが指定された
ちなみに、MSCDEX.EXE や NWCDEX.EXE は CD-ROM "ドライバ" ではなく、「リダイレクタ」というものだそうだ。下位ドライバによって認識された CD-ROM を一種のネットワークドライブとしてマウントして通信を橋渡しするものらしい (理解浅し)。
USBASPI.SYS のコマンドラインオプション
怪しいものも含む (下へ行くほど怪しくなる)。
- /W : ロード時に 「デバイスをポートにつないで Enter を押せ」 のプロンプトを出す (Wait)
- /E : USB2.0 つまり EHCI デバイスだけを検出 (ポートが USB2.0 なら必ず指定)
- /O : OHCI の USB1.0 デバイスだけを検出 (通常は指定不要)
- /U : UHCI の USB1.0 デバイスだけを検出 (通常は指定不要)
- /V : 画面出力を冗長に (Verbose)。かえって肝心のメッセージが読めなくなるので私は嫌い
- /P=FFFF : ドライバを割り当てる I/O ポートを 16 進数で指定 (通常は不要)
- /Ln : LUN n番までしか検出するな (通常は不要)
- /R : メモリに常駐 (Resident)? USB フロッピーからブートする場合に必要らしい
- /NORST : USB デバイスをリセットしない(らしい)。BIOS で レガシーエミュレートした USB マウスやキーボードもこれで動き続けるらしい [Computing Net のユーザレポートより]
- /NOCBC : カードバス経由の USB デバイスは検出しない(らしい) [Computing Net のユーザレポートより]
- /F /SLOW /NOPRT : こういうのもあるらしいが謎 [Computing Net のユーザレポートより]
RAM ディスクの作成とドライブレターの検出
RAM ディスクドライバには、 DR-DOS の VDISK.SYS、 Win98/ME の RAMDRIVE.SYS、 FreeDOS の TDSK.EXE などがある。利用のポイント;
- ありもののバッチを利用するなら Win98/ME の RAMDRIVE.SYS, FINDRAMD.EXE, SETRAMD.BAT を使うのがラクかも。 FINDRAMD.EXE は RAM ドライブのドライブレターを検出し ERRORLEVEL で返すプログラムだが、判断材料のひとつとして "MS-RAMDRIVE" というボリュームラベルを確認しているため、ボリュームラベルが "VDISK" となる VDISK.SYS の RAM ディスクには流用できない。ちなみに TDSK.EXE で作った RAMDISK のラベルは "TURBODSK"。
- VDISK.SYS でも、バッチをちょっと工夫すればドライブレターを検出可能。それが DETECDRV.BAT。基本原理は、ドライブ:\NUL (ブラックホールデバイス) が存在するかの確認。 \NUL があればドライブが存在する証拠。そして MSCDEX をロードする前ならば、存在しないドライブのひとつ手前が RAMDRIVE のはず、というわけ。ただし、私の CONFIG.SYS では、この時点で USB/FireWire マスストレージのロード/非ロードが選択済みなので、最終ドライブは RAMDISK でない可能性が出てくる。そのため DETECDRV.BAT ではディスクラベルが "MS-RAMDRIVE" か "VDISK" であることも検証要素に追加。ついでに、USB/FireWire ストレージが邪魔をするというデメリットを逆手にとって、 USB/FireWire マスストレージのドライブレターも検出できるようにした。
- DR-DOS は himem.sys をロードしなくてもネイティブで Extended メモリ領域 (64MB) が利用できる。よって、特にメモリマネージャなしでも拡張メモリ上に 256 KB 超の RAMDRIVE が作れる (つまり /E オプション)。ただし MS の RAMDRIVE.SYS は、これを Extended メモリと認めず、himem.sys 無しだとコンベンショナルメモリ上にしか RAMDISK が作れない。
- 同じサイズを指定しても、使用する RAMDISK ドライバによって、実際に出来上がるディスクのサイズが若干異なる。サンプルに示した AUTOEXEC.BAT のように RAMDISK のサイズによってバッチ処理を分岐させたい場合、サイズ判定には少し余裕を持たせた方がよい。
Linuxだけで2.88Mフロッピーイメージを作る方法
かなり泥臭く手仕事の多いやり方だが、フロッピーのブートセクタの仕組みが分かったりして面白いかもしれない。なお、以下に出てくる mkdosfs は mkfs.msdos とコマンドしても同じだ。
1. DOSフォーマット2.88Mフロッピーイメージの土台を作る
user$ dd if=/dev/zero of=drdos288.img bs=512 count=5760
user$ su -
root# losetup /dev/loop1 drdos288.img
root# mkdosfs -F 12 -S 512 -R 1 -I -v /dev/loop1
root# losetup -d /dev/loop1
losetup はしかるべきループバックデバイスと、通常ファイルやブロックデバイスを結びつけるコマンド。 -d オプションを付けると結びつけを解除する。 mkdosfs で指定しているオプションは、 512 バイト/セクタで (-S 512)、予約セクタは 1 セクタ (ブートセクタ用) だけ取り (-R 1)、ディスクの全領域を使って (-I)、 FAT12 (-F 12) でフォーマットせよ、の意。 -v オプションで進捗ステータスをバーボスにすればフォーマット中にディスクパラメータが詳しく表示されるので、次の手順のためにメモしておくといいだろう。
2. 1.44Mブートフロッピーから取り出したブートセクタの改造
ここがこの手順で一番チマチマした部分。前述の 土台となる2.88Mフロッピーイメージの作成 の手順 1-1 で用意した bootsect.bin を 2.88M 用に編集、調整する。 BFD は -t 288 を指定すると以下のようなことをやってくれているのだが、それを手作業でやろうというのがこの工程だ。ブートセクタには、ブートプログラムだけでなく、決められた場所にディスクのジオメトリパラメータなども書いてあり、 1.44Mブートフロッピーから dd などで取り出したそのままでは、 2.88M 用には使えない。ハードディスクのブートセクタは都合上いろいろと「ウソ」をついているのでこれほど単純ではないが、フロッピーのブートセクタなら割と簡単だ。当セクションは Hale's HIW: DOS Floppy Disk Boot Sector を参考にした。
まず、予備知識として、1.44M と 2.88M の DOS フロッピーの標準的なジオメトリを見ておこう (カッコ内は 16進表記):
容量 |
メディア
Type |
ヘッド数(面) |
bytes/セクタ |
セクタ/トラック |
セクタ/クラスタ |
FATサイズ[Sect] |
FAT数 |
ルートフォルダ割
当てスロット数 |
セクタ総数 |
総bytes |
1.44M |
0xF0 |
2 (0x0002) |
512 (0x0200) |
18 (0x0012) |
1 (0x01) |
9 (0x0009) |
2 (0x02) |
224 (0x00E0) |
2880 (0x0B40) |
1,474,560 |
2.88M |
0xF0 |
2 (0x0002) |
512 (0x0200) |
36 (0x0024) |
2 (0x02) |
9 (0x0009) |
2 (0x02) |
240 (0x00F0) |
5760 (0x1680) |
2,949,120 |
そして、これらのパラメータがブートセクタのどこに書かれているかを示したのが下の図。これは 2.88M 用に改造済みの DR-DOS のブートセクタファイルを、バイナリエディタで開いたところ。説明のために色づけしてある。問題は最初の 62 バイトだけで、その中でも赤字のパラメータだけ編集すればとりあえず充分。蛇足だが、バイトにまたがる数値の場合は前後バイトを並べ替えて読むので、例えば 2 バイト値の numSectors の場合 0x8016 でなく 0x1680 となる。
Linux 上でのバイナリ編集なら Emacs を使うのが手っ取り早い。 Emacs を引数なしで起動後 Alt+x し、hexl-find-file とコマンドして目的のファイルを指定すればよい。他に、GNOME 環境 GUI で動く ghex というバイナリエディタが使いやすい。 Fedora-Core 3 以降なら Extra パッケージの括りで RPM も用意されている。現行の ghex は、起動するには ghex2 とコマンドする。
3. 改造ブートセクタをフロッピーイメージに書き込む
root# losetup /dev/loop1 drdos288.img
root# dd if=bootsect.bin of=/dev/loop1 bs=512 count=1
root# losetup -d /dev/loop1
ここまででやっと、先頭 512 バイトにブートセクタだけが書かれた空のフロッピーイメージが出来上がる。あとはこれをループバックマウントして必要ファイルを書き込めば出来上がりだ。我ながらショーモナイこと研究したな、と溜息する今日この頃。