どんがらりん - 道具としての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 作りに使うツールを紹介しておこう。

以上のことを、お金を掛けてラクにやりたい人は、こんなページ読まずに WinImageUltraISO を使ってください。あたしゃ地道に行くよ。とはいえ UltraISO はブート CD からブートファイルを取り出したりフロッピーイメージの内部を閲覧/編集できて便利なので、私も利用させてもらっています。

作業上の注意

ハードディスクエミュレーションCDの作り方

CD 内のブートイメージがハードディスク (C: ドライブ) として認識されるタイプ。

1. DOSシステムをハードディスク上で作り込み

好みの DOS とドライバやバッチを組み合わせて、ハードディスク上に DOS システムを構築。今までに気づいたポイントを挙げると;

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 ファイル名の RockRidge 拡張を有効にする
-hard-disk-boot ハードディスクエミュレーションに
-b bootfile ブート種にするブートイメージファイル。ソースディレクトリからの相対指定
-c catalog_file_to_create 作成させるブートカタログファイル。 boot.cat とするのが通例
-V label 特に必要でない。CD-ROM のボリュームネーム
-sysid description 特に必要でない。システム識別子
-o output_file 出力先のファイル名。指定しないと mkisofs はコンソール画面に出力してしまう

なお、mkisofs を走らせた時に、 「ブートイメージのブートレコードで定義されているセクタ数と、ブートイメージの実際のファイルサイズが食い違っている」 と警告が出ることがある。 実サイズがブートレコード定義より若干大きいならほっておいて構わないが、ショートしているということはイメージ内のパーティションがぶっちぎれている可能性があるので気持ち悪い。その場合は 2-2 の行程で count=xxx を 1 だけ増やして書き出す。

4. 焼く

お好きなライターでご自由に。

2.88MフロッピーディスクエミュレーションCDの作り方

CD 内のブートイメージが A: ドライブに見えるタイプ。 1.44M フロッピーイメージのブータブル CD ならどんな CD ライティングソフトでも簡単に作れるが、ここで取り上げるのは 2.88M フロッピーイメージを封じ込むもの。

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上]
  1. BFD インストールディレクトリ下の os ディレクトリに drdos というフォルダを作る。
  2. 前行程で取り出したブートセクタファイル bootsect.bin を drdos フォルダにコピー。
  3. さっきの 1.44M 起動 FD から、最小限のシステムファイル (COMMAND.COM, DRBIO.SYS, DRDOS.SYS。DOS の種類によって異なる) を drdos フォルダにコピー。その他のファイルは後の行程でいくらでも追加/変更できるので気にしない。
  4. 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 ドライバとの違いは以下;
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 に含めるように仕組んである。
サンプルファイル

DOS に関するその他の覚え書き

MSCDEX.EXE の戻り値

DR-DOS の NWCDEX.EXE は、戻り値 (ERRORLEVEL) を返さないところがツラい。 Microsoft の MSCDEX.EXE は返すのに...。 実際に調べてみた MSCDEX.EXE の戻り値は以下:

ちなみに、MSCDEX.EXE や NWCDEX.EXE は CD-ROM "ドライバ" ではなく、「リダイレクタ」というものだそうだ。下位ドライバによって認識された CD-ROM を一種のネットワークドライブとしてマウントして通信を橋渡しするものらしい (理解浅し)。

USBASPI.SYS のコマンドラインオプション

怪しいものも含む (下へ行くほど怪しくなる)。

RAM ディスクの作成とドライブレターの検出

RAM ディスクドライバには、 DR-DOS の VDISK.SYS、 Win98/ME の RAMDRIVE.SYS、 FreeDOS の TDSK.EXE などがある。利用のポイント;

Linuxだけで2.88Mフロッピーイメージを作る方法

かなり泥臭く手仕事の多いやり方だが、フロッピーのブートセクタの仕組みが分かったりして面白いかもしれない。なお、以下に出てくる mkdosfsmkfs.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 バイトにブートセクタだけが書かれた空のフロッピーイメージが出来上がる。あとはこれをループバックマウントして必要ファイルを書き込めば出来上がりだ。我ながらショーモナイこと研究したな、と溜息する今日この頃。