定制 ovirt-node 来运行虚拟设备



ovirt-node 提供了基于 KVM 的 Hypervisor 功能,同时 ovirt-node 提供了很多定制化接口。我们将 ovirt-node 作为运行设备(Appliance)的载体,使得用户只看到设备的虚拟机,而 ovirt-node 作为宿主机(Host)将被完全隐藏。本文将详细介绍如何将一个设备(Appliance)部署到 ovirt-node 上,并实现隐藏 ovirt-node 宿主主机的过程。

乔 立勇, 软件工程师, IBM

乔立勇,软件工程师,目前在 IBM 中国系统与科技研发中心从事开源项目 KVM,以及 rhevh-blue 项目的研发工作。



金 运通, 高级软件工程师, IBM

金运通,软件工程师,目前在 IBM 中国系统与科技研发中心从事开源项目 KVM,以及 rhevh-blue 项目的研发工作。



2013 年 6 月 17 日


可行性分析

由于软件的使用和配置的复杂性不断提高,这给广大软件用户带来了很糟糕的用户体验,比如说安装、配置以及后期维护,都需要经过软件提供商的培训,不但浪费了很多人力物力,而且也带来更高的运行和维护成本。同时,为了软件之间的兼容性、可维护行和扩展性,用户也更倾向于购买一整套的成熟的软件套件。所以软件供应商都在不断寻求新的软件发布方法,帮助用户获得更好的体验。

虚拟化技术的出现,为软件供应商提供了一种全新的软件发布方法,就是使用设备(Appliance)技术。我们这里所提到的设备(Appliance)是一种将硬件资源和软件集成到一起的技术,用户只要一按开关,就会自动化完成硬件以及软件套件的安装,并对其进行正确的配置。本文中将要讨论的整个设备系统主要包含一个虚拟机镜像、提供虚拟化技术的管理软件(Hypervisor)以及硬件资源:

  • 虚拟机镜像:该镜像包含一个预先安装好的操作系统,该操作系统上已经安装和配置好的一系列需要发布的软件(虚拟机镜像的生成需要利用到虚拟化技术,首先创建一个虚机,并在其上安装操作系统和软件,并进行配置等,然后将该虚拟机的镜像文件保存)。
  • 管理软件:严格意义上说是一个操作系统,该系统提供虚拟化功能,虚拟化镜像运行在这个操作系统上。
  • 硬件:可供用户访问的一切硬件资源,包括 CPU、内存、磁盘和网络 I/O 等,除一小部分用于管理软件运行的内存外,该硬件资源可被虚拟机直接获得。

ovirt-node 可以安装在任何支持 KVM 虚拟化技术的 x86 平台的硬件上,它所提供的虚拟化技术可以虚拟任何 KVM 支持的硬件环境,这样便屏蔽了应用操作系统对硬件的要求。

在 ovirt-node 中,使用了 KVM(内核虚拟化)模块和 libvirt 管理软件创建和管理 Guest 虚拟机,该虚拟机应满足镜像所需要的硬件特性,ovirt-node 提供了方便的定制化接口。ovirt-node 包含 VNC 组件,提供访问虚拟机界面的接口。

图 1.设备系统结构图。
图 1 所示为设备系统结构图。

图中所示 Hypervisor 为管理软件层,它为 ovirt-node 操作系统,该层对用户透明。从用户角度只能看到预安装在特定系统上的软件。


设备(Appliance)的实现

要实现一个 Appliance,系统应满足以下几点要求:

开机隐藏 host 界面

用户一开机就希望看到的是真正的操作系统而不是希望看见运行在后端的操作系统(Hypervisor)。

ovirt-node 提供一种完全自动化的安装方式。在此方式中,将安装过程中需要的参数放置在启动参数中,同时,安装过程为命令行形式,当安装完成后,ovirt-node 可以直接启动虚拟机,通过 VNC 方式连接访问虚拟机界面,直接转入 GUEST 虚拟机的界面。

