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


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 

Использование моста


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

sudo vmbuilder kvm ubuntu --suite precise --flavour virtual --arch i386 \
 -o --libvirt qemu:///system --ip 192.168.0.100 --hostname myvm --bridge br0
Вам будет необходимо предварительно настроить интерфейс моста. Смотрите подробности в разделе Строительство мостов. Также, если имя данного интерфейса отличается от br0, замените его на актуальное имя.
Дисковые разделы

Определение дисковых разделов виртуального решения требует принять во внимание что вы планируете с этим делать. Поскольку большинство решений предпочитает иметь отдельное хранилище для данных, выделение отдельного /var может обрести смысл.

Для этого vmbuilder предоставляет нам опцию --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

В нашем случае мы определим текстовый файл vmbuilder.partition, который будет содержать следующее:

root 8000
swap 4000
---
/var 20000
Обратите внимание, что, поскольку мы используем виртуальные дисковые образы, актуальные размеры, которые мы здесь указали, являются максимальными размерами для этих томов.

Наша командная строка теперь выглядит следующим образом:

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' в качестве имени пользователя, а 'default' в качестве пароля.

Для этого мы используем следующие параметры:

  1. --user USERNAME: устанавливает имя добавляемого пользователя. По умолчанию: ubuntu.

  2. --name FULLNAME: устанавливает полное имя добавляемого пользователя. По умолчанию: Ubuntu.

  3. --pass PASSWORD: определяет пароль пользователя. По умолчанию: ubuntu.

Результирующая команда становится следующей:

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

Установка требуемых пакетов

В этом примере мы будем устанавливать пакет (Limesurvey), который подключается к базе MySQL и обладает web интерфейсом. Мы таким образом потребуем от нашей ОС предоставить нам следующее:

  1. Apache
  2. PHP
  3. MySQL
  4. Сервер OpenSSH
  5. Limesurvey (как пример приложения, которое мы упаковываем)

Это делается с использованием vmbuilder указанием опции --addpkg несколько раз:

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

Однако, в связи с тем как работает vmbuilder, пакеты, которые задают вопросы пользователю в фазе после установки, не поддерживаются и вместо этого должны устанавливаться когда интерактивность будет доступна. Это случай Limesurvey, который нам придется устанавливать позднее, когда пользователь войдет в систему.

Другие пакеты, которые задают простые debconf вопросы, такие как запрос на установку пароля для mysql-server, могут устанавливаться немедленно, но мы должны будем их перенастроить при первом входе пользователя в систему.

Если какие-то пакеты находятся не в основном хранилище, нам потребуется разрешить использование дополнительных хранилищ с помощью опций --comp и --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 не является частью архива на данный момент, мы укажем адрес ее PPA (персонального архива пакетов) и он будет добавлен в /etc/apt/source.list нашей ВМ, поэтому мы добавляем следующие опции к нашей команде:

--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 --ppa nijaba

Вопросы скорости

Кеширование пакетов

Когда vmbuilder создает сборку вашей системы, он вынужден запрашивать каждый из пакетов, который в нее входит, по сети с одного из официальных хранилищ (репозиториев), что, в зависимости от скорости вашего соединения с интернетом и загруженности зеркала, может сильно увеличивать время сборки вашего решения. Чтобы уменьшить это время, рекомендуется либо использовать локальное хранилище (которое может быть создано с помощью apt-mirror), либо использовать кеширующий прокси, такой как apt-proxy. Последний вариант намного проще в реализации и требует меньше места на диске, и поэтому мы выбрали такой вариант для данного руководства. Чтобы установить его, просто наберите:

sudo apt-get install apt-proxy

Как только процесс завершится, ваш (пустой) прокси готов к использованию по адресу http://mirroraddress:9999 и хранилище ubuntu можно будет искать в каталоге /ubuntu. Чтобы vmbuilder использовал его, мы должны добавить опцию --mirror:

--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

Таким образом мы добавляем к нашей команде:

--mirror http://mirroraddress:9999/ubuntu
Адрес зеркала, указанный здесь, будет также использован в /etc/apt/sources.list нашей заново созданной гостевой системы, поэтому полезно указывать адрес, который будет определяться гостевой системой, либо нужно планировать сбросить этот адрес впоследствии.
Установка локального зеркала

При более объемной инфраструктуре имеет смысл установить локальное зеркало хранилищ Ubuntu. Пакет apt-mirror проставляется со сценарием, который будет поддерживать зеркалирование для вас. Вам требуется запланировать приблизительно по 20 гигабайт свободного места на поддержку каждого выпуска и архитектуры.

По умолчанию apt-mirror использует файл конфигурации /etc/apt/mirror.list. В соответствии с тем, как это настраивается, он будет повторять только архитектуру локальной машины. Если вы желаете поддерживать другие архитектуры на вашем зеркале, просто дублируйте строки, начинающиеся с "deb", заменяя ключевое слово в /deb-{arch}, где arch может быть i386, amd64 и пр. Например, на amd64 машине чтобы хранить также i386 архивы, вы должны иметь следующий список (некоторые строки разбиты на несколько, чтобы соответствовать формату документа):

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 

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

Когда зеркало закончит копирование (а это может длиться достаточно долго), вам потребуется настроить Apache таким образом, чтобы ваши файлы (в каталоге /var/spool/apt-mirror, если вы ничего не меняли) были опубликованы вашим Apache сервером. Для дополнительной информации смотрите раздел HTTPD - Apache2 интернет сервер.

Упаковка приложения

Нам доступны два варианта:

  1. Рекомендуемый метод - создать пакет Debian. Поскольку это выходит за рамки данного руководства, мы не будем описывать это здесь и приглашаем почитать как это делается в руководстве Ubuntu Packaging Guide. В этом случае будет хорошей идеей организовать хранилище (репозиторий) для вашего пакета, чтобы обновления могли удобно забираться из него. Смотрите статью Debian Administration в качестве руководства по этой теме.

  2. Вручную установить приложение в каталоге /opt, как рекомендовано установками FHS.

В нашем случае мы будем использовать Limesurvey в качестве примера web приложения, для которого мы собираемся предоставить виртуальное решение. Как отмечалось ранее, мы создадим версию пакета, доступную в PPA.

Полезные дополнения

Настройка автоматических обновлений

Чтобы ваша система была настроена на регулярные обновления, мы лишь установим unattended-upgrades, для чего мы добавим следующую опцию в строку нашей команды:

--addpkg unattended-upgrades

Поскольку мы помещаем пакет нашего приложения в PPA, процесс будет обновлять не только систему, но и наше приложение каждый раз, как мы обновим его в PPA.

Обработка событий ACPI

Для того, чтобы ваша виртуальная машина могла обрабатывать события перезагрузки и выключения, которые будут ей посылаться, хорошей мыслью будет установить также пакет acpid. Чтобы сделать это просто добавьте следующую опцию:

--addpkg acpid

Окончательный вариант команды

Здесь приведена окончательная версия команды со всеми опциями, обсуждавшимися выше:

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.