Linux虚拟机Lguest环境搭建及启动
Author:lin_victor
Date: 2012,4,10
Linux kernel compiled: 3.3.1
Operating system env: Ubuntu 11.04
Gcc version: 4.5.2-8ubuntu4
Make version:3.81
Contact me: lin_victor@163.com
Lguest 简介
Linux提供了很多虚拟化方案,包括KVM, Xen, Lguest, User-mode Linux等等,linux 3.0版本及以后的相关虚拟机文档都可以在’/usr/src/`uname -r`/Documentation/virtual/’目录下找到,但是发现3.3.1内核版本的lguest启动器部分换地方了在’/usr/src/`uname -r`/tools/lguest’里面,下面我主要介绍Lguest这款虚拟机,主要是如何在Linux环境下启动Lguest虚拟机。
Lguest属于半虚拟化虚拟机,通俗的说所谓半虚拟化就是指主机对于客户机是非透明的, 客户机与虚拟机相互协作,在一定程度上能够提高虚拟机的运行效率,但缺点则是客户机的内核需要修改才能运行在主机操作系统之上。
Lguest 是由Rusty Russell 为了推出自己的 ’Virtio’ 虚拟化理念而创作的,你可以通过 《virtio: Towards a De-Facto Standard For Virtual I/O Devices》这篇论文找到更多的Virtio理念以及Lguest设计思想,这里不再赘述。
搭建Lguest虚拟机环境
Lguest 虚拟机工作由三部分来完成:主机(host), Lguest 启动器(Launcher),以及客户机(Guest), 关于Lguest的各部分介绍及代码分析有几个链接, 感兴趣的可以看下:
http://blog.chinaunix.net/uid-20704646-id-95907.html
http://hi.baidu.com/from2_6_30_1/blog/item/614fd02b1e9e35325343c18a.html
如何搭建一个Lguest 虚拟机,在 ’/usr/src/`uname -r`/tools/lguest’ (没有找到的定在内核源码包的Documentation/virtual 或者直接在Doumentation下面)目录下有lguest.txt 介绍如何启动一个虚拟机,其中包括以下几步:
重新编译内核
必须重新编译内核增添 ’VIRTIO’功能以及Lguest支持,下面的动作以root权限执行:
-
从http://www.kernel.org/ 下载最新稳定的linux内核版本 ‘3.3.1’
-
将解压缩包放到/usr/src目录下进入开始配置编译选项
#cd linux-3.3.1
-
在编译之前,安装一些必要的编译软件包
#apt-get install kernel-package libncurses5-dev build-essential
-
为了提高编译速度我选择‘make defconfig’ (代价就是一些驱动没有安装导致加载NTF文件系统时失败,需要调一下启动项),当然为了顺利运行,建议你使用‘#make oldconfig’,能省去不少麻烦。在压缩的内核包下执行’make defconfig’生成.config 文件。
#make defconfig
-
执行‘make menuconfig’配置一些选项,使其支持lguest (Note:不要试图直接修改.config 文件,因为有很多依赖)。
#make menuconfig
-
设置如下,保存后退出。
-
------>General setup
-
|------->Prompt for development and/or incomplete code/drivers [*] =Y
(CONFIG_EXPERIMENTAL=Y)
-
------->Processor type and features
|------->Paravirtualized guest support [*] =Y
- ||------->Lguest guest support [*] =Y
|------->High Memory support
||--------->4GB(X)
|------->Alignment value to which kernel should be loaded 填写0x100000
(CONFIG_PARAVIRT=Y, ONFIG_LGUEST_GUEST=Y, ONFIG_HIGHMEM64G=n and CONFIG_PHYSICAL_ALIGN=0x100000)
-
--------->Device drivers
|-------->Block devices
||--------->Virtio block driver (EXPERIMENTAL) [*] =Y
--------> Network device support
|--------->Virtio network driver (EXPERIMENTAL) [*] =Y
--------->University TUN/TAP devie driver support [*] =Y
(CONFIG_VIRTIO_BLK=Y, CONFIG_VIRTIO_NET=y, and CONFIG_TUN=y)
-
--------->Virtualization
|--------->Linux hypervisor example code =Y
(CONFIG_LGUEST=Y)
保存完成后,最好通过查看'.config'文件检查是否配置正确.
-
接下来就依次执行 ’#make’, ‘#make modules’, ‘#make modules_install’,生成压缩的内核镜像vmlinuz-3.3.1.img以及各模块
#make (多核下可以尝试#make -j4来加快编译速度)
#make modules
#make modules_install
-
创建initrd 临时根文件系统,最后面会补充一下关于initrd方面的知识,下一章我会介绍如何用busybox制作一个小巧的根文件系统供Lguest使用。
在’/lib/modules/3.3.1’ 目录下执行 ‘#mkinitramfs –c –k -o /boot/initrd.img-3.3.1’或者执行 ‘#mkinitramfs –o /boot/initrd.img-3.3.1’ 在/boot下就生成了initrd临时根文件系统。
/lib/modules/3.1.1$: #mkinitramfs –c –k -o /boot/initrd.img-3.3.1
or
#mkinitramfs -o /boot/initrd.img-3.3.1
-
执行 ‘#make install’后我们新编译的内核就安装成功了,接下来就‘#reboot’重启测试一下。
#make install
(用#update-grub2 可以刷新下grub列表)
-
注意重启后,当进入grub选择列表后,如果你还有NTFS格式的分区,不要直接‘Enter’,可能是因为’#make defconfig’的关系,NTFS文件系统未正确加载因此不能识别这样的分区,所以需要‘e’编辑3.3.1的启动项参数,将’kernel’ 一行最后面的‘hand_off=7’去掉,然后按 ’Ctr+x启动’,因为不能识别NTFS,所以启动过程中需要‘Shift+S’忽略该错误,然后就进入我们熟悉的Ubuntu界面了。(还是建议使用make oldconfig吧,后来发现除一些基本的根文件系统,貌似只能识别ext3文件系统,)
-
编译lguest启动器,运行测试。
在‘/usr/src/linux-3.3.1/tools/lguest’目录下有lguest启动器源码及Makefile,简单的执行‘#make’生成lguest可执行文件, 我们就是利用它来启动lguest虚拟机。
#make
(#modprobe lg (如果CONFIG_LGUEST选择m))
接下来我们就看一下如何启动lguest虚拟机吧:
在该目录下执行
#./lguest 64m http://www.cnblogs.com/vmlinux --tunnet=192.168.x.x --block=’rootfile’ root=/dev/vda
参数解释:
64m: 虚拟机内存大小
vmlinux: 指定虚拟机使用的内核镜像,我选择使用了3.1.1制作出来的内核镜像。你也可以使用压缩后的内核镜像
--tunnet=192.168.x.x: 这里实际上配置的是我们在Launch 的过程中创建的虚拟 TUN/TAP虚拟网卡设备的IP,在虚拟机内部通过使用该TAP设备与外界通信,设置启动的虚拟机内部的IP与TAP在同一网段
--block= ’rootfile’: 指定使用的根文件系统, 该文件会成为后面的’/dev/vda’
root=/dev/vda: 指定内核启动参数
所以上面命令的含义是:定义虚拟机的内存为64兆, 使用3.3.1的未压缩内核镜像vmlinux,使用指定的根文件系统rootfile,创建tap虚拟网卡设置ip为192.168.x.x,相应的在虚拟机下会有网卡设备,此种方法使用nat方式访问外网,如果你了解虚拟机下的网桥传输机制也可以用—tunnet=bridge:'TAP'通过网桥方式访问外网。
现在我们除了根文件系统,其他的都具备了,你可以从http://fs.devloop.org.uk/官网上去下一些来,我下的Federo能成功启动,当然也可以使用我自己用busybox制作的小巧的根文件系统。
。。。。。。。。。。不知道如何上传自己制作的根文件系统。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
运行一下,看看是否能成功启动lguest虚拟机吧!
posted on 2012-04-11 00:30 lin_victor 阅读(2921) 评论(2) 编辑 收藏 举报