Bochs
http://bochs.sourceforge.net/
Bochsはx86のエミュレータで,初期の386プロセッサから市場に流通していないような最新のCPUまでを()エミュレートすることができます.
Intelの中の人がメンテナンスをしているようです.
現在でも頻繁に更新されていて,helpに質問を投げると割とすぐ返してくれたりしました.
使い方
手順
Bochs本体のインストール
最新版はこのページ
このページの最後にSVNスナップショットも乗っていました.
コンフィグのオプションとして,
./configure --enable-vmx=2 \\
--enable-x86-64 \\
--enable-all-optimizations \\
--enable-long-phy-address \\
--enable-avx \\
--enable-cpu-level=6 \\
--enable-configurable-msrs \\
--enable-fpu \\
--enable-alignment-check \\
--enable-svm \\
--with-all-libs \\
--enable-e1000 \\
--enable-evex \\
--enable-gdb-stub
を渡しました.--enable-vmx=2
でeptの有効化,--enable-x86-64
でx86-64の有効化,--enable-e1000
でe1000の有効化ができます.
そのほかのオプションはbochs内で現在一番機能のあるcpumodelであるcorei7_icelake_u
を動作させるために有効化しました.
イメージの取得
公式に配布されているイメージもあるのですが,
このページでDebian Jessieインストール済みのディスクイメージが公開されているので,これを使うのが楽かと思います.
これらのイメージのユーザーはこのようになってます.
Username: root
Password: toor
Username: bochs
Password: bochs
ディスクイメージからOSをインストールするのは(大変だと思うので)あまりお勧めではないです. 自分はうまく動かせませんでした...
bochsrcの準備
Bochsではエミュレートするマシンの情報をbochsrcというファイルに記述します.
自分はこちらのDebian Jessie起動用bochsrcを参考に
info: action=report
romimage: file=$BXSHARE/BIOS-bochs-latest
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
cpu: model=corei7_icelake_u, ips=1200000000
cpuid: x86_64=1, vmx=2, 1g_pages=1, pcid=1
clock: sync=realtime
megs: 2048
boot: disk
# gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0
# Hard disks.
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="DebianJessie64.img", cylinders=4161, heads=8, spt=63
# network
pci: enabled=1, chipset=i440fx
## linux
#e1000: mac=52:54:00:12:34:56, ethmod=linux, ethdev=enp0s25
# socket
e1000: mac=52:54:00:12:34:56, ethmod=socket, ethdev=40000, script=''
詳しい書き方は[マニュアル] (http://bochs.sourceforge.net/doc/docbook/user/bochsrc.html)を参照するのが良いと思います.
基本的にはcpuのモデルに基づいて使える機能が決まりますが,cpuidで細かく設定することもできるようです.
ネットワークインタフェースに関してはBochsのマニュアルに書いてありますが,インターネットにつなぎたいときはlinux
を,bochs間で通信させたいときはsocket
を使いました.(それしかうまく動かなかったので...)
あと,gdbstubの行のコメントアウトを外すと,gdbを使ってデバッグができるようになります.
起動
bochsrcとイメージを用意したら,それらと同一のディレクトリでbochs
コマンドをたたけばbochsのウィンドウが現れ,起動すると思います.
Tips
Diskの操作
Diskにファイルをコピーしたいときは,自分はマウントして直接操作しました.
mount -t ext4 -o loop,rw,offset=1048576 DebianJessie64.img.backup disk
でマウントできると思います.
また,カーネルモジュールのコンパイルやファイルのダウンロードなどはマウント先ディレクトリにchroot
して行いました.
もしもっといい方法があれば教えてください.
イメージのリサイズ
- qemu-imgでファイルサイズを拡大
qemu-img resize DebianJessie64.img +40G
- partedでパーティションを変更
$ parted DebianJessie64.img
(parted) unit s
(parted) resizepart 2 -1s
(parted) q
- resize2fsで拡大したパーティションをext2fsでフォーマット
$ losetup -f
$ sudo mount -t ext2 -o loop,rw,offset=1048576 DebianJessie64.img disk
$ sudo resize2fs /dev/loop??
$ sudo umount disk
のようにしてイメージのリサイズを行いました.
ネットワーク
前述のとおり,ネインターネットにつなぎたいときはlinux
を,bochs間で通信させたいときはsocket
を使いました.
また,socket
を使いたいときにはbxhub
のプロセスが立ち上がっている必要があります.