网络特殊设置

主机(HOST)对用户是透明的,因此需要对网络进行特殊的配置。

  1. 使用 libvirt 在 HOST 创建一个桥接网络 (breth0),将创建的客户机的网卡(vnet0)绑定在此桥接网络上;另一端将网卡(eth0)绑定到该 bridge(breth0)使客户机获得一个外网地址。主机对外不设置 IP,即无法从外网直接访问 HOST。
    图 2.网络结构
    图 2.网络结构
  2. HOST 与 GUEST 虚拟机之间的通信是通过创建一个 bridge net(可以使用 libvirt 自动创建的 virbr0)实现的。在 HOST 端和 GUEST 端(mgm0) 各自分配一个同网段的 IP,这样可以实现 HOST 和 GUEST 之间的相互访问。

安置看门狗(watchdog)

安放 watchdog 的作用也是为了实现主机(HOST)对用户透明,当关闭 / 重启 GUEST,或者 GUEST 宕机(crash)时,HOST 也应该一并关机 / 重启。

在主机(HOST)中安放一个看门狗守护进程,该守护进程用于监控 GUEST 的状态,如:关机、重启、崩溃等,根据监控的结果,在 HOST 执行预设的操作。

在 watchdog 中可注册的 libvirt 的事件有:

 VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN 	 	 : Normal shutdown 
 VIR_DOMAIN_EVENT_STOPPED_DESTROYED 	 	 : Forced poweroff from host 
 VIR_DOMAIN_EVENT_STOPPED_CRASHED  : Guest crashed 
 VIR_DOMAIN_EVENT_STOPPED_MIGRATED 	 	 : Migrated off to another host 
 VIR_DOMAIN_EVENT_STOPPED_SAVED   : Saved to a state file 
 VIR_DOMAIN_EVENT_STOPPED_FAILED   : Host emulator/mgmt failed 
 VIR_DOMAIN_EVENT_STOPPED_FROM_SNAPSHOT 	 	 : offline snapshot loaded

watchdog 捕获到 libvit 的事件(event)后会自动调用其注册事件对应的回调函数,在该回调函数中添加相应的处理动作,该部分功能需要使用 libvrt 提供的接口库进行开发。

另外,HOST 除了需要实现以上功能外,还要对插入到 HOST 的 USB 设备、光盘等实现 pass-though 的功能,即实现当向 HOST 上插入 USB 设备以及光盘的时候,需要将该设备反映到虚拟机 GUEST 上,就好像在 GUEST 上插入了设备一样。

要实现该功能,我们需要自定义 udev 规则,同时自定义当满足该规则时的执行的脚本。

 udev-rules:
 SUBSYSTEM=="block",ENV{ID_BUS}=="usb", \
 RUN+="/usr/libexec/usb_storage_passthrough/process_usb_storage_event"

在 process_usb_storage_event 脚本中:

创建一个该设备的 xml 配置文件:create_xml_file

 virsh attach-device $GUEST_DOMAIN $DEVICE_XML_FILE

安全控制

为安全起见,一般情况下不提供宿主机和主机的通讯接口。可以通过对 ovirt-node 做配置的桥接网络(virbr0)连接,从 GUEST 直接登陆到 HOST 中。


ovirt-node 的定制过程

ovirt-node 提供了很方便的定制化接口和工具包,方便用户打造自己的 node 系统。接下来分别从 oivrt-node 提供的定制化接口和工具方面,结合本文中提出的设备 Appliance,阐述如何将 ovirt-node 定制为一个可运行的系统。

定制化接口

首先,ovirt-node 提供了一些 定制化接口,分别放置在以下目录中:

/etc/ovirt-early.d/

在该目录下放置前缀为“pre-”和前缀为“post-”的用户自定义脚本,其调用顺序如下:

pre-xxx:

pre-xxx 是会在 ovirt-early 脚本开始读取 bootparams 之后执行的脚本,所有在该目录下前缀为“pre-”配置的脚本会依次被执行。

