简单的 Linux 和 Xen 虚拟设备

作者:Matthew Hoskins

每个人都以某种形式熟悉硬件设备。它可以是家中的无线接入点,也可以是数据中心的 DNS 服务器设备。设备提供预构建的软件解决方案(包括硬件),可以快速部署,几乎没有麻烦。当您将“设备”概念与虚拟化结合时,您将得到虚拟设备——一个预构建的软件解决方案,可以在您自己的硬件上运行,只需最少的工作。

在本文中,我将通过组装现成的组件,为您提供构建简单虚拟设备的实践介绍。该框架可用于构建各种设备。

什么是虚拟设备?

虚拟设备与其硬件同类产品有许多共同属性。一般来说,两种类型的设备都具有占用空间小、使用嵌入式或“精简”操作系统、用途单一、易于备份和恢复以及可通过 Web 管理的特点。最重要的是,它们开箱即用,只需最少的配置。虚拟设备还具有额外的优势,即可以托管在您自己的硬件上,因此您可以在单个物理主机上托管多个虚拟设备。

许多基于 Linux 的虚拟设备都使用极其精简的操作系统构建。这可能会使安装常用软件因依赖关系而变得复杂,尤其是对于初学者而言。对于本示例,我决定使用现成的免费发行版,特别是 CentOS,因为它使用了大多数人习惯使用的工具。但是,我们将尽可能精简它。

收集组件

我们将使用 Xen 虚拟机监控程序构建我们的虚拟设备,因为它免费且如今大多数 Linux 发行版都附带它。在我的示例中,主机和设备都使用 CentOS 5.3。主机需要在安装期间选择“虚拟化”选项,或者您可以通过安装 xen 和 kernel-xen 软件包来改装现有的 Linux 系统。我选择 Xen 是因为它很简单;或者,您可以使用 VMware、KVM 或任何其他虚拟机监控程序。

如果您的网络连接良好,您可以直接从互联网安装 CentOS,或者将其下载到本地 Web 或 NFS 服务器。在本示例中,我指向 mirror.centos.org 作为安装源,并指向本地 NFS 服务器作为 kickstart 配置文件。

我们将使用 Webmin 软件包为我们的设备提供基于 Web 的管理。Webmin 已经存在很长时间了,它将为我们的设备提供许多功能,例如完整的基于 Web 的管理和简单的备份/恢复。我从 www.webmin.com 下载了 webmin-1.480-1 RPM 用于我们的设备。其他一切都将由标准 CentOS 软件包提供。

安装 CentOS

为了为我们的设备创建最小化的 CentOS 安装,我们将使用带有 --nobase 选项集的自定义 kickstart。良好系统管理最重要的概念之一是可重复性——完全自动化的 kickstart 安装是可重复且自我记录的。我们的整个操作系统安装将非常舒适地容纳在 2GB 虚拟磁盘和 256MB 内存中。我们正在 /xen 下创建我们的设备,这是 Xen 虚拟机(也称为客户机)的标准位置。如果您选择其他位置,请确保禁用 SELinux 或调整您的设置。无论您将 Xen 放在哪里,磁盘映像都需要设置 system_u:object_r:xen_image_t 上下文。

首先,让我们创建一个“appliance-base”客户机,它将用作模板。此客户机的所有文件都将存储在 /xen/appliance-base/ 中。首先以 root 身份登录到 Xen 主机并创建虚拟磁盘。然后,从安装介质中获取 Xen vmlinuz 和 initrd 文件

xenhost$ mkdir -p /xen/appliance-base
xenhost$ cd /xen/appliance-base
xenhost$ dd if=/dev/zero of=appliance-base.img \
            oflag=direct bs=1M seek=2048 count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.071271 seconds, 14.7 MB/s
xenhost$ cd /xen
xenhost$ wget \
  http://mirror.centos.org/centos/5.3/os/i386/images/xen/initrd.img
xenhost$ wget \
  http://mirror.centos.org/centos/5.3/os/i386/images/xen/vmlinuz

您刚刚为您的设备创建了一个 2GB 虚拟磁盘。现在,创建 appliance-base.install.cfg 文件和 ks.cfg 文件,如列表 1 和列表 2 所示。请务必替换您的 CentOS URL 或互联网上的镜像。.cfg 文件中 MAC 地址的最后三个字节是编造的;只需确保您的所有 Xen 客户机都是唯一的。

