Linux虚拟机Lguest环境搭建及启动

Authorlin_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权限执行:

  1. http://www.kernel.org/ 下载最新稳定的linux内核版本 ‘3.3.1’

  2. 将解压缩包放到/usr/src目录下进入开始配置编译选项

    #cd linux-3.3.1

  3. 在编译之前,安装一些必要的编译软件包

#apt-get install kernel-package libncurses5-dev build-essential

  1. 为了提高编译速度我选择‘make defconfig’ (代价就是一些驱动没有安装导致加载NTF文件系统时失败,需要调一下启动项),当然为了顺利运行,建议你使用‘#make oldconfig’,能省去不少麻烦。在压缩的内核包下执行’make defconfig’生成.config 文件。

#make defconfig

  1. 执行‘make menuconfig’配置一些选项,使其支持lguest Note:不要试图直接修改.config 文件,因为有很多依赖)。

#make menuconfig

  1. 设置如下,保存后退出。

    1. ------>General setup

|------->Prompt for development and/or incomplete code/drivers [*] =Y

(CONFIG_EXPERIMENTAL=Y)

    1. ------->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

    1. --------->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)

    1. --------->Virtualization

|--------->Linux hypervisor example code =Y

(CONFIG_LGUEST=Y)

保存完成后,最好通过查看'.config'文件检查是否配置正确.

  1. 接下来就依次执行 ’#make’, ‘#make modules’, ‘#make modules_install’,生成压缩的内核镜像vmlinuz-3.3.1.img以及各模块

#make    (多核下可以尝试#make -j4来加快编译速度)

#make modules

#make modules_install

  1. 创建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

  1. 执行 ‘#make install’后我们新编译的内核就安装成功了,接下来就‘#reboot’重启测试一下。

#make install

(用#update-grub2 可以刷新下grub列表)

 

      1. 注意重启后,当进入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设备与外界通信,设置启动的虚拟机内部的IPTAP在同一网段

  --block= ’rootfile’: 指定使用的根文件系统, 该文件会成为后面的’/dev/vda’

root=/dev/vda: 指定内核启动参数

所以上面命令的含义是:定义虚拟机的内存为64, 使用3.3.1的未压缩内核镜像vmlinux,使用指定的根文件系统rootfile,创建tap虚拟网卡设置ip192.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编辑  收藏  举报

导航