以前一直使用windows下的vmware进行项目的实验和开发,现在彻底把windows格了,硬盘上装上linux,项目开发的虚拟机也转为virtualbox了,从虚拟机的安装到配置,学到了不少东西(主要是因为出现了诸多错误!汗……),然后安装redhat9.0,在此基础上对2.6.16的内核进行修改和开发,然后重新编译内核,但是内核调试却成了这个时候的瓶颈,在vmware下简单的配置在virtualbox下变得不知所措。经过查阅资料和自己探索,终于成功了,现将遇到的问题总结如下:
1、虚拟机克隆──虽然比较喜欢开源的东西,但是在这个功能上,毋庸置疑的vmware做得更好一些,也更加智能,只需要按键就可以实现。而virtualbox需要命令实现:
VBoxManage clonevdi 原始VDI文件名 新的VDI文件名
在这里,原始的VDI新的VDI文件都要写全路径,就因为这个失误导致的错误致使我调试了两天,晕……
2、为了节省硬盘空间,一般都使用动态扩展映像。它不会在一开始就占用指定大小的硬盘空间,而是随着实际使用的需要动态扩展。但是在虚拟系统里删除了文件,使用过的空间并不会自动收回。虚拟系统使用久了以后,磁盘映像文件会变得越来越大。
我以前使用过VMware,在VMware
Tools里有一个很方便的Shrink功能可以收回未使用的硬盘空间,但是在VirtualBox里没有看到这样的选项。也要通过命令来实现:
需要三个步骤:
第一步:在Guest
OS中整理磁盘碎片。可以使用Windows自带的碎片整理工具,不过更推荐使用Defraggler。这是一款免费的磁盘碎片整理工具,使用简单,整理速度很快。
Defraggler下载地址:
第二步:将Guest
OS的磁盘剩余空间清零,也就是把0值写入磁盘未使用空间的每一个字节。这一步是关键,因为在下一步里,所有只包含0值的磁盘空间将被收回。可以用
Sysinternals出品的一个命令行工具SDelete来完成这一步。在Guest OS的命令行里执行:
sdelete -c c:\
其中c:\是要清零的磁盘分区,应依次对所有虚拟磁盘分区执行这一步,如d:\、e:\等等。
SDelete下载地址:
第三步:使用VirtualBox提供的VBoxManage工具收缩磁盘映像文件。在Host
OS的命令行中进入VirtualBox的安装目录(缺省为C:\Program Files\Sun\xVM VirtualBox),执行:
VBoxManage modifyvdi "Windows
XP.vdi" compact
3、
虚拟机和虚拟机之间的串口通信
两台虚拟机间的通信也可以通过利用主机的命名管道来完成。原理可以简单的这样描述:一台虚拟机在主机中创建的命名管道并其串口相连,另外一台虚拟机也将自
己的串口连到主机的命名管道上,这样两个虚拟机的串口就能连起来了。这里两台虚拟机都使用各自的COM1端口,主机的命名管道为同一管道/tmp
/vbox,在配置时一台创建通道,另一台不创建。启动时先启动创建通道的虚拟机,然后启动另一台虚拟机,分别
打开两台虚拟机的终端,通过如下命令将各自的COM1口的输入输出波特率都设为115200
stty ispeed 115200 ospeed 115200 -F /dev/ttyS0
测试过程:
在其中一台虚拟机A终端上执行
cat /dev/ttyS0
在另一台虚拟机B上执行
echo ok > /dev/ttyS0
这时虚拟机A的终端会接受到B发来的ok消息。
这里要补充说明一下的是,这里两台虚拟机都将自身的com 1口连到主机的一个命名管道/tmp/vbox,两者的com
1口就连接到一起了,另外,两台虚拟机有且只有一台能够选择创建通道,并且只能是创建通道的一方先启动,因此推荐让开发机创建通道而目标机只使用/tmp
/vbox命名通道,这样每次目标机重启调试时,开发机不用重启。
4、配置目标机的启动项。在目标机里修改grub.conf
在启动项后添加 kgdboc=ttyS0,115200 kgdbwait
5、先启动开发机。然后启动目标机,开机时按Esc建选择有kgdb的内核启动,等待一下后启动过程会暂停并提示等待远程gdb调试,这时切换到开发机并进入到源码目录下,运行
gdb ./vmlinux,gdb启动后,在gdb中设置波特率和调试终端
(gdb)set remotebaud 115200
(gdb)target remote /dev/ttyS0game over
阅读(2454) | 评论(0) | 转发(0) |