Search

Simple Virtual Appliances with Linux and Xen

Everyone is familiar with hardware appliances in one form or another.
It could be a wireless access point at home or a DNS server appliance in the
data center. Appliances offer a prebuilt software solution (with hardware) that can be
deployed rapidly with minimal hassle. When you couple the
“appliance” concept with
virtualization, you get virtual appliances—a prebuilt software solution,
ready to run on your own hardware with minimal work.

In this article, I provide a hands-on introduction to constructing a
simple virtual appliance by assembling readily available components. The
framework can be used to build a wide range of appliances.

What Is a Virtual Appliance?

Virtual appliances share many attributes in common with their hardware
cousins. In general, both types of appliances have a small footprint, use
an embedded or “thin” OS, are single-purpose, provide easy backup and
restore, and are Web-managed. Most important, they come ready to rock and
roll with minimal configuration. Virtual appliances have the additional
benefit of being hosted on your own hardware, so you can host multiple
virtual appliances on a single physical host.

Many Linux-based virtual appliances are constructed with an extremely thin
OS. This can make installing common software complicated due to
dependencies, especially for a beginner. For this example, I decided to use an
off-the-shelf free distribution, specifically CentOS, because it uses tools
most people are used to. However, we'll cut it to the bone as much as
possible.

Collecting the Parts

We are going to build our virtual appliances using the Xen hypervisor,
because it's
free and comes with most Linux distributions these days. In my examples, I
am using CentOS 5.3 for both the host and appliance. The host needs the
Virtualization option selected during install, or you can retro-fit an
existing Linux system by installing the xen and kernel-xen packages. I
chose
Xen because it's easy; alternatively, you could use VMware, KVM or
any other hypervisor.

You can install CentOS directly from the Internet if you have a good
connection, or download it to a local Web or NFS server. In this example, I
point to mirror.centos.org for the install sources and to a local
NFS server for the kickstart config.

We will use the Webmin package to provide Web-based management of our
appliance. Webmin has been around for a long time and will provide our
appliance with a lot of functionality, like complete Web-based management and
simple backup/restore. I downloaded the webmin-1.480-1 RPM from
www.webmin.com for our appliance. Everything else will be provided by standard CentOS packages.

Installing CentOS

To create a minimal CentOS install for our appliance, we will use a custom
kickstart with the --nobase option set. One of the most important concepts
of good system management is repeatability—a fully automated kickstart
install is repeatable and self-documenting. Our entire OS installation will
fit quite comfortably in a 2GB virtual disk and 256MB of memory. We are
creating our appliance under /xen, which is a standard location for Xen
virtual machines (also known as guests). If you choose another location, make
sure either to disable SELinux or adjust your settings. Wherever you put
Xen, the disk images need the system_u:object_r:xen_image_t context set.

First,
let's create an “appliance-base” guest, which will be used like a
template. All the files for this guest will be stored in
/xen/appliance-base/. Start by logging in to the Xen host as root and
create the virtual disk. Then, grab the Xen vmlinuz and initrd files from the
install media:

You have just created a 2GB virtual disk for your appliance. Now, create an
appliance-base.install.cfg file and a ks.cfg file, as shown in Listings 1 and 2.
Be sure to substitute your CentOS URL or a mirror on the Internet.
The last three bytes of the MAC address in the .cfg file are made up;
just make sure all your Xen guests are unique.

Now, all you have to do is boot up the Xen guest and watch your appliance's OS
install. The install will be fully automated; simply execute the following
command and sit back:

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

After the install completes, it will shut down the Xen guest and drop back to
a shell prompt. Next, still in the same directory, create an
appliance-base.cfg, as shown in Listing 3, which will be used to
run the appliance in normal mode.

Let's get this guest ready to be an appliance. When the guest is
completely booted, log in as root. The password is “password”
(this is
somewhat of a de facto standard for virtual appliances). Execute the
following commands to update fully; then, install Webmin and all its
dependencies:

This will output the current IP address for eth0 to tell
the user how to connect to Webmin for the first time. This, of course,
assumes that the appliance is booting up on a DHCP network.
Often a virtual appliance is booted initially with DHCP
and then configured via the Web with a static address.

Customizing and Installing Services

At this point, we have a generic virtual appliance ready to customize.
To make a MySQL server appliance, run yum install
mysql-server. To make a
DNS appliance, run yum install bind bind-utils. To make a LAMP appliance,
run yum install httpd php mysql-server. Reboot, or click Refresh
Modules inside Webmin, and you will be presented with Web management for
whatever you installed. Webmin supports a very wide range of software right
out of the box, and even more with extension modules available on the
Webmin Web site.

For our example, let's make a simple MySQL database server appliance. To
customize your base appliance, run the following commands inside the VM:

Edit the Xen configuration file /etc/xen/auto/mysql.example.com.cfg as
shown in Listing 4. Set the name, the path to the disk image, and give this guest a unique
MAC address. Placing the configuration under /etc/xen/auto means the
appliance will be started automatically when the Xen host boots.

Examine the console output as the guest boots; the last bit of output will
have the DHCP-assigned IP, thanks to your rc.local additions. Point a Web
browser at the URL shown; by default, Webmin listens on TCP port 10000. Once
logged in as root, you will be able to manage your MySQL appliance. Webmin
will allow you to set a static IP, maintain YUM updates, create additional
users, configure firewall rules, create and maintain MySQL databases and
tables, and configure automated system and MySQL backups.

Conclusion

Using these simple steps and readily available components, you can create a
thin virtual appliance to do almost anything. Because its a virtual
machine,
you can move it between physical computers and deploy it multiple times with
ease.

As I stated in the introduction, all of these steps could have been done
with VMware virtualization products. VMware is certainly the most widely
deployed technology and has its own tools for creating virtual appliances,
including an on-line “Appliance Marketplace” for sharing prebuilt appliances.
No matter whether you use VMware or Xen, virtual appliances are a simple way to
deploy preconfigured services with minimal hassle. If you are a software
author, it allows you to hand your customers a “known working
configuration”
every time.

Matthew Hoskins is a UNIX/Storage and Virtualization Administrator for
The New Jersey Institute of Technology where he maintains many of the
corporate administrative systems. He enjoys trying to get wildly different
systems and software working together, usually with a thin layer of Perl
(locally known as “MattGlue”). When not hacking systems, he
often can be
found hacking in the kitchen. Matt can be reached at
matthoskins@gmail.com.