Это старая версия документа.


JeOS и vmbuilder

Введение

Что такое JeOS

Ubuntu JeOS (произносится как "Juice" - "джус") является эффективным вариантом операционной системы Ubuntu Server, настроенной специально для виртуальных применений. Она более не доступна для загрузки в виде CDROM ISO, а только как одна из опций:

  1. Либо во время установки с Server Edition ISO (нажатие F4 на первом экране позволит выбрать вам минимальную установку, что соответствует выбору пакетов, эквивалентному JeOS).

  2. Либо может быть создана с использованием Ubuntu vmbuilder, как будет описано здесь.

JeOS - это специализированная установка редакции Ubuntu Server с настроенным ядром, которое содержит только базовые элементы, требуемые для запуска виртуализированной среды.

Ubuntu JeOS настроена для получения преимущества от ключевых технологий производительности в новейших продуктах виртуализации от VMware. Эта комбинация минимального размера и оптимизированной производительности гарантирует, что редакция Ubuntu JeOS предоставляет эффективное использование серверных ресурсов при развертывании больших виртуальных сред.

Без излишних драйверов, а только используя минимально необходимые пакеты, независимые поставщики ПО (ISV - independent software vendor) могут настроить поддерживаемую ОС исключительно как им требуется. Они могут быть спокойны, что обновления как по соображениям безопасности, так и улучшений, будут ограничены абсолютным минимумом того, что требуется для их специфического окружения. В итоге: пользователи, разворачивающие виртуальные среды, построенные на основе JeOS, будут проходить через минимальные обновления и тем самым уменьшать время обслуживания по сравнению со стандартной полной установкой сервера.

Что такое vmbuilder

С vmbuilder больше нет необходимости загружать JeOS ISO. vmbuilder содержит различные пакеты и строит виртуальную машину, скроенную под ваши потребности за минуту. vmbuilder является сценарием, который автоматизирует процесс создания готовой виртуальной машины на базе Linux. На данный момент поддерживаются супервизоры KVM и Xen.

Вы можете использовать опции командной строки для добавления дополнительных пакетов, удаления пакетов, выбора версии Ubuntu, какие использовать зеркала и пр. На последнем оборудовании с большим объемом памяти, с tmpdir в /dev/shm или с использованием tmpfs и с локальным зеркалом, вы можете провести начальную загрузку ВМ менее чем за минуту.

Впервые представленный как shell сценарий в Ubuntu 8.04 LTS, ubuntu-vm-builder стартовал с небольшим намеком на инструмент, позволяющий разработчикам проверять их новый код в виртуальной машине без необходимости каждый раз перегружать систему. Поскольку некоторые администраторы обратили внимание на этот сценарий, а часть из них стала его улучшать и приспосабливать для огромного количества применений, то Сорен Хансен (Soren Hansen) (автор этого сценария и специалист по виртуализации, а не игрок в гольф) решил его переписать начисто для Intrepid как сценарий на python под новые задачи:

  1. Разработать его так, чтобы его могли использовать другие разработчики дистрибутивов.

  2. Использовать механизм подключаемых модулей для всех виртуальных взаимодействий, чтобы можно было легко добавлять логику для других виртуальных сред.

  3. Предоставить простой web интерфейс поддержки в качестве опции к интерфейсу командной строки.

Однако основные принципы и команды остались теми же самыми.

Начальная установка

Подразумевается, что вы установили и настроили libvirt и KVM локально на машине, которую вы используете. Для подробностей как это сделать обратитесь, пожалуйста, к следующим ссылкам:

  1. Страница KVM Wiki.

Мы также предполагаем, что вы знаете как пользоваться консольными текстовыми редакторами, такими как nano или vi. Если вы не использовали ни один из них ранее, вы можете посмотреть обзор, доступный на странице PowerUsersTextEditors. Это учебное пособие выполнено для KVM, но основные принципы подойдут и для других технологий виртуализации.

Установка vmbuilder

Название пакета, который нам требуется установить - python-vm-builder. В терминале введите:

sudo apt-get install python-vm-builder
Если вы используете Hardy, вы тем не менее можете выполнить большинство из описанного здесь, используя пакет ubuntu-vm-builder, потребуется только слегка изменить синтаксис утилиты.

Определение вашей виртуальной машины

