linux虚拟机内核调试,通过虚拟机调试linux 内核

思路是,通过网络(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就能启动了。

-----------------------------------------------------------------------------------------------------------

后面改成这样,就是安装grup到tftp下面,把PXE下载的文件来自于grub/i386-pc/core.0

qianjiang@qianjiang-pc:~$ grep core VirtualBox\ VMs/kernel-debug/kernel-debug.vbox

还有的是,单机调试,网络要打开。

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有用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值