思路是,通过网络(pc的pxe特性)下载grub到虚拟机,然后下载vmlinux(实质是tftp)到虚拟机,可以调试内核. 其中的串口虚拟,主要是打印可以显示到主机的minicom中.
1. 虚拟串口
Go to the settings of your virtual machine, then at the "Serial Ports" and enable "Port 1". Use port number COM1, port mode ''Host Pipe'', check ''Create Pipe'' and enter a path, e.g. /home/qianjiang/temp/test/myserial
2. 验证串口
主机端运行minicom,端口设置为
unix#/home/qianjiang/temp/test/myserial
虚拟机端可以,
stty ispeed 115200 ospeed 115200 -F /dev/ttyS0
echo ok > /dev/ttyS0
这时主机端的minicom将显示"ok".
如果cat /dev/ttyS0, 那么minicom端的输入将显示到虚拟机中
3. 设置内核的输出信息端口
vi /boot/grub/grub.cfg
增加:console=ttyS0,115200 loglevel=7 earlyprintk=ttyS0,115200
内核参数参考: Documentation/kernel-parameters.txt
这样重启虚拟机,可以在minicom中看到内核打印信息
4. grub
参考GNU GRUB Manual: http://www.gnu.org/software/grub/manual/grub.html
第一件事是修改grub配置,以便进入grub menu和命令行:
方法是修改/etc/default/grub如下,然后运行update-grub.
GRUB_CMDLINE_LINUX_DEFAULT="splash console=ttyS0,115200 loglevel=7 earlyprintk=ttyS0,115200"
GRUB_HIDDEN_TIMEOUT_QUIET=false
5. 下面要解决的事情是,网络装载.
观察到virtualbox支持PXE, 即网络启动.但是调试NAT PXE Boot花了很长时间也没搞定.
采用本地主机(Ubuntu)架设tftp服务器,然后通过命令修改PXE访问的tftp服务器.
VBoxManage modifyvm "kernel-debug" --nattftpserver1 192.168.1.106
VBoxManage modifyvm "kernel-debug" --nattftpfile1 vmname.pxe
上面的命令实际上是通知vb内置的dhcp服务器,设置pxe需要访问的tftp服务器和文件.
这样在tftpboot下面放置vmname.pxe就能启动了.
6. 启动映像(grub pxe)
参考http://www.gnu.org/software/grub/manual/grub.html#Network
. 生成grub pxe需要的启动映像到tftpboot目录
grub-mknetdir --net-directory=/home/qianjiang/tftpboot/
. 初始启动映像的设置
VBoxManage modifyvm "kernel-debug" --nattftpfile1 /boot/grub/i386-pc/core.0
按理这样设完后,就可以启动了,但是一直提示找不到文件,直接进入grub rescue>
怀疑是tftp服务器的问题,参考了一个网页.
运行sudo apt-get install tftpd-hpa,解决了这个问题
note: tftp可以查看/var/log/syslog; grub可以用insmod和echo等命令
把vmlinuz,initrd.img拷贝到tftpboot/boot下面
然后在grub命令行里可以执行:
#linux /boot/vmlinuz
#initrd /boot/initrd.img
注意,要用正确的映像,可以从安装的包里面获得.
好了,到现在,就可以通过虚拟机来调试内核了...........
如果想用串口,就贯通起来即可
附. socat(Socket Cat)
socat -d -d /home/qianjiang/temp/test/myserial pty
命令行的意思是,把myserial的数据导给pty
---------------------------------------
2011/07/05 14:48:38 socat[22421] N opening connection to AF=1 "/home/qianjiang/temp/test/myserial"
2011/07/05 14:48:38 socat[22421] N successfully connected from local address AF=1 "d\xA7b\xAE\xDE\xAE\x18\xD9~\xA7a\xAE\xDE\xAEK\xC5\x06\bb\xAE\xDE\xAE"
2011/07/05 14:48:38 socat[22421] N successfully connected via
2011/07/05 14:48:38 socat[22421] N PTY is /dev/pts/4
2011/07/05 14:48:38 socat[22421] N starting data transfer loop with FDs [3,3] and [4,4]
---------------------------------------
,数据导向pty后,可以看出是/dev/pts/4,这时也可以通过minicom打开/dev/pts/4和虚拟机的串口进行交互.
这个在后面提到的使用kgdb有用.
|