ВНИМАНИЕ! Данная статья расчитана на Xen 4.0 или 4.1, которые из коробки комплектуются утилитой xm для управления гипервизором. Новые Xen (4.2 и выше) имеют по-умолчанию только xl, для работы с которым данная статья не подходит. Чуть позже я допишу отдельную статью - как оно делать для 4.2 и выше (ибо уже сам выполняю эти шаги).
В одной из статей я уже показывал - как установить паравиртуальный Debian Squeeze или сконвертировать существующий HVM-домен в паравиртуальный режим. Минус предложенного метода заключался в том, что необходимо было сначала установить HVM-домен, а уже его перевести в паравиртуальный. Т.е., как минимум - это дольше и требует поддержки процессором технологий виртуализации (Intel Vanderpool для примера).
В этом же топике я хочу показать - как установить Squeeze сразу в виде паравиртуальной машины.
Итак, начнем.
Создаем директорию и диск
$ cd /etc/xen
$ sudo mkdir pvtest
$ cd pvtest
$ sudo dd if=/dev/zero of=hdd0 bs=1M count=1 seek=10240
Здесь и далее вместо pvtest указывайте действительную директорию - т.е. директорию, в которой будет у Вас располагаться виртуальная машина со всеми причиндалами.
Так-же Вам необходимо задать свой размер жесткого диска. В данном примере он выставлен в 10240Мб (10Гб) и диск создается динамическим (т.е. будет расти по мере заполнения его данными, а не сразу захватит все 10Гб).
Если нужно создать сразу статический диск (это дольше для создания - диск заполняется нулями - но быстрее в плане работы с этим диском в дальнейшем и оградит Вас от неприятностей, когда места станет нехватать из-за того, что Вы держите динамических дисков больше, чем позволяет физическое пространство).
Для этого вместо предыдущей команды dd используйте такой вариант:
$ sudo dd if=/dev/zero of=hdd0 bs=1M count=10240
Скачиваем установочные образы
$ sudo wget http://ftp.debian.org/debian/dists/squeeze/main/installer-i386/current/images/netboot/xen/initrd.gz
$ sudo wget http://ftp.debian.org/debian/dists/squeeze/main/installer-i386/current/images/netboot/xen/vmlinuz
$ sudo wget http://ftp.debian.org/debian/dists/squeeze/main/installer-i386/current/images/netboot/xen/xm-debian.cfg
Здесь скачиваются 32-битные ядро, initrd и конфиг-файл для установки виртуальной машины. Если необходимы 64-битные версии (я не проверял их установку!) - вместо "installer-i386" пишите "installed-amd64".
Конфигурируем файл xm-debian.cfgОткройте этот файл на редактирование и поправьте опции в соответствии с Вашими нуждами. Например, измените размер выделяемой ОЗУ для виртуальной машины (параметр "memory"), измените путь к жесткому диску (который мы создали - параметр "disk"), задайте сетевой интерфейс и т.д.
Вот пример этого файла для нашей машины "pvtest":
# -*- mode: python; -*-
#============================================================================
# Example Python setup script for Debian guest installation.
#============================================================================
#
# Standard options are configured as normal. Only a subset are included below.
# See /usr/share/doc/xen-utils-common/examples for full examples.
#
# After standard options are configure use
# xm create xm-debian.cfg install=true"
# to start the Debian Installer.
#
# In the installation case the following additional variables exist:
#
# COMMON OPTIONS
# install-method: "cdrom" or "network"
# install-arch: which architecture to install. e.g. i386 or amd64
# install-installer: URL or path to the Debian Installer bits. By
# default for a network install these are located under
# install-mirror. For a CDROM install the default is a fixed path on
# the CD.
# install-kernel, install-ramdisk: URL/path to the installer kernel and
# ramdisk to use, by default these are located via install-installer.
# install-extra: extra command line arguments
#
# CDROM SPECIFIC OPTIONS
# install-media: Path to the Debian install media (i.e. an ISO)
# install-cdrom-device: Name of the CD-ROM device within the guest.
#
# NETWORK SPECIFIC OPTIONS
# install-suite: which Debian version to install. e.g. lenny, squeeze or sid
# install-mirror: which Debian mirror to use
# e.g. http://ftp.uk.debian.org/debian
#============================================================================
#----------------------------------------------------------------------------
# Standard variables
# Initial memory allocation (in megabytes) for the new domain.
memory = 256
# A name for your domain. All domains must have different names.
name = "pvtest"
# 128-bit UUID for the domain. The default behavior is to generate a new UUID
# on each call to 'xm create'.
#uuid = "06ed00fe-1162-4fc4-b5d8-11993ee4a8b9"
# List of which CPUS this domain is allowed to use, default Xen picks
#cpus = "" # leave to Xen to pick
#cpus = "0" # all vcpus run on CPU0
#cpus = "0-3,5,^1" # run on cpus 0,2,3,5
# Number of Virtual CPUS to use, default is 1
vcpus = 1
#----------------------------------------------------------------------------
# Define network interfaces.
# By default, no network interfaces are configured. You may have one created
# with sensible defaults using an empty vif clause:
#
# vif = ['']
#
# or optionally override backend, bridge, ip, mac, script, type, or vifname:
#
# vif = ['mac=fe:16:3e:68:fc:fe, bridge=eth0']
#
# or more than one interface may be configured:
#
# vif = ['', 'bridge=xenbr1']
vif = ['mac=fe:16:3e:68:fc:fe, bridge=eth0']
#----------------------------------------------------------------------------
# Define the disk devices you want the domain to have access to, and
# what you want them accessible as.
# Each disk entry is of the form phy:UNAME,DEV,MODE
# where UNAME is the device, DEV is the device name the domain will see,
# and MODE is r for read-only, w for read-write.
#
# NB: Only xvd devices are supported by the kernel in Debian Lenny and later.
disk = ['file:/etc/xen/pvtest/hdd0,xvda,w']
#----------------------------------------------------------------------------
# Define frame buffer device.
#
# By default, no frame buffer device is configured.
#
# To create one using the SDL backend and sensible defaults:
#
# vfb = [ 'type=sdl' ]
#
# This uses environment variables XAUTHORITY and DISPLAY. You
# can override that:
#
# vfb = [ 'type=sdl,xauthority=/home/bozo/.Xauthority,display=:1' ]
#
# To create one using the VNC backend and sensible defaults:
#
# vfb = [ 'type=vnc' ]
#
# The backend listens on 127.0.0.1 port 5900+N by default, where N is
# the domain ID. You can override both address and N:
#
# vfb = [ 'type=vnc,vnclisten=127.0.0.1,vncdisplay=1' ]
#
# Or you can bind the first unused port above 5900:
#
# vfb = [ 'type=vnc,vnclisten=0.0.0.0,vnunused=1' ]
#
# You can override the password:
#
# vfb = [ 'type=vnc,vncpasswd=MYPASSWD' ]
#
# Empty password disables authentication. Defaults to the vncpasswd
# configured in xend-config.sxp.
#============================================================================
# Debian Installer specific variables
def check_bool(name, value):
value = str(value).lower()
if value in ('t', 'tr', 'tru', 'true'):
return True
return False
global var_check_with_default
def var_check_with_default(default, var, val):
if val:
return val
return default
xm_vars.var('install', use='Install Debian, default: false', check=check_bool)
xm_vars.var("install-method",
use='Installation method to use "cdrom" or "network" (default: network)',
check=lambda var, val: var_check_with_default('network', var, val))
# install-method == "network"
xm_vars.var("install-mirror",
use='Debian mirror to install from (default: http://ftp.debian.org/debian)',
check=lambda var, val: var_check_with_default('http://ftp.debian.org/debian', var, val))
xm_vars.var("install-suite",
use='Debian suite to install (default: squeeze)',
check=lambda var, val: var_check_with_default('squeeze', var, val))
# install-method == "cdrom"
xm_vars.var("install-media",
use='Installation media to use (default: None)',
check=lambda var, val: var_check_with_default(None, var, val))
xm_vars.var("install-cdrom-device",
use='Installation media to use (default: xvdd)',
check=lambda var, val: var_check_with_default('xvdd', var, val))
# Common options
xm_vars.var("install-arch",
use='Debian mirror to install from (default: i386)',
check=lambda var, val: var_check_with_default('i386', var, val))
xm_vars.var("install-extra",
use='Extra command line options (default: None)',
check=lambda var, val: var_check_with_default(None, var, val))
xm_vars.var("install-installer",
use='Debian installer to use (default: network uses install-mirror; cdrom uses /install.ARCH)',
check=lambda var, val: var_check_with_default(None, var, val))
xm_vars.var("install-kernel",
use='Debian installer kernel to use (default: uses install-installer)',
check=lambda var, val: var_check_with_default(None, var, val))
xm_vars.var("install-ramdisk",
use='Debian installer ramdisk to use (default: uses install-installer)',
check=lambda var, val: var_check_with_default(None, var, val))
xm_vars.check()
if not xm_vars.env.get('install'):
bootloader="pygrub"
elif xm_vars.env['install-method'] == "network":
import os.path
print "Install Mirror: %s" % xm_vars.env['install-mirror']
print "Install Suite: %s" % xm_vars.env['install-suite']
if xm_vars.env['install-installer']:
installer = xm_vars.env['install-installer']
else:
installer = xm_vars.env['install-mirror']+"/dists/"+xm_vars.env['install-suite'] + \
"/main/installer-"+xm_vars.env['install-arch']+"/current/images"
print "Installer: %s" % installer
print
print "WARNING: Installer kernel and ramdisk are not authenticated."
print
if xm_vars.env.get('install-kernel'):
kernelurl = xm_vars.env['install-kernel']
else:
kernelurl = installer + "/netboot/xen/vmlinuz"
if xm_vars.env.get('install-ramdisk'):
ramdiskurl = xm_vars.env['install-ramdisk']
else:
ramdiskurl = installer + "/netboot/xen/initrd.gz"
import urllib
class MyUrlOpener(urllib.FancyURLopener):
def http_error_default(self, req, fp, code, msg, hdrs):
raise IOError("%s %s" % (code, msg))
urlopener = MyUrlOpener()
try:
print "Fetching %s" % kernelurl
kernel, _ = urlopener.retrieve(kernelurl)
print "Fetching %s" % ramdiskurl
ramdisk, _ = urlopener.retrieve(ramdiskurl)
except IOError, _:
raise
elif xm_vars.env['install-method'] == "cdrom":
arch_path = { 'i386': "/install.386",
'amd64': "/install.amd" }
if xm_vars.env['install-media']:
print "Install Media: %s" % xm_vars.env['install-media']
else:
raise OptionError("No installation media given.")
if xm_vars.env['install-installer']:
installer = xm_vars.env['install-installer']
else:
installer = arch_path[xm_vars.env['install-arch']]
print "Installer: %s" % installer
if xm_vars.env.get('install-kernel'):
kernelpath = xm_vars.env['install-kernel']
else:
kernelpath = installer + "/xen/vmlinuz"
if xm_vars.env.get('install-ramdisk'):
ramdiskpath = xm_vars.env['install-ramdisk']
else:
ramdiskpath = installer + "/xen/initrd.gz"
disk.insert(0, 'file:%s,%s:cdrom,r' % (xm_vars.env['install-media'],
xm_vars.env['install-cdrom-device']))
bootloader="pygrub"
bootargs="--kernel=%s --ramdisk=%s" % (kernelpath, ramdiskpath)
print "From CD"
else:
print "WARNING: Unknown install-method: %s." % xm_vars.env['install-method']
if xm_vars.env.get('install'):
# Figure out command line
if xm_vars.env['install-extra']:
extras=[xm_vars.env['install-extra']]
else:
extras=[]
# Reboot will just restart the installer since this file is not
# reparsed, so halt and restart that way.
extras.append("debian-installer/exit/always_halt=true")
extras.append("--")
extras.append("quiet")
console="hvc0"
try:
if len(vfb) >= 1:
console="tty0"
except NameError, e:
pass
extras.append("console="+ console)
extra = str.join(" ", extras)
print "command line is \"%s\"" % extra
Запускаем установку
$ sudo xm create -c /etc/xen/pvtest/xm-debian.cfg install=true install-mirror=ftp://ftp.ru.debian.org/debian install-ramdisk=/etc/xen/pvtest/initrd.gz install-kernel=/etc/xen/pvtest/vmlinuz
В параметрах, где указывается путь (/etc/xen/pvtest/) - этот путь необходимо задать в соответствии с размещением виртуального гостя в Вашем случае.
В данном примере указано зеркало RU - Российское. Вы можете указать то, которое Вам ближе по нраву.
Параметр -c говорит Xen, что мы хотим сразу подключиться к консоли виртуальной машины.
Параметры install=true и install-mirror=... указывают, что мы хотим запустить именно установку виртуальной машины и показывают - откуда скачать образы для установщика.
Отсюда у нас запускается консоль установки. Отличие от обычной консоли HVM здесь видно в цвете - она черно-белая, без цветов вообще.
Установка происходит обычным методом, как и при HVM установке или установке на голое железо:
а) Выбираем язык - доступны только C и English. Выбираем C.
б) Наше местоположение. Выбираем "Europe" и "Russian Federation" (если, конечно, Вы живете в России, иначе выбирайте ту страну, где Вы живете).
в) Зеркало - выбираем ближайшее или самое нравящяесе зеркало.
г) Оно скачивает пакеты.
д) Задаем пароль root и создаем первого пользователя.
е) Указываем часовой пояс
ж) Оно снова загружает пакеты
з) Разбиваем диск (создаем разделы и форматируем их). Если не уверены - можете использовать самую простую опцию "Guided - use entire disk".
и) Соглашаемся на вопрос "применить изменения к диску". Установщик размечает разделы и форматирует их.
к) Далее оно снова загружает пакеты.
л) Выбираем раскладку клавиатуры (можно оставить по-умолчанию).
м) Отвечаем на вопрос - хотим ли мы отсылать данные о использовании пакетов разработчикам Debian. На Ваше усмотрение.
н) Далее нас спрашивают - какой софт ставить. Не забываем снять галочку с "Graphical desktop environment" если ставим сервер. Сразу рекомендую поставить галочку напротив "SSH server" - доступ по SSH к этой машине нужен.
о) И снова установщик загружает набор пакетов из интернет.
п) Нас спрашивают - поставить ли GRUB-загрузчик. Несмотря на то, что у нас паравиртуальная система - соглашаемся.
р) Все, нас предупреждают что установка закончена и сейчас виртуальная машина будет загашена.
с) Теперь, после того, как ОС установлена и виртуальная машина остановлена - нам необходимо создать файл конфигурации для ее запуска. Нет, это не тот файл, который мы использовали для создания виртуального гостя - нам нужен другой.
Далее приводится пример такого файла. В это примере параметры подобраны так, чтобы соответствовать примеру файла конфигурации установки, который был представлен ранее. Конечно, параметры Вы можете поменять - как Вам это необходимо.
Назовем этот файл "vm.cfg" и положим его в "/etc/xen/pvtest/vm.cfg".
root = "root=/dev/xvda1 ro console=hvc0"
memory = '256'
bootloader = 'pygrub'
disk = [ 'file:/etc/xen/pvtest/hdd0,xvda,w' ]
vif = [ 'bridge=eth0, mac=fe:16:3e:68:fc:fe' ]
name = 'pvtest'
vnc = 1
sdl = 0
apic = 1
acpi = 1
#localtime = 0
vcpus = 1
pae = 1
on_poweroff = 'destroy'
on_reboot = 'restart'
on_crash = 'restart'
vncconsole = 1
stdvga = 0
videoram = 16
shadow_memory = 8
timer_mode = 1
Обратите особое ВНИМАНИЕ на опцию "root=", где у нас написано значение "xvda1". Это значение подходит для тех случаев, когда раздел "/boot" или "/" располагается на первом разделе (xvda1). Если же Вы, например, в начало диска поставили раздел со свопом или еще какой другой - то в этом параметре указывайте номер раздела с загрузочной информацией ("/boot" или "/" если у Вас все в одном разделе).
Также стоит отметить, что здесь мы пользуемся загрузчиком PyGRUB для загрузки ядра изнутри установленной операционной системы. Это хорошо тем, что:
а) Вы сразу можете запустить только-что установленную паравиртуальную систему без необходимости сначала монтирования ее файловой системы для выкачивания ядра;
б) Обновления ОС, затрагивающие ядро, действительно его затрагивают - ведь при перезагрузке ядро грузится изнутри виртуальной машины, следовательно, обновленное.
Есть и минусы данного метода, самым важным из которых, как отмечают другие администраторы и Xen сами - это безопасность. Однако если Вы единолично рулите виртуальными машинами, они все в вашем распоряжении (а не отдаете машины в аренду), то эта дырка у Вас незадействована.
т) Запускаем виртуальную машину.
$ sudo xm create -c vmtest/vm.cfg
Ключик -c, как уже говорилось, указывает Xen сразу открыть консоль машины.
Итак, если Вы все сделали правильно, включая указание правильного раздела в "root=" в последнем конфиге - у Вас запустится паравиртуальный Linux Debian Squeeze, паравиртуальный сразу из коробки.
Комментарии
Оставить комментарий
Операционная система LINUX
Термины: Операционная система LINUX