1. 配置Guest的串口
更新ports,目前VirtualBox的版本为4.2.12。在VirtualBox里安装完FreeBSD后,修改/boot/device.hints:
hint.uart.0.flag=”0x90”
这里只用把串口的高8位置为1即可。另外,现在FreeBSD版本里的串口设备不再以sio来命名;在device.hint配置的是uart,而实际连接的/dev/cuau0。
在VirtualBox的串口配置界面里,选择使用com1,I/O端口采用默认值,端口模式选用主机管道,勾选上创建通道。对应的管道文件的路径为/tmp/vboxpipe_FreeBSD9_64(路径自行决定)。
在启动Guest系统后,就会在这个路径上创建vboxpipe_FreeBSD9_64的socket文件。
2. 安装socat
进入/usr/ports/net/socat,安装socat。这个工具目前用来代替nc,提供的功能非常强大,可以直接完成简单的NAT端口映射。我们这里用来做TCP到/tmp/vboxpipe_FreeBSD9_64连接。
3. 配置VirtualBox的Guest网络环境
这里验证了好几种方式,为了和Guest进行通讯,我们能采用的网络连接方式为:桥接和Host Only的方式。、
1.桥接
a.在Host里分别创建tap和bridge设备:
ifconfig bridge create
ifconfig tap create
上述命令会自动分配bridge0和tap0
b.建立tap0和Host的物理网卡连接
ifconfig bridge0 addm tap0 add re0 up
这里re0是我的物理网卡。上述命令建立了从re0和tap0的桥接,而bridge0只是一个桥接设备。
c.给bridge0分配IP
我采用的都是DHCP方式,直接给bridge0分配IP地址:
dhclient bridge0
如果不这样子做的话,当设置VirtualBox的Guest主机为桥接方式连接到tap0上时,是无法ping通外网的。话说这里的原因也没有时间去追究,一切以先完成目标为主。
d.配置Guest的网络
在Guest的网络配置里设置连接方式为桥接,连接的网卡为tap0
上述的bridge和tap的配置可以直接写到/etc/rc.conf里:
cloned_interfaces=”tap0 bridge0”
ifconfig_bridge0=”addm re0 add tap0”
但bridge0的IP地址只能通过手动方式来获取,即便是在上面的ifconfig_bridge0里添加SYNDHCP,结果还是一样的,手动进行DHCP方式如下:
dhclient bridge0
2.Host Only
采用Host Only的时候,Guest的网络配置那里会出现vboxnet0,选择连接vboxnet0,此时启动Guest系统,系统默认采用DHCP来获取IP。此时能得到和vboxnet0一个网段的IP地址。但此时仍然无法ping通外网。但可以通过scp等命令把带调试信息的内核传给Guest主机。
4. 准备调试环境
编译带调试版本的FreeBSD内核,可以参考使用《qemu来调试FreeBSD系统内核》,得到带调试版本的内核后,更新到Guest系统上。
5. 开始调试
1.启动Guest系统,此时会生成对应的管道文件/tmp/vboxpipe_FreeBSD9_64
2.当Guest系统进入启动菜单项的时候,按Esc键进入命令行模式,输入boot -d进入调试模式,然后输入gdb进入gdb调试方式
3.使用socat创建TCP到管道的连接:
socat tcp4-listen:1234 /tmp/vboxpipe_FreeBSD9_64
4.使用GDB开始进行调试:
我使用的是GDB7.5.1,接入gdb后,设置当前的系统架构:
set architecture i386:x86-64:intel
加载完符号表后连接Guest主机进行调试:
target remote 127.0.0.1:1234