VMwareとBochsを使ってみる

YAMAMORI Takenori ●yamamori
●Bochsを使ってみる

Bochs(http://bochs.sourceforge.net/)は C++で書かれたマルチプラットフォーム指向のPCエミュレータです. Bochsは「ボックス」と発音します. Bochsは,VMwareが話題になった'99年よりもずっと前から存在しており, 筆者自身は'97年にBochsをダウンロードして試用したことがあります. BochsはVMwareとは違ってソースファイルで配布されており, “./configure; make”が通る限り,様々なOS上で動作します.

Bochsでは,CPU命令自体もエミュレーションを行なうため, x86系以外のCPUを用いたマシン上でも動作します. (ドキュメントによると,SPARC/Alpha/MIPSなどでも動作可) 実は筆者は,かつてはPC/AT互換機を全く持っておらず, SunOS 4.xやSolaris 2.xがインストールされたSPARCstation上でBochsをmakeし, そのBochsでPC/AT版のLinuxやFreeBSD/NetBSDなどのインストーラをブートし, その様子をかいま見たりしたものでした. ただし当時のBochsは, ソースファイルを自由にダウンロードできるにも関わらず有料のソフトウェアでした. 無料で使用する場合は, 「ダウンロード後30日間のみ試用できる」とか, 「1暦年の間に2つを超えるバージョンを試用してはいけない」といった 制限がついていました.

ところが2000年3月に,BochsのライセンスがLGPLに変わりました. これで以前のような制限を気にすることなくBochsを使用してよくなったのです. また,BochsのソースコードはPlex86(http://www.plex86.org/)という エミュレータに取り込まれています. Plex86は,以前のFreeMWareを改称したものです. 同Webページの2000年3月23日付けの記述によると, "MandrakeSoft, a leading Linux distro, bought bochs to be released as open source (LGPL) and has employed Kevin Lawton, the lead plex86 developer. " とあります.

このPlex86は,その名が示す通りx86系CPUに特化したエミュレータとなっており, この点はBochsとは異なります. 少し前に筆者が実際にPlex86をインストールしてみた限りでは, Bochsそっくりの画面が立ち上がるものの,そこでは“null kernel”と呼ばれる, テスト用のBIOSのようなものが起動するのみで, 実際にゲストOSをインストールできるのはもう少し先という感じでした.

Plex86については開発が進行中のようですので今後に期待するとして, ここではBochsを使ってみた様子を御紹介します.

●Bochsの入手

Bochsは, http://bochs.sourceforge.net/ からダウンロードできます.

執筆時点ではbochs-2000_0325a(ファイル名 bochs-2000_0325a.tar.gz)を使用しています.(現在はさらに新しいバージョンが出ています)

●フォント“vga.pcf”のインストール

Bochsでは,PCのコンソール画面のフォントとして,X側のフォントを用います. このため,Bochsを展開したディレクトリ以下にあるfont/vga.pcfを, 使用するXサーバのフォントに追加する必要があります. Bochs本体のインストールの前に, vga.pcfのインストールを済ませておきましょう.

ホストOSがVine 2.0の場合, フォントはローカルのフォントサーバから得るように設定されているため, フォント追加の手順は以下のようになります.

# cd /usr/X11R6/lib/X11/fonts/misc
# cp -p 作業ディレクトリ/bochs-2000_0325a/font/vga.pcf .
# mkfontdir
# chmod go+r vga.pcf fonts.dir
# /etc/rc.d/init.d/xfs restart

なお,フォントサーバxfsを使用していない通常のX環境の場合は, mkfontdirなどの作業のあと, “xset fp rehash” を実行してフォント設定を反映させればOKです.

ここで,“xterm -fn vga”とオプションを付けてxtermを起動してみましょう. vgaのフォントでxtermが立ち上がればOKです.

ところでフォントの追加作業は慎重に行なって下さい. 作業内容が不適切な場合,最低限必要なフォントが読めなくなり, X自体が起動しなくなることもあるのでので注意が必要です.

たかだかエミュレータのためにフォントをいじりたくないという場合は, 以下のようにしてvgaの代わりにa14などの一般的なフォントを使うように Bochsのソースを修正することもできます. ただしこの場合は,vgaフォントの中にある罫線などは化けてしまうことになります.

* vgaフォントをa14で代用するためのソースの修正
----
ソースファイルgui/x.ccの中のload_font()関数を見つけ,
その中の以下の部分を修正する.(525行目付近にある)

  XLoadQueryFont(bx_x_display,"vga")
       ↓                     =====
  XLoadQueryFont(bx_x_display,"a14")
                              =====
----
●Bochsのインストール

Bochsは,“./configure; make”方式でコンパイルできます. インストール方法を含めた詳しいドキュメントが Bochsのソースを展開したディレクトリ以下の, docs-htmlディレクトリに,HTMLファイルで置かれています. なお,現状のBochsは,“make install”によって/usr/local/bin などにインストールするようにはなっていません. Bochsのmake後,カレントディレクトリ上にファイル名bochsで 実行バイナリが作成されるので,それを直接起動するようにします.

まずは,“./configure --help | less”として, configureのオプションを確認しておきましょう. docs-html/configure.htmlに,詳しい説明があります. 現状では,オプションは存在するものの実際にそれを指定すると configureやmakeが通らなくなるものがあるので注意して下さい.

たとえば“--enable-dynamic”は, その名が示す通りVMwareのようにCPU命令を ネイティブに実行させるようにするものですが, 現状では未完成で,ドキュメントにも“Don't use this option”とあります.

“--enable-cdrom”はホストOS(BochsでもVMwareにならってホスト/ゲストOSと 呼ぶことにします)のCD-ROMをゲストOSから使えるようにするための オプションですが,現状はLinuxのみの対応です.

ネットワークカードのNE2000のエミュレーションを行なうためのオプションの “--enable-ne2000”は,BPF(Berkeley Packet Filter)を使う関係で FreeBSDのみの対応となっています. ただし,このオプションを使う場合,Bochsのソースのiodev/eth.ccを, 以下のように修正しないとコンパイル時にエラーが出てmakeが中断します. 今後はLinuxにおいても,LSF(Linux Socket Filter)を使って, ネットワークカードのエミュレーションが行なえるようになることを 期待したいと思います.

* iodev/eth.cc(60行目付近)の修正
------
(修正前)
---
#ifdef ETH_NULL
  {
    extern bx_null_match;     ← ここ
    if (!strcmp(type, "null"))
      ptr = (eth_locator_c *) &bx_null_match;
  }
#endif
#ifdef ETH_FBSD
  {
    extern bx_fbsd_match;     ← ここ
    if (!strcmp(type, "fbsd"))
      ptr = (eth_locator_c *) &bx_fbsd_match;
  }
#endif
---

(修正後)
---
#ifdef ETH_NULL
  {
    extern int bx_null_match;     ← ここ
    if (!strcmp(type, "null"))
      ptr = (eth_locator_c *) &bx_null_match;
  }
#endif
#ifdef ETH_FBSD
  {
    extern int bx_fbsd_match;     ← ここ
    if (!strcmp(type, "fbsd"))
      ptr = (eth_locator_c *) &bx_fbsd_match;
  }
#endif
------

FPUに対応するための“--enable-fpu”オプションは 問題なく使えるので付けておきましょう. Bochsに限らず,FPUがないとWindows 98がインストールできません.

また,Linux上ではSound Blasterのエミュレーションが使えるので, “--enable-sb16=linux”を付けます.

筆者はBochsを, Vine Linux 2.0,FreeBSD 4.1-RELEASE,Solaris 8/SPARC上でmakeしましたが, 結局その時に用いたconfigureのオプションは以下のようになりました.

* Linuxの場合:
  ./configure --enable-fpu --enable-cdrom --enable-sb16=linux

* FreeBSDの場合:(iodev/eth.ccの修正が必要)
  ./configure --enable-fpu --enable-ne2000

* Solaris/SPARCなどの場合:
  ./configure --enable-fpu

なお,configureの実行前に, 環境変数のうちで特にコンパイラの最適化に関わるCFLAGSとCXXFLAGSについて, 以下のように設定しておくのがよいようです(x86系CPU環境の場合).

CFLAGS='-Wall -O2 -m486 -fomit-frame-pointer -pipe'
CXXFLAGS="$CFLAGS"

あと,configureオプションを変更したり, あるいはBochsのソースの一部を修正した場合の再make時の注意があります. BochsのMakefileは, サブディレクトリを含めたファイルの依存関係の記述が完全ではないようで, ソース等の修正後,トップディレクトリ上で再びmakeを実行しても 必要なコンパイルを行なってくれません. この場合,手動で該当する*.oや*.aを消すか, サブディレクトリに降りて直接makeするか, あるいは“make all-clean”を実行してからフルmakeする必要があります. (トップディレクトリでの“make clean”は, サブディレクトリには効きませんので,“make all-clean”として下さい)

●Bochsの設定

Bochsのmakeが終了したら, とりあえず様子を見るため起動してみたくなるでしょう. ところが,makeしたばかりの場合は以下のようにエラーが出て起動しないはずです.

$ ./bochs
bochs exited, log file was './bochs.out'

またFreeBSDの場合,Bochsの終了後, Bochsを起動したxtermなどのttyの設定が元に戻らないようで, [Ctrl]+[J]reset[Ctrl]+[J]と入力して端末を復帰させる必要があります.

bochsを起動するには,まず,bochsを展開したディレクトリ上にある “.bochsrc”というファイルを修正して設定を行ない, また,エミュレータが使用するハードディスクとフロッピーディスクの イメージファイルを作成しなければなりません. これらはすべて手作業で行ないます. VMwareとは違って,ウィザードのようなものが立ち上がって 自動的にこれらの設定を行なってくれたりはしません.

.bochsrc”の設定例を以下に示します.

“.bochsrc”の設定
--------
----
#megs: 64
#megs: 32
megs: 16    ← Bochsでエミュレートするメモリ容量.1箇所をアンコメントする.
#megs: 8
----

----
floppya: 1_44=../1.44a, status=inserted
                 ↑ フロッピーのイメージファイルの指定
----

----
diskc: file=../504M, cyl=1024, heads=16, spt=63
                 ↑ ハードディスクのイメージファイルの指定
----

----
cdromd: dev=/dev/cdrom, status=inserted
                 ↑ Linuxの場合,CD-ROMドライブの行をアンコメントする
----

----
sb16: midimode=1, midi=/dev/midi00, wavemode=1, wave=/dev/dsp,
  loglevel=2, log=sb16.log, dmatimer=600000
                 ↑ Linuxの場合,sb16の行をアンコメントする
                    (折り返しているが実際には1行)
----

----
#log: ./bochs.out
log: /dev/tty      ← logはファイルではなく,画面に出すと見やすいでしょう
----

“.bochsrc”の設定項目には, “boot: c”という,ブートドライブをCドライブ(ハードディスク)に 指定する記述がありますが,これはそのままにしておきます. フロッピーから起動したい場合は コマンドラインで“./bochs boot:a”とオプションを付けることができるため, このようにした方が便利でしょう.

ハードディスクについては, そのシリンダ・ヘッド・セクタの値を“.bochsrc”の中で指定します. いちいち値を計算するのは面倒ですので, “.bochsrc”にコメントアウトで記述されているハードディスクの記述のうち, 使用したいサイズに近いものを使うようにするとよいでしょう.

●ハードディスクのイメージファイルの作成

それではハードディスクのイメージファイルを作成しましょう. ここでは,

“diskc: file=../504M, cyl=1024, heads=16, spt=63”

という設定を用いていますので, ハードディスクの正確なサイズは, 1024*16*63*512 = 504*1024*1024 = 528482304(バイト) となります.よって,以下のようにしてイメージファイルを作成します. これは,Bochsのディレクトリのひとつ上のディレクトリ上で行ないます.

$ dd if=/dev/zero of=504M bs=1M count=504

念のため“ls -l 504M”で,ファイルサイズを確認しておきましょう.

●フロッピーディスクのイメージファイルの作成

次にフロッピーディスクのイメージファイルの作成です. 実際にはゲストOSをインストールするための起動ディスクの イメージファイルを作成することになるでしょう. 実際のフロッピーディスクから吸い出す場合は,

$ dd if=/dev/fd0 of=1.44a bs=1440k count=1

のようになります. OSのインストールCD-ROM上にイメージファイルが存在する場合は, それをそのままコピーすればOKです.※注

※注

このとき,作成したイメージファイルの書き込みパーミッションを 立てたままにしておかなければなりません. インストール用フロッピーのイメージには書き込みが起きるはずはないので, 安全のためリードオンリーにしたくなるところですが, そうするとBochsが正常に起動しません(バグと思われます).

インストールフロッピーイメージからブートするために, “./bochs boot:a”で起動します. ちなみに,はじめてBochsを起動する際に, 誤って/dev/zeroをコピーしたばかりの 中身のない仮想ハードディスクからブートしようとすると, Bochs内のBIOSは容赦なく暴走しますので注意して下さい.


To 『VMwareとBochsを使ってみる』index


このページは、技術評論社 「すみからすみまでLinux〜テクニカル編」および SoftwareDesign 2000年8月号、『VMwareとBochsを使ってみる』の原稿を元に、Web 用に再構成したものです。
To 謎の処理系 SunOS 4.1.4 with Linux/FreeBSD [Home]
yamamori