简单的 Linux 和 Xen 虚拟设备
每个人都以某种形式熟悉硬件设备。它可以是家中的无线接入点,也可以是数据中心的 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 安装,我们将使用带有 --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
现在,您已准备好开始安装服务。
让我们让这个客户机准备好成为一个设备。当客户机完全启动后,以 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,虚拟设备都是一种以最少的麻烦部署预配置服务的简单方法。如果您是软件作者,它允许您每次都向您的客户提供“已知的工作配置”。
Matthew Hoskins 是新泽西理工学院的 UNIX/存储和虚拟化管理员,他在那里维护着许多公司管理系统。他喜欢尝试让截然不同的系统和软件协同工作,通常使用薄薄的一层 Perl(在本地称为“MattGlue”)。当不破解系统时,他经常可以在厨房里破解美食。可以通过 matthoskins@gmail.com 联系 Matt。