黑帽联盟

标题: 基于xen和busybox创建虚拟机 [打印本页]

作者: admin    时间: 2019-11-8 16:07
标题: 基于xen和busybox创建虚拟机
相关链接:xen虚拟化部署centos6.7系统

xen的简介

Xen是一个开放源代码虚拟机监视器,由剑桥大学开发。它打算在单个计算机上运行多达128个有完全功能的操作系统。

在旧(无虚拟硬件)的处理器上执行Xen,操作系统必须进行显式地修改(“移植”)以在Xen上运行(但是提供对用户应用的兼容性)。这使得Xen无需特殊硬件支持,就能达到高性能的虚拟化。


Xen的架构如图:

105ZT2W-0.jpg


Xen虚拟机的组成:

Xen Hypervisor:

虚拟化技术通过在现有平台(机器)上添加一层薄的虚拟机监控程序(Virtual Machine Monitor,简称 VMM)软件而实现对系统的虚拟化,如虚拟处理器,虚拟内存管理器(MMU)和虚拟 I/O 系统等。虚拟机监控程序又被称之为监管程序(Hypervisor)。


Domain(Dom0,DomU):

特权虚拟机:Dom0;特权域

为Xen提供控制工具的;直接驱动IO硬件设备;

与DomU交互;

Linux-2.6.37内核开始直接运行在Dom0上;

其他普通虚拟机:DomU;非特权域

Linux-2.6.24+内核开始支持


Xen的虚拟化实现方式:

Type-I型:二级虚拟化技术;直接在硬件上安装hypervisor,直接接管硬件资源,运行在其上的系统都是虚拟机;

管理方面更彻底;必须让hypervisor驱动硬件,


出现的问题是必须开发驱动程序?

解决方案:Xen只是驱动CPU和内存,不驱动IO设备

当系统启动时,硬件设备加载后加载hypervisor,hypervisor拥有访问硬件权限,hypervisor加载完成后启动一个虚拟机,虚拟机有自己的内核和用户空间,这个虚拟机是 特权虚拟机,为底层hypervisor提供管理程序,能功能是为hypervisor提供IO设备硬件驱动 程序的;

我们新建的虚拟机调用IO设备硬件时,是通过特权虚拟机驱动程序连接硬件实现;


xen虚拟化实现在CentOS 6.7上安装所需要的条件:

1).需要在物理机上安装CentOS 6.7操作系统

2).安装Xen软件包

3).安装4.9.188的内核,可以使Xen运行在Dom0上

4).配置好grub,然后启动Xen

5).在用户空间上安装虚拟机Guest OS即可;

注意:最新版本的xen在CentOS 6.7平台上是只有DomU可以使用,Dom0是不能通过CentOS 6.6的原有内核实现,我这里是安装的xen-4.2.5版本的xen,还有将内核版本更新到了4.9.188;


简单介绍一些XEN和KVM:  

Xen:CentOS4-CentOS5是支持的;后续就是xen了,但是在内核版本Linux 2.6.37将xen收录进内核,CentOS7收录进内核;可以实现内核直接运行在Dom0上;

KVM:2006才出现;CentOS5.8开始支持;但是不稳定,红帽的收购造成了KVM的发展;

CentOS6.6的内核为2.6.32,不直接支持内核运行Xen的Dom0特权域;

可以支持直接运行在DomU

红帽为了支持KVM这个亲儿子的发展,将xen给赶出家门了。 -_-!

后来意识到XEN的使用率还是很高,所以又在后来收录进内核。



以上5个步骤参考最上面的相关链接部署


xen虚拟机的安装和配置

上面安装好Dom0D虚拟机后,下面我们就可以在其之上配置安装DomU虚拟机了。


DomU虚拟机的安装问题思考:

1).DomU虚拟机的内核文件存放位置。

我们是在Dom0上构建DomU虚拟机,所以我们的内核文件存放在Dom0上;

第二种方式就是我们将内核文件存放在DomU虚拟机的虚拟磁盘中;


2).DomU虚拟机的创建:

内核kernel,ramdisk都由Dom0提供,而DomU只提供用户空间;

由于Dom0虚拟机有完整的用户空间,我们可以将其复制进DomU虚拟机上使用;

1.简单DomU虚拟机构建

内核kernel和ramdisk都由Dom0提供,使用busybox为DomU虚拟机提供简单的用户空间;


1).模拟创建虚拟机磁盘设备,构建本地环回文件:

30.png

2).格式化虚拟磁盘设备
31.png

3).编译安装busybox为DomU虚拟机提供用户空间
编译环境需要开发包组支持:

# yum groupinstall -y Development tools  
# yum install -y ncurses-devel glibc-static