* 可在此处增加系统升级脚本,包括升级 HOST 和 Guest 主机。

post-xxx

当 ovirt-node 完成系统启动后,调用 post-xxx 系列脚本:

  1. 在此目录下增加虚拟机配置文件,如 vm.xml。该配置文件可预先编辑好,打包到 ovirt-node 的安装包中,也可以编写程序,根据当前硬件系统的资源情况生成对应的 XML 文件,使虚拟机获得尽可能多的资源。
  2. 增加配置虚拟机所需要网络。

/etc/ovirt-config.d/

在该目录下的脚本会在 ovirt-node 安装完成后,进行 root 分区配置时被执行,该目录下脚本只被执行一次,以后每次启动不执行该目录下的脚本。

persist/unpersist

ovirt-node 是无状态的,所以,任何在系统"/"分区的修改重启后都会丢失,所以,使用 persist 脚本对要修改的文件进行持久化操作。

定制化过程

可以选择以下两种定制方法:

  1. 直接在安装完成后的系统上进行更改,因为 ovirt-node 是以 mount-bind 方式将镜像文件挂在到“/”目录,所以所做的修改需要执行 persist 操作,否则修改在系统重启后丢失。
  2. 将需要增加的 hook 脚本等打包成 RPM,使用 ovirt-node 提供的 edit-node 工具对 ovirt-node 进行编辑,使用 live-cd 方式,将 RPM 包传输到 ovirt-node 中。

定制完 ovirt-node 后,首次安装流程如下:

  • 安装介质为光盘,第一张光盘为经过定制处理的 ovirt-node 系统,第二张保存虚拟机镜像文件。
  • 系统载入 initrd 后,启动 ovirt-early service 处理 bootparameter
  • 执行 ovirt-early.d/pre-xxx 脚本(处理系统 upgrade操作等)
  • Ovirt-early service 根据 bootparameter 配置的参数对系统进行相应的配置
  • 执行 ovirt-early.d/post-xxx 脚本,脚本负责定制网络,创建虚拟机的 xml 文件,并将该虚拟机配置为自动启动。
  • 执行 ovirt-config-boot.d/目录下的脚本,该目录下的脚本负责拷贝虚拟机镜像,手动插入第二张保存有虚拟机镜像的光盘,拷贝虚拟机镜像到指定位置 , 例如 /data/images
  • 完成系统的安装后重启系统
  • 系统重启后,libvirtd service 根据 XML 创建并启动虚拟机,同时启动 gtk-vnc,进入客户机界面。

小结

本文介绍了一种新的软件发布方式,即在一个 Appliance 中安装一个虚拟机,将待发布的软件安装到该虚拟机上,并进行配置。本文使用 ovirt-node 定制化一个用于运行 GUEST 设备的过程。

参考资料

学习

  • 参考 http://www.ovirt.org/wiki/Node:关于 ovirt-node 开源社区的详细介绍。
  • 参考 http://libvirt.org/html/libvirt-libvirt.html 中 libvirt 支持的可注册的事件。
  • 参考 《开源社区 ovirt-node 介绍》:ovirt-node 是开源社区 oVirt 的一个开源项目,它是基于 KVM 和 Linux 技术的一套最小化的 Linux 系统,它只提供最基本的操作系统功能以及虚拟机管理等。本文首先从功能和结构上介绍了 ovirt-node,然后介绍了 ovirt-node 的获得、安装,定制化等方面。
  • oVirt 中的存储管理:oVirt(open Virtualization)是一个基于 KVM 的开源 IaaS 项目。本文将介绍 oVirt 的重点:存储器的管理,讲解它是如何组织与分配各种存储器,以及用户应该如何通过各种方式(命令或者 API)对它进行使用。
  • developerWorks Linux 专区寻找为 Linux 开发人员(包括 Linux 新手入门)准备的更多参考资料。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值