Определение виртуальной машины с помощью Ubuntu vmbuilder достаточно простое, но требуется принять во внимание несколько вещей:

  1. Если вы планируете поставлять виртуальный продукт, не думайте, что конечный пользователь знает как увеличить размер диска под свои нужды, поэтому или планируйте объемный виртуальный диск, чтобы ваше приложение могло расти, или объясните достаточно хорошо в вашей документации как распределить больше места. Может оказаться неплохой идеей хранить данные на каком-то отдельном внешнем носителе.

  2. Учитывая, что оперативную память (RAM) намного проще передать в ВМ, ее размер можно установить на минимально достаточном по вашему мнению уровне для вашего продукта.

Команда vmbuilder имеет два основных параметра: технология виртуализации (hypervisor) и целевое назначение. Дополнительные параметры слишком многочисленны и их можно посмотреть, используя следующую команду:

vmbuilder kvm ubuntu --help

Базовые параметры

Поскольку данный пример основывается на KVM и Ubuntu 12.04 LTS (Precise Pangolin) и нам нравится пересоздавать одну и ту же виртуальную машину много раз, мы вызовем vmbuilder со следующими начальными параметрами:

sudo vmbuilder kvm ubuntu --suite precise --flavour virtual --arch i386 -o --libvirt qemu:///system

Параметр --suite указывает редакцию Ubuntu, --flavour определяет что мы хотим использовать виртуальное ядро (то самое, которое используется для образа JeOS), --arch говорит что мы хотим использовать 32-битную машину, -o говорит vmbuilder переписать предыдущие версии ВМ и --libvirt говорит информировать локальное окружение виртуализации добавить результирующую ВМ в список доступных машин.

Заметки:

  1. Поскольку основные операции выполняются vmbuilder, ему требуются привилегии суперпользователя, соответственно используйте sudo.

  2. Если вашей виртуальной машине требуется более 3Гб оперативной памяти, вам следует создавать 64-битную машину (--arch amd64).

  3. До Ubuntu 8.10 виртуальное ядро собиралось только для 32-битной архитектуры, поэтому если вы хотите определить amd64 машину на Hardy, вам вместо этого следует использовать --flavour server.

Параметры установки JeOS

Настройки сети JeOS

Присвоение фиксированного IP адреса


Поскольку виртуальные продукты могут развертываться на очень разных сетях, очень трудно узнать как будет выглядеть актуальная сеть. Чтобы упростить настройки хорошей идеей будет попытаться повторить то, как обычно настраивают сеть поставщики оборудования, а именно присваивая фиксированный IP адрес в сети начального класса, которую вы определите в своей документации. Адрес из диапазона 192.168.0.0/24 как правило является удачным выбором.

Чтобы это сделать, используйте следующие параметры:

  1. --ip ADDRESS: IP адрес в формате с точками (умолчания для dhcp не указываются).

  2. --hostname NAME: установить NAME в качестве сетевого имени гостевой системы.

  3. --mask VALUE: IP маска в формате с точками (по умолчанию 255.255.255.0).

  4. --net VALUE: IP адрес сети (по умолчанию X.X.X.0).

  5. --bcast VALUE: широковещательный IP адрес (по умолчанию X.X.X.255).

  6. --gw ADDRESS: адрес шлюза (по умолчанию X.X.X.1).

  7. --dns ADDRESS: адрес сервера имен (по умолчанию X.X.X.1).

Мы сейчас полагаем, что значения по умолчанию достаточно хороши, поэтому результирующий вызов выглядит так:

sudo vmbuilder kvm ubuntu --suite precise --flavour virtual --arch i386 -o --libvirt qemu:///system --ip 192.168.0.100 --hostname myvm 

Bridging


Because our appliance will be likely to need to be accessed by remote hosts, we need to configure libvirt so that the appliance uses bridge networking. To do this add the –bridge option to the command:

sudo vmbuilder kvm ubuntu --suite precise --flavour virtual --arch i386 \
-o --libvirt qemu:///system --ip 192.168.0.100 --hostname myvm --bridge br0

You will need to have previously setup a bridge interface, see Bridging for more information. Also, if the interface name is different change br0 to the actual bridge interface.

Partitioning

Partitioning of the virtual appliance will have to take into consideration what you are planning to do with is. Because most appliances want to have a separate storage for data, having a separate /var would make sense.

In order to do this vmbuilder provides us with –part:

–part PATH

Allows you to specify a partition table in a partition file, located at PATH. Each
line of the partition file should specify (root first):
    mountpoint size
