經過虛擬機調試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
            <TFTP boot-file="/boot/grub/i386-pc/core.0" next-server="192.168.1.101"/>html

還有的是,單機調試,網絡要打開。
 linux


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

 服務器

相關文章
相關標籤/搜索