はじめに
筆者はFreeBSDを使い初めてからほぼ4半世紀になりますが過去にFreeBSD上で利用作成したソフトウェアも数知れず、その中には手元に当時の実行バイナリのみ残っていてソースが行方不明になってしまった物も多数あります、当時の実行バイナリは現在主流のELFフォーマットでは無く過去のa.outフォーマットの物もあります、当時のバイナリを実行しようとすると,
$ ./hello
-bash: ./hello: cannot execute binary file: Exec format error
と警告されれて悲しい思いをする事もしばしば...、fileコマンドで確認すると、
$ file ./hello
./hello: FreeBSD/i386 compact demand paged dynamically linked executable not stripped
実行ファイルがa.out形式だと言う事が判ります。
これらの現在は実行できないバイナリを何とかして復活できないか調べるとqemuパッケージを使って過去のOS環境を再現する事で実行出来ると言う事が分かりました。
現在では過去のOSバージョンをbhyve上のゲストとして仮想環境を作成する事で実行する事も可能ですが残念ながらbhyveではFreeBSD 9.3Rよりも古いOS環境は仮想ドライバの関係でインストールする事自体が出来ません。
また通常利用の環境にqemuをインストールすればqemuの環境を設定する事は出来ますが、ネットワーク、その他の設定を大幅に変更するのはトラブルの原因になると思われるので、あまり好ましくありません、そこでbhyveゲスト上にqemuをインストールして旧OSの実行環境を再現する事が出来ないかと考えました、この方法であればホスト環境にはあまり影響を与えないでゲスト環境の設定に問題があったとしてもゲストOSを自由に起動、終了する事が可能になるので設定の自由度も向上すると思います。
今回はbhyveゲストはFreeBSD 14.3R amd64、qemuゲストはFreeBSD 2.2.9R i386 と言う環境を再現してみました。
母艦の作成
母艦と言ってもbhyveゲストなので、実行するシステム上で作成するだけです、私は普段vm-bhyveパッケージを使っているので以下の様な感じ。
# vm create -c 2 -m 2G qemu-base
# vm install -i qemu-base FreeBSD-14.3-RELEASE-amd64-disc1.iso
ゲストOS内で更にqemu仮想環境を実行するのでメモリとCPUは通常の環境よりもリソースは少し増やしておくのが良いと思います。
bhyveゲストについては適時インストール、設定しておきます。
qemuパッケージのインストール
bhyveゲストの設定が完了後、bhyveゲストにログインしてqemuパッケージをインストールを行います、通常の様にpkgコマンドでインストールするのが簡単でしょう。
今回はbhyveゲストにX11環境を構築していませんのでqemu-nox11パッケージをインストールしました。
root@qemu-base# pkg install -y qemu-nox11
qemuゲストのインストール
昔は雑誌の付録等にFreeBSDの配布CDが添付されている場合もありましたが現在では手に入れる事も出来ないし、昔使っていたCDも処分してしまって手元にありません、有難い事に旧バージョンのisoイメージが公開されている公式アーカイブがありますのでそちらからダウンロードします。
qemu-base$ fetch http://ftp-archive.freebsd.org/pub/FreeBSD-Archive/old-releases/i386/ISO-IMAGES/2.2.9/2.2.9-RELEASE.iso
ダウンロードしたisoファイルは適当な場所に配置しておきます、qemuゲストの仮想HDDと同じ場所に置いておくのが良いでしょう。
次にqemuゲスト用の仮想ディスクをqemu-imgコマンドで作成します。
qemu-base$ qemu-img create -f qcow2 fbsd-hdd.img 2G
ここまで完了した所でダウンロードしたisoファイルを使って、qemu -system-*コマンドを使ってゲストを起動します、-mでメモリサイズ(256MB)、-hdaはゲストの仮想ディスク、-cdromでインストールCDを指定しています、ネットワークカードは懐かしのノベルのNE2000互換カードです。
qemu-base$ qemu-system-i386 -S -m 256 -hda fbsd-hdd.img -cdrom 2.2.9-RELEASE.iso \
-nic user,model=ne2k_pci -boot d -vnc :1 -monitor stdio
QEMU 10.1.0 monitor - type 'help' for more information
(qemu)
'-S'オプションを付けないでそのまま実行しても良いのですが、正常に起動されているか状況を確認したいのであえてオプションを指定して、suspend状態で起動しています。
この状態ではqemuモニタのみ起動していてゲストOSはまだ起動されていませんので、まずqemuモニタのinfoコマンドでインストールCDとターゲットのHDD、ネットワークデバイスが認識されているかを確認、またqemuのvncサーバも起動しているのでbhyveゲストのアドレス+5901ポートに適当なvncクライアントで接続してqemuゲストのコンソールに接続出来るか確認して、以降はvncクライアントからの作業となります。
(qemu) info network
ne2k_pci.0: index=0,type=nic,model=ne2k_pci,macaddr=52:54:00:12:34:56
\ #net026: index=0,type=user,net=10.0.2.0,restrict=off
(qemu) info block
ide0-hd0 (#block169): fbsd-hdd.img (qcow2)
Attached to: /machine/unattached/device[4]
Cache mode: writeback
ide1-cd0 (#block330): 2.2.9-RELEASE.iso (raw, read-only)
Attached to: /machine/unattached/device[5]
Removable device: not locked, tray closed
Cache mode: writeback
floppy0: [not inserted]
Attached to: /machine/unattached/device[15]
Removable device: not locked, tray closed
(qemu)
qemuゲストを起動するにはqemuモニタコマンド 'c' を実行します、qemuゲストが起動するとvncコンソールにboot loaderのメニューが表示されます。
(qemu) c を実行する
おお!、懐かしい起動画面が... (笑)
しばらくするとkernel設定メニューが表示されるので、Installationを選択します。

kernelが起動しますのでデバイスが認識されているか確認します。

NE2000カード(ed1)とIDEディスク(wd0)が認識されている事が確認出来ました、ディスクチェックにしばらく時間が掛かるのでしばらく待っていると、インストーラメニューが表示されます。

ここまで来れば後はインストーラの指示に従ってインストールを進めるだけです。
注意点としてはネットワーク設定でこの例ではqemuのネットワークはユーザモードで起動していますのでデフォルトでは、
qemuゲストIP: 10.0.2.15 ~ 254/24
gateway: 10.0.2.2
nameserver: 10.0.2.3
を設定しておけば、インストール完了後にゲストコンソールからqemuのNATを経由して外のネットワークに接続する事が出来る様になります。
正常にインストールが完了して再起動を求められたら、CDを取り外す様に指示されるのでqemuモニタからejectコマンドでCDROMを取り出してから再起動します。
(qemu) eject ide1-cd0
ゲストOSが正常に起動して、login: が表示されたらログイン出来るか確認してdmesg等で状況を確認してみます。

4半世紀ぶりにFreeBSD 2.2.* 環境を立ち上げる事が出来ました、これで過去に作成したFreeBSD実行バイナリを有効利用が出来そうです。
qemuゲストのネットワーク設定
このまま、vncクライアントから作業しても良いのですがゲストを起動する度にvncクライアントを立ち上げるのも面倒なので現状では最低telnet接続出来る様にして起動しています、sshはバージョンが古すぎて最新環境では接続出来ない様です。
emu-base$ qemu-system-i386 -m 256 -hda fbsd-hdd.img \
-nic user,model=ne2k_pci,hostfwd=tcp::10023-:23 -boot c -vnc :1 -monitor stdio
QEMU 10.1.0 monitor - type 'help' for more information
(qemu)
この設定でbhyveゲストの10023ポートにtelnetでqemuゲストにログイン出来る事は出来ました、母艦のtap,tunインターフェイスを設定すれば他ネットワークからも接続出来る様になりますが当面はこれでも問題無い感じです。
最後に
再現したFreeBSD 2.2.*環境ですが調べてみると当時はLet's Note AL-N2T515J5と言う環境でした、
FreeBSD 2.2.7-RELEASE #0: Thu Jun 22 20:06:10 JST 2000
tika@bacchus:/usr/src/sys/compile/BACCHUS
CPU: Pentium/P55C (146.10-MHz 586-class CPU)
Origin = "GenuineIntel" Id = 0x544 Stepping=4
Features=0x8001bf<FPU,VME,DE,PSE,TSC,MSR,MCE,CX8,MMX>
real memory = 50331648 (49152K bytes)
avail memory = 46546944 (45456K bytes)
Initializing PC-card drivers: aic hss ed ep fe sn wlp scc sio spc wdc ncv stg
...
CPUもメモリも現在と比較するとかなり寂しい状況でネットワーク接続もPAOを使ってPCMCIAカードで接続を行なっていました、再現した環境を少し使ってみましたが感覚としては当時とあまり変わらない感じですbhyve+qemuのゲスト環境とは言えこれだけのパフォーマンスは当時を考えると隔世の感があります良い時代になりました。
この記事が旧システム環境を再現したい方の参考になればと思います。