列表 1. 用于安装的 Xen 配置:appliance-base.install.cfg

# Xen Configuration for INSTALL of appliance-base
kernel  = "/xen/vmlinuz"
ramdisk = "/xen/initrd.img"
extra   = "text ks=nfs:192.168.200.10:/home/matt/ks.cfg"
name    = "appliance-base"
memory  = "256"
disk    = ['tap:aio:/xen/appliance-base/appliance-base.img,xvda,w',]
vif     = ['bridge=xenbr0,mac=00:16:3e:00:00:01',]
vcpus   = 1

on_reboot = 'destroy'
on_crash  = 'destroy'

列表 2. Kickstart 配置:ks.cfg

# Kickstart Configuration for MINIMAL CENTOS
install
text
reboot

url --url http://mirror.centos.org/centos/5.3/os/i386/
lang en_US.UTF-8
langsupport --default=en_US.UTF-8 en_US.UTF-8
keyboard us

skipx
network --device eth0 --bootproto dhcp

# The password is "password"
rootpw --iscrypted $1$h5ebo1pm$OHL3De9oalNzqIG1BUyJp0
firewall --disabled
selinux --permissive
authconfig --enableshadow --enablemd5
timezone America/New_York

bootloader --location=mbr
clearpart --all --initlabel
part /boot --fstype ext3 --size=100
part pv.2 --size=0 --grow
volgroup VolGroup00 --pesize=32768 pv.2
logvol /    --fstype ext3 --name=LogVol00 \
            --vgname=VolGroup00 --size=1024 --grow
logvol swap --fstype swap --name=LogVol01 \
            --vgname=VolGroup00 --size=256
%packages --nobase
coreutils
yum
rpm
e2fsprogs
lvm2
grub
sysstat
ntp
openssh-server
openssh-clients
%post

现在,您所要做的就是启动 Xen 客户机并观看设备的操作系统安装。安装将完全自动化;只需执行以下命令并坐下来

xenhost$ xm create -c /xen/appliance-base/appliance-base.install.cfg

安装完成后,它将关闭 Xen 客户机并返回到 shell 提示符。接下来,仍然在同一目录中,创建 appliance-base.cfg,如列表 3 所示,它将用于在正常模式下运行设备。

列表 3. Xen 配置:appliance-base.cfg

# Xen Configuration for appliance-base
name   = "appliance-base"
memory = "256"
disk   = ['tap:aio:/xen/appliance-base/appliance-base.img,xvda,w',]
vif    = ['bridge=xenbr0,mac=00:16:3e:00:00:01',]
vcpus  = 1

bootloader ="/usr/bin/pygrub"
on_reboot  = 'restart'
on_crash   = 'restart'

再次使用新配置启动 Xen 客户机

xenhost$ xm create -c /xen/appliance-base/appliance-base.cfg

现在,您已准备好开始安装服务。

安装 Web 管理

让我们让这个客户机准备好成为一个设备。当客户机完全启动后,以 root 身份登录。密码是“password”(这在某种程度上是虚拟设备的默认标准)。执行以下命令以完全更新;然后,安装 Webmin 及其所有依赖项

appliance-base# wm=http://sourceforge.net/projects/webadmin/files
appliance-base# yum -y update
appliance-base# yum -y install perl wget
appliance-base# wget $wm/webmin/webmin-1.480-1.noarch.rpm/download
appliance-base# rpm -Uvh webmin-1.480-1.noarch.rpm
appliance-base# chkconfig webmin on

最后,将以下代码段添加到 /etc/rc.local 文件的底部

appliance-base# echo "" >> /dev/console
appliance-base# echo "" >> /dev/console
appliance-base# echo "Connect to WEBMIN at: http://$(ifconfig eth0 |
                         grep 'inet addr:' |
                         awk '{ print $2; }' |
                         cut -d: -f2):10000/" >> /dev/console
appliance-base# echo "" >> /dev/console
appliance-base# echo "" >> /dev/console

这将输出 eth0 的当前 IP 地址,以告知用户如何首次连接到 Webmin。当然,这假设设备在 DHCP 网络上启动。通常,虚拟设备最初通过 DHCP 启动,然后通过 Web 配置为静态地址。

