1. 配置Guest的串口
更新ports,目前VirtualBox的版本為4.2.12。在VirtualBox里安裝完FreeBSD后,修改/boot/device.hints:
hint.uart.0.flag=”0x90”
這里只用把串口的高8位置為1即可。另外,現(xiàn)在FreeBSD版本里的串口設備不再以sio來命名;在device.hint配置的是uart,而實際連接的/dev/cuau0。
在VirtualBox的串口配置界面里,選擇使用com1,I/O端口采用默認值,端口模式選用主機管道,勾選上創(chuàng)建通道。對應的管道文件的路徑為/tmp/vboxpipe_FreeBSD9_64(路徑自行決定)。
在啟動Guest系統(tǒng)后,就會在這個路徑上創(chuàng)建vboxpipe_FreeBSD9_64的socket文件。
2. 安裝socat
進入/usr/ports/net/socat,安裝socat。這個工具目前用來代替nc,提供的功能非常強大,可以直接完成簡單的NAT端口映射。我們這里用來做TCP到/tmp/vboxpipe_FreeBSD9_64連接。
3. 配置VirtualBox的Guest網(wǎng)絡環(huán)境
這里驗證了好幾種方式,為了和Guest進行通訊,我們能采用的網(wǎng)絡連接方式為:橋接和Host Only的方式。、
1.橋接
a.在Host里分別創(chuàng)建tap和bridge設備:
ifconfig bridge create
ifconfig tap create
上述命令會自動分配bridge0和tap0
b.建立tap0和Host的物理網(wǎng)卡連接
ifconfig bridge0 addm tap0 add re0 up
這里re0是我的物理網(wǎng)卡。上述命令建立了從re0和tap0的橋接,而bridge0只是一個橋接設備。
c.給bridge0分配IP
我采用的都是DHCP方式,直接給bridge0分配IP地址:
dhclient bridge0
如果不這樣子做的話,當設置VirtualBox的Guest主機為橋接方式連接到tap0上時,是無法ping通外網(wǎng)的。話說這里的原因也沒有時間去追究,一切以先完成目標為主。
d.配置Guest的網(wǎng)絡
在Guest的網(wǎng)絡配置里設置連接方式為橋接,連接的網(wǎng)卡為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的網(wǎng)絡配置那里會出現(xiàn)vboxnet0,選擇連接vboxnet0,此時啟動Guest系統(tǒng),系統(tǒng)默認采用DHCP來獲取IP。此時能得到和vboxnet0一個網(wǎng)段的IP地址。但此時仍然無法ping通外網(wǎng)。但可以通過scp等命令把帶調試信息的內核傳給Guest主機。
4. 準備調試環(huán)境
編譯帶調試版本的FreeBSD內核,可以參考使用《qemu來調試FreeBSD系統(tǒng)內核》,得到帶調試版本的內核后,更新到Guest系統(tǒng)上。
5. 開始調試
1.啟動Guest系統(tǒng),此時會生成對應的管道文件/tmp/vboxpipe_FreeBSD9_64
2.當Guest系統(tǒng)進入啟動菜單項的時候,按Esc鍵進入命令行模式,輸入boot -d進入調試模式,然后輸入gdb進入gdb調試方式
3.使用socat創(chuàng)建TCP到管道的連接:
socat tcp4-listen:1234 /tmp/vboxpipe_FreeBSD9_64
4.使用GDB開始進行調試:
我使用的是GDB7.5.1,接入gdb后,設置當前的系統(tǒng)架構:
set architecture i386:x86-64:intel
加載完符號表后連接Guest主機進行調試:
target remote 127.0.0.1:1234