where  size  is  in megabytes. You can have up to 4 virtual disks, a new disk starts
on a line with ’---’.  ie :
    root 1000
    /opt 1000
    swap 256
    ---
    /var 2000
    /log 1500

In our case we will define a text file name vmbuilder.partition which will contain the following:

root 8000 swap 4000 — /var 20000

Note that as we are using virtual disk images, the actual sizes that we put here are maximum sizes for these volumes.

Our command line now looks like:

sudo vmbuilder kvm ubuntu --suite precise --flavour virtual --arch i386 \
-o --libvirt qemu:///system --ip 192.168.0.100 --hostname myvm --part vmbuilder.partition

Using a «\» in a command will allow long command strings to wrap to the next line.

User and Password

Again setting up a virtual appliance, you will need to provide a default user and password that is generic so that you can include it in your documentation. We will see later on in this tutorial how we will provide some security by defining a script that will be run the first time a user actually logs in the appliance, that will, among other things, ask him to change his password. In this example I will use 'user' as my user name, and 'default' as the password.

To do this we use the following optional parameters:

  1. user USERNAME: Sets the name of the user to be added. Default: ubuntu.

  1. name FULLNAME: Sets the full name of the user to be added. Default: Ubuntu.

  1. pass PASSWORD: Sets the password for the user. Default: ubuntu.

Our resulting command line becomes:

sudo vmbuilder kvm ubuntu --suite precise --flavour virtual --arch i386 \
-o --libvirt qemu:///system --ip 192.168.0.100 --hostname myvm --part \
vmbuilder.partition --user user --name user --pass default

Installing Required Packages

In this example we will be installing a package (Limesurvey) that accesses a MySQL database and has a web interface. We will therefore require our OS to provide us with:

  Apache
  PHP
  MySQL
  OpenSSH Server
  Limesurvey (as an example application that we have packaged)

This is done using vmbuilder by specifying the –addpkg option multiple times:

–addpkg PKG

Install PKG into the guest (can be specfied multiple times)

However, due to the way vmbuilder operates, packages that have to ask questions to the user during the post install phase are not supported and should instead be installed while interactivity can occur. This is the case of Limesurvey, which we will have to install later, once the user logs in.

Other packages that ask simple debconf question, such as mysql-server asking to set a password, the package can be installed immediately, but we will have to reconfigure it the first time the user logs in.

If some packages that we need to install are not in main, we need to enable the additional repositories using –comp and –ppa:

–components COMP1,COMP2,…,COMPN

         A comma separated list of distro components to include (e.g. main,universe).
         This defaults to "main"

–ppa=PPA Add ppa belonging to PPA to the vm's sources.list.

Limesurvey not being part of the archive at the moment, we'll specify it's PPA (personal package archive) address so that it is added to the VM /etc/apt/source.list, so we add the following options to the command line:

–addpkg apache2 –addpkg apache2-mpm-prefork –addpkg apache2-utils \

  1. addpkg apache2.2-common –addpkg dbconfig-common –addpkg libapache2-mod-php5 \

  2. addpkg mysql-client –addpkg php5-cli –addpkg php5-gd –addpkg php5-ldap \

  3. addpkg php5-mysql –addpkg wwwconfig-common –addpkg mysql-server –ppa nijaba

Speed Considerations

Package Caching

When vmbuilder creates builds your system, it has to go fetch each one of the packages that composes it over the network to one of the official repositories, which, depending on your internet connection speed and the load of the mirror, can have a big impact on the actual build time. In order to reduce this, it is recommended to either have a local repository (which can be created using apt-mirror) or using a caching proxy such as apt-proxy. The later option being much simpler to implement and requiring less disk space, it is the one we will pick in this tutorial. To install it, simply type:

sudo apt-get install apt-proxy

Once this is complete, your (empty) proxy is ready for use on http://mirroraddress:9999 and will find ubuntu repository under /ubuntu. For vmbuilder to use it, we'll have to use the –mirror option:

--mirror=URL  Use Ubuntu mirror at URL instead of the default, which
              is http://archive.ubuntu.com/ubuntu for official
              arches and http://ports.ubuntu.com/ubuntu-ports
              otherwise

So we add to the command line:

--mirror http://mirroraddress:9999/ubuntu

The mirror address specified here will also be used in the /etc/apt/sources.list of the newly created guest, so it is useful to specify here an address that can be resolved by the guest or to plan on reseting this address later on.