自定义和安装服务

此时,我们有一个通用的虚拟设备,可以进行自定义。要创建一个 MySQL 服务器设备,请运行yum install mysql-server。要创建一个 DNS 设备,请运行yum install bind bind-utils。要创建一个 LAMP 设备,请运行yum install httpd php mysql-server。重新启动,或单击 Webmin 内的“刷新模块”,您将看到您安装的任何内容的 Web 管理界面。Webmin 开箱即用地支持非常广泛的软件,甚至可以通过 Webmin 网站上提供的扩展模块支持更多软件。

对于我们的示例,让我们制作一个简单的 MySQL 数据库服务器设备。要自定义您的基本设备,请在 VM 中运行以下命令

appliance-base# yum -y install mysql-server
appliance-base# /etc/init.d/mysqld start
Initializing MySQL database:  Installing MySQL system tables...
OK
appliance-base# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorization.

Set root password? [Y/n] Y
New password: password
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] n
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

All done! If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!
打包和部署设备

接下来,让我们打包设备,然后进行将其部署为 mysql.example.com 的步骤。要打包设备,只需将磁盘映像和配置 tar 打包

xenhost$ cd /xen/appliance-base
xenhost$ tar -cvzf appliance-base.img appliance-base.cfg
xenhost$ mkdir /xen/mysql.example.com
xenhost$ cd /xen/mysql.example.com
xenhost$ tar -xvzf /xen/appliance-base.tar.gz
xenhost$ mv appliance-base.cfg /etc/xen/auto/mysql.example.com.cfg
xenhost$ vim /etc/xen/auto/mysql.example.com.cfg

编辑 Xen 配置文件 /etc/xen/auto/mysql.example.com.cfg,如列表 4 所示。设置名称、磁盘映像的路径,并为该客户机提供唯一的 MAC 地址。将配置放在 /etc/xen/auto 下意味着设备将在 Xen 主机启动时自动启动。

列表 4. /etc/xen/auto/mysql.example.com.cfg

name   = "mysql.example.com"
memory = "256"
disk   = ['tap:aio:/xen/mysql.example.com/appliance-base.img,xvda,w',]
vif    = ['bridge=xenbr0,mac=00:16:3e:00:00:02',]
vcpus  = 1

bootloader = "/usr/bin/pygrub"
on_reboot  = 'restart'
on_crash   = 'restart'

使用以下命令启动新设备

xenhost$ xm create /etc/xen/auto/mysql.example.com.cfg
xenhost$ vm console mysql.example.com

检查客户机启动时的控制台输出;由于您在 rc.local 中添加的内容,最后一部分输出将包含 DHCP 分配的 IP。将 Web 浏览器指向显示的 URL;默认情况下,Webmin 监听 TCP 端口 10000。以 root 身份登录后,您将能够管理您的 MySQL 设备。Webmin 将允许您设置静态 IP、维护 YUM 更新、创建其他用户、配置防火墙规则、创建和维护 MySQL 数据库和表,以及配置自动化的系统和 MySQL 备份。

结论

使用这些简单的步骤和现成的组件,您可以创建一个精简的虚拟设备来完成几乎任何事情。因为它是一个虚拟机,所以您可以在物理计算机之间移动它,并轻松地多次部署它。

正如我在引言中所述,所有这些步骤都可以使用 VMware 虚拟化产品完成。VMware 肯定是部署最广泛的技术,并且拥有自己的虚拟设备创建工具,包括用于共享预构建设备的在线“设备市场”。无论您使用 VMware 还是 Xen,虚拟设备都是一种以最少的麻烦部署预配置服务的简单方法。如果您是软件作者,它允许您每次都向您的客户提供“已知的工作配置”。

资源

CentOS Linux: www.centos.org

Webmin: www.webmin.com

VMware 虚拟设备市场: www.vmware.com/appliances

Matthew Hoskins 是新泽西理工学院的 UNIX/存储和虚拟化管理员,他在那里维护着许多公司管理系统。他喜欢尝试让截然不同的系统和软件协同工作,通常使用薄薄的一层 Perl(在本地称为“MattGlue”)。当不破解系统时,他经常可以在厨房里破解美食。可以通过 matthoskins@gmail.com 联系 Matt。

加载 Disqus 评论