Edited at

BitVisorのtelnet_dbgsh機能を使う

BitVisorのtelnet_dbgsh機能を使ってみます。今回はLinux KVMを有効にしたQEMUを使用し、UEFI(OVMF)を指定しています。

設定:


defconfig

(省略)

.telnet_dbgsh = 1,
.tty_mac_address = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
},
.tty_syslog = {
.enable = 1,
.src_ipaddr = { 192, 168, 0, 64 },
.dst_ipaddr = { 192, 168, 0, 27 },
},
.driver = {
.pci = "driver=pro1000, net=ip, tty=1",
},
},
.ip = {
.use_dhcp = 1,
},
};

Intel GbE NIC用のドライバーを指定して、syslogログ出力とTCP/IPスタックを有効にしています。IPアドレスはUDPのsyslogを受け付けるコンピューターのIPアドレスに変えてください。ログ出力の設定に関しては以下の記事をご覧ください。

https://qiita.com/hdk_2/items/2431710fcf257904fc8a

QEMUは適当に以下のようにして起動します。この例ではTCP 8023番ポートを使用しますので、他のポート番号にする場合は適宜読み替えてください。

$ mkdir _

$ ln -s ../bitvisor.elf ../boot/uefi-loader/loadvmm.efi _
$ qemu-system-x86_64 -bios OVMF.fd -cpu host -enable-kvm -m 2048 -snapshot -hda fat:_ -net nic -net user,tcp:127.1:8023-:23

EFI Shellが起動したらloadvmmと打ち込んでBitVisorを起動します。

Shell> loadvmm

BitVisorが起動したら、syslogを参照してきちんとIPアドレスが割り振られたか見てみます。

# tail -4 /var/log/messages

Dec 1 11:17:28 192.168.0.27 bitvisor: PCI: 6 devices found
Dec 1 11:17:28 192.168.0.27 bitvisor: Starting a virtual machine.
Dec 1 11:17:28 192.168.0.27 bitvisor: telnet server "dbgsh" ready
Dec 1 11:17:28 192.168.0.27 bitvisor: IP address changed: 0.0.0.0 -> 10.0.2.15

10.0.2.15はQEMUのSlirpがデフォルトで割り振るIPアドレスですので、良さそうです。QEMUを実行したホスト上からtelnetで接続してみましょう。

$ telnet -- 127.1 -8023

Trying 127.0.0.1...
Connected to 127.1.
Escape character is '^]'.
>

dbgshのプロンプトが出ました。ホスト名はlocalhostでも構いませんが、最初IPv6で接続しにいってからになるので、ここではIPv4アドレスを指定しています。telnetのポート番号に-を指定しているのは、telnet protocol negotiationを強制的に有効にするためです。詳しくはtelnet(1)のmanual pageをご覧ください。

今回はQEMUのhostfwd機能を使って別のポート番号にフォワードさせたのでこんなことになっていますが、23番ポートで接続できるなら、このような指定はいらないです。ただし、本機能にパスワードなどの認証は一切ありませんので、十分ご注意ください。少なくとも、インターネットから接続可能な状態にはしないことをおすすめします。

このdbgsh上で、logコマンドやdebugコマンドが通常通り使用できます。試しに、リセット時に実行されるファームウェアの部分をダンプしてみます。

$ telnet -- 127.1 -8023

Trying 127.0.0.1...
Connected to 127.1.
Escape character is '^]'.
> debug
guest state not found
debug> Dp/10 fffffff0
FFFFFFF0 90 90 EB AC 90 90 90 90-90 90 90 90 90 90 90 90 ................
debug> q
> exit
Connection closed by foreign host.

このようにメモリーダンプができますし、exitコマンドで接続を切ることもできます。telnetを途中で切った場合は、再接続すると続きからになります。

$ telnet -- 127.1 -8023

Trying 127.0.0.1...
Connected to 127.1.
Escape character is '^]'.
> deb
telnet> Connection closed.
$ telnet -- 127.1 -8023
Trying 127.0.0.1...
Connected to 127.1.
Escape character is '^]'.
ug
guest state not found
debug>

また、telnetを切らないまま別のtelnetを開始した場合は、古いtelnetのほうが強制的に切れます。