Install a Local Mirror

If we are in a larger environment, it may make sense to setup a local mirror of the Ubuntu repositories. The package apt-mirror provides you with a script that will handle the mirroring for you. You should plan on having about 20 gigabyte of free space per supported release and architecture.

By default, apt-mirror uses the configuration file in /etc/apt/mirror.list. As it is set up, it will replicate only the architecture of the local machine. If you would like to support other architectures on your mirror, simply duplicate the lines starting with “deb”, replacing the deb keyword by /deb-{arch} where arch can be i386, amd64, etc… For example, on an amd64 machine, to have the i386 archives as well, you will have (some lines have been split to fit the format of this document):

deb  http://archive.ubuntu.com/ubuntu precise main restricted universe multiverse 
/deb-i386  http://archive.ubuntu.com/ubuntu precise main restricted universe multiverse

deb  http://archive.ubuntu.com/ubuntu precise-updates main restricted universe multiverse 
/deb-i386  http://archive.ubuntu.com/ubuntu precise-updates main
 restricted universe multiverse 

deb http://archive.ubuntu.com/ubuntu/ precise-backports main restricted universe multiverse 
/deb-i386  http://archive.ubuntu.com/ubuntu precise-backports main
 restricted universe multiverse 

deb http://security.ubuntu.com/ubuntu precise-security main restricted universe multiverse 
/deb-i386  http://security.ubuntu.com/ubuntu precise-security main
 restricted universe multiverse 

deb http://archive.ubuntu.com/ubuntu precise main/debian-installer
 restricted/debian-installer universe/debian-installer multiverse/debian-installer 
/deb-i386 http://archive.ubuntu.com/ubuntu precise main/debian-installer
 restricted/debian-installer universe/debian-installer multiverse/debian-installer 

Notice that the source packages are not mirrored as they are seldom used compared to the binaries and they do take a lot more space, but they can be easily added to the list.

Once the mirror has finished replicating (and this can be quite long), you need to configure Apache so that your mirror files (in /var/spool/apt-mirror if you did not change the default), are published by your Apache server. For more information on Apache see HTTPD - Apache2 Web Server.

Package the Application

Two option are available to us:

  The recommended method to do so is to make a Debian package. Since this is outside of the scope of this tutorial, we will not perform this here and invite the reader to read the documentation on how to do this in the Ubuntu Packaging Guide. In this case it is also a good idea to setup a repository for your package so that updates can be conveniently pulled from it. See the Debian Administration article for a tutorial on this.
  Manually install the application under /opt as recommended by the FHS guidelines.

In our case we'll use Limesurvey as example web application for which we wish to provide a virtual appliance. As noted before, we've made a version of the package available in a PPA (Personal Package Archive).

Useful Additions

Configuring Automatic Updates

To have your system be configured to update itself on a regular basis, we will just install unattended-upgrades, so we add the following option to our command line:

–addpkg unattended-upgrades

As we have put our application package in a PPA, the process will update not only the system, but also the application each time we update the version in the PPA.

ACPI Event Handling

For your virtual machine to be able to handle restart and shutdown events it is being sent, it is a good idea to install the acpid package as well. To do this we just add the following option:

–addpkg acpid

Final Command

Here is the command with all the options discussed above:

sudo vmbuilder kvm ubuntu --suite precise --flavour virtual --arch i386 -o \ 
         --libvirt qemu:///system --ip 192.168.0.100 --hostname myvm \
         --part vmbuilder.partition --user user --name user --pass default \
         --addpkg apache2 --addpkg apache2-mpm-prefork --addpkg apache2-utils \
         --addpkg apache2.2-common --addpkg dbconfig-common \ 
         --addpkg libapache2-mod-php5 --addpkg mysql-client --addpkg php5-cli \ 
         --addpkg php5-gd --addpkg php5-ldap --addpkg php5-mysql \
         --addpkg wwwconfig-common --addpkg mysql-server \
         --addpkg unattended-upgrades --addpkg acpid --ppa nijaba \
         --mirror http://mirroraddress:9999/ubuntu 

Resources

If you are interested in learning more, have questions or suggestions, please contact the Ubuntu Server Team at:

  IRC: #ubuntu-server on freenode
  Mailing list: ubuntu-server at lists.ubuntu.com
  Also, see the JeOSVMBuilder Ubuntu Wiki page.