本文在ubuntu 16.04 lts 中实做完成,如果用其他发行版,可能需要的软件包名称会有细微区别。
安装软件包
$ sudo apt-get install bridge-utils uml-utilities vtun qemu
配置tun网络
tun/tap 建立一个与qemu内系统可以通信的网络,由上一步中的 bridge-utils 和 vtun 包提供,所涉及命令如下:
$ sudo /etc/init.d/vtun start
$ sudo chmod a+rw /dev/net/tun
$ sudo brctl addbr br0
$ sudo ifconfig br0 192.168.100.1 netmask 255.255.255.0 up
$ sudo tunctl -b -u 1000 -t tap0
$ sudo ifconfig tap0 0.0.0.0 promisc
注意 tunctl 命令中的 -u 参数,它是用户ID,系统默认第一个用户的ID是1000,根据实际的用户ID填写。
测试qemu能否正常工作
执行命令:
$ qemu-system-x86_64 -kernel kernels/ubuntu/linux-4.4.0/arch/i386/boot/bzImage -net nic,model=rtl8139 -net tap,ifname=tap0,script=no -initrd rootfs.ext2
如图所示,系统正常启动了:
在qemu中的系统中设置与br0同一网段的ip,看网络是否正常:
网络已经正常。
通过qemu的gdb-stub调试
启动qemu:
$ qemu-system-x86_64 -kernel kernels/ubuntu/linux-4.4.0/arch/i386/boot/bzImage -net nic,model=rtl8139 -net tap,ifname=tap0,script=no -initrd rootfs.ext2 -S -s
在另一个终端中打开gdb,输入以下命令:
到此就可以开始调试了。qemu 调试环境到此就搭建完成。
下面再看一下如何使用kgdb的环境。
kgdb 环境
用下面命令启动系统:
$ qemu-system-x86_64 -kernel kernels/ubuntu/linux-4.4.0/arch/i386/boot/bzImage -net nic,model=rtl8139 -net tap,ifname=tap0,script=no -initrd rootfs.ext2 -serial "stdio" -serial "pty" --append '$console kgdbwait kgdboc=ttyS1'
qemu 系统停止在如图位置:
此时注意终端上的pty设备,这将在gdb中用到:
现在另外开一个终端输入以下命令:
qemu 中的系统将正常启动。要触发调试,可以输入命令:
$ echo g > /proc/sysrq-trigger
如图所示:
自此可以开始调试了。
Happy debugging !