获取busybox软件:
wget https://busybox.net/downloads/busybox-1.29.3.tar.bz2

编译配置busybox:
21.png
# make menuconfig

配置如下图所示:

选择“Busybox settings”:


22.png


选择“Build options”选项,以静态二进制创建busybox,不共享库文件:
23.png

配置完成后点击exit,退出后点击yes保存:
32.jpg

执行安装
make

此处会有报错,诸如:
nsenter.c:(.text.nsenter_main+0x1be): undefined reference to `setns'
sync.c:(.text.sync_main+0x74): undefined reference to `syncfs'

重新执行make menuconfig
取消以下几项即可,看截图
24.png

25.png

26.png

27.png

再次执行make操作,成功编译
28.png

最后执行安装
make install

29.png

编译安装busybox完成后在这个目录会生成安装好的文件_install目录,我们将_install目录拷贝到挂载的虚拟磁盘中:
33.png

如果希望busybox这个用户空间能够设置网卡,我们还需要加载xen-netfront.ko进入虚拟机磁盘的指定目录,我们将Dom0中的xen-netfront.ko模块复制进虚拟机磁盘的lib/modules/目录中,并需要查看模块依赖关系,右下图可知,可以发现无依赖关系,我们可以直接使用:
34.png

复制完成后卸载虚拟机磁盘:

# umount /mnt


至此,虚拟磁盘就构建完成了。

4).构建DomU虚拟机
复制虚拟机配置文件并编辑配置文件:

36.png

35.png

启动创建busybox这个虚拟机:
xl create busybox -c

查看虚拟机DomU中的ip地址,发现只存在lo环回设备,我们还未加载xen-netfront模块,我们加入网卡模块
37.png

设置IP地址
38.png

我们来进行ping测试
39.png


至此,一个简单的虚拟机的创建就完成了。


以上我们是用Guest0的vmlinuz和initramfs文件,这里我们也可以把文件放入到DomU的虚拟磁盘目录中,即使用DomU自有kernel来运行DomU,操作如下:
首先创建虚拟磁盘文件,以及拷贝xen的配置文件
21.png

首先我们需要对该虚拟磁盘进行分区格式化,分两个区,其中一个分区存放boot和kernel,以及initrd文件,另一个分区存放根文件系统

对虚拟磁盘进行分区,这里我们可以把其关联到本地回环设备上来,用losetup来实现
查看当前空闲的loop设备,使用losetup -f,这里显示的是/dev/loop1

22.png

由于上面我们已经有一个虚拟机busybox了,所以/dev/loop0正在使用当中,可使用losetup -a查看
23.png

开始实现关联本地回环设备
24.png

开始对/dev/loop1进行分区
25.png

查看/dev/loop1磁盘设备下的区分

26.png

我们在/dev/下并没有看到这两个分区设备,我们需执行下面这个步骤,来添加分区到map(/dev/mapper)中
27.png

接着对分区进行格式化
28.png

创建对应的挂载目录,并挂载分区至该目录上
29.png

拷贝kernel和initrd文件至/mnt/boot目录下,并且再安装grub,在/mnt/boot下多出来grub目录

30.png

在/mnt/boot/grub下创建编辑配置文件grub.conf
31.png

之前我们已经编译安装好busybox了,我们直接拷贝相关的根系统文件至/mnt/sysroot目录下,并创建其它相关的根系统文件,还要拷贝网卡设备xen-netfront.ko文件至/mnt/sysroot/lib/modules目录下
32.png

下面我们就可以拆除本地关联回环设备了,首先使用把映射文件删除,用kpartx -d /dev/loop1,再进行拆除,用losetup -d /dev/loop1,拆除之前,我们要卸载
33.png

编辑/etc/xen/busybox2配置文件
35.png

创建虚拟机,却报错,无法创建
36.png

错误原因:在宿主机上使用losetup对loop设备(qcow2格式的)进行关联、分区,格式化等,在GuestU中无法识别此类分区,反之,亦然。


这里我们还是使用raw格式的吧,重新创建虚拟磁盘文件
34.png

剩下的其它操作和上面一样,参考以上操作,诸如:拷贝kernel和initrd等文件,这里我就不重复操作了

修改配置文件里面的虚拟磁盘格式为raw,其它不需要动
37.png

创建启动虚拟机,有报错了
40.png

后来我把/mnt/boot/grub/grub.conf里面的xvda1改为了xvda2,才成功创建,不明白此处为什么xvda1不可以
43.png

针对上面的错误,网上查询给的原因:busybox不支持虚拟终端,需要真实存在的,到这里我也不知道怎么解决了,有知道的,回帖留言哈,万分感谢






欢迎光临 黑帽联盟 (https://bbs.cnblackhat.com/) Powered by Discuz! X2.5