Xen: учимся работать с консолью.

В прошлой статье мы установили и предварительно настроили xen.

Сегодня мы будем учиться управлять виртуальными машинами в нем с помощью утилиты XL

Утилита XL — первый из инструментов, доступных после установки «чистого» xen. Именно с его посощю после загрузки ядра мы проверяем, что xen стартовал успешно:

xl list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  1793     8     r-----      96.0

Говорит нам о том, что dom0 стартовал, ему доступно 8 виртуальных процессоров и 1793МБ ОЗУ.

По умолчанию, dom0 будет использовать всю доступную память и процессоры. Меняется его поведение в файле /etc/xen/xend-config.xsp

mcedit /etc/xen/xend-config.sxp

(dom0-cpus 0) #разрешает dom0 использовать все свободные процессоры, 0 - все
(dom0-min-mem 512) #минимальное кол-во памяти, доступное dom0

Для начала нужно определить конфигурацию нашей виртуальной машины.

PV guest

Пример рабочего конфига для PV Guest »

#PV config, подходит для линуксов
#Имя, которое будет отображаться в xl list и по которому сможем управлять гостевой ОС
name="pvlinux" 
#Кол-во доступных виртуальных процессоров
vcpus=1 
#Кол-во доступной памяти в Мб
memory=512 
#Дисковое устройство. В случае с образом - ставим дескриптор file:
disk=['phy:/dev/vg/proxyserver,xvda,w'] 
#Сеть.
vif=['mac=00:16:36:64:3a:3a,script=vif-bridge, bridge=xenbr0'] 
extra="console=hvc0"
#поведение гостевой ОС при событиях внутри нее
on_poweroff = 'destroy'
on_crash    = 'restart'
on_reboot = 'restart'
#загрузчик. О нем ниже.
bootloader="pygrub"

Тут есть нюанс. Есть 2 способа работы гостевой ОС с собственным ядром в режиме паравиртуализации:

  1. Ядро качается и помещается в недрах dom0
  2. Ядро помещается внутри гостевой ОС, а помогает произвести первоначальную загрузку утилита pygrub

Первый вариант удобен при установке ОС, особенно при использовании netInstall (в дальнейшем мы будем использовать эту фичу), второй — удобен с точки зрения изолированности domU от dom0, но может нести в себе определенные проблемы — pygrub по сути хоть и хороший, но костыль.  На данный момент пока сильно в данный вопрос не погружался, поэтому дать однозначного ответа — что лучше использовать — не могу. Как научился — так и работаю.

Запуск domU производится коммандой

xl create /etc/xen/<config>.cfg

Присоединиться можно либо сразу — для этого добавляем в предыдущую команду параметр -c

xl create /etc/xen/<config>.cfg -c

либо позже с помощью команды

xl console <domUname>

выйти из консоли: Ctrl+] или для Putty — Ctrl+5

Остановка domU:

xl shutdown <domUname>

Отключение domU (в описании пишут: равнозначно вытаскиванию кабеля питания)

xl destroy <domUname>

Если старт не удался — логи можно найти в /var/log/xen.

Автоматизация:

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

Где-то на просторах интернета (ссылку не нашел, иначе бы указал) нашел скрипт, который позволяет шевелиться еще меньше — в нем указываются параметры domU, зеркало для скачивания netinstall-образа linux (на указанном зеркале есть все — от убунты до FreeBSD) и volume Group , и после запуска скрипт сам создаст lvm-раздел, напишет за нас конфиг, скачает ядро и начнет установку 🙂

С небольшими правками (он был под xm+немного заточил под функциональность) — скрипт под катом.

Скрипт для лентяя »

#!/bin/bash

# User Configurable Settings
NAME=testpv     # название домена
VG=/dev/vg    # volume Group, в которой будем создавать раздел lvm
LV=$NAME        # название lvm-раздела
LV_SIZE=10G      # Размер раздела LVM
MEM_SIZE=512    # выделенная ВМ память
RELEASE=trusty  # версия ubuntu
VCPUS=1         # кол-во процессоров
MACADDR='00:00:00:00:00:01'

# Настройки миррора для скачивания
IMAGEDIR=/var/lib/xen/images/$NAME
MIRROR=http://ubuntu.arcticnetwork.ca/
DISTRO=/ubuntu/dists/$RELEASE/main/installer-amd64/current/images/netboot/xen

#Создаем LVM
lvcreate -L $LV_SIZE -n $LV $VG

#Качаем netboot kernel
if [ ! -d "$IMAGEDIR" ]; then
        mkdir -p $IMAGEDIR
        cd $IMAGEDIR
        wget $MIRROR/$DISTRO/initrd.gz
        wget $MIRROR/$DISTRO/vmlinuz
fi

#Создаем предустановочный конфиг:
CONFIG=/etc/xen/domu-available/$NAME.cfg
if [ -f "$CONFIG" ];
then
        mv $CONFIG $CONFIG.old
fi

#в предустановочном конфиге опцию on_reboot нужно поставить в destroy
#иначе потом получим циклическую установку. позже изменим.

cat >> $CONFIG << EOL
name="$NAME"
vcpus=$VCPUS
memory=$MEM_SIZE
disk=['phy:$VG/$LV,xvda,w']
vif=['mac=$MACADDR,script=vif-bridge, bridge=xenbr0']
vfb=['vnc=1']
kernel="$IMAGEDIR/vmlinuz"
ramdisk="$IMAGEDIR/initrd.gz"
extra="console=hvc0"
on_poweroff = 'destroy'
on_reboot   = 'destroy'
on_crash    = 'restart'
EOL

#запускаем domU для установки ОС
xl create $CONFIG -c

#после установки убираем ненужные строки, заменяем на нужные
sed -i '/kernel/d' $CONFIG
sed -i '/ramdisk/d' $CONFIG
sed -i '/on_reboot/d' $CONFIG
echo "on_reboot = 'restart'" >> $CONFIG
echo "bootloader="pygrub"" >> $CONFIG

#подключаемся консолью к свежеустановленной системе
xl create $CONFIG -c

Для оптимизации процесса я создал в папке конфигов xen 2 поддиректории — domu-available и domu-enabled, да-да, по аналогии с размещением конфигурации apache или nginx. В папке domu-available лежат конфиги всех доступных виртуальных машин, в папке domu-enabled — симлинки на те конфиги, которые должны запускаться автоматически при старте системы. О том, почему так — опишу ниже.

 HVM Guest

Тут, как ни странно, все проще. Хотя я ожидал, что будет больше проблем с запуском именно HVM-машин, заработало сразу.

Пример рабочего конфига для HVM Guest »

#HVM config для windows
builder = "hvm"
vcpus = 4
memory = 2048
disk = ['phy:/dev/vg/windows10,xvda2,w','file:/work/windows10.iso,ioemu:hdc:cdrom,r']
name = 'windows10'
vif = ['script=vif-bridge, bridge=xenbr0']
on_poweroff = 'destroy'
on_reboot = 'restart'
on_crash = 'restart'

#разрешаем vnc
vnc=1
vnclisten = '0.0.0.0'
#пароль на vnc
vncpasswd="mypasswd"
vncconsole=1
vncunused=0
#порт vnc, если vncdisplay=35, порт для подключения 5935
vncdisplay=35
#грузимся сначала с cdrom
boot='d'

Теперь можно подключится на адрес dom0 на порт 5935 с помощью vnc-клиента и начинат процесс установки. После окончания установки меняем в конфиге boot=’d’ на boot=’c’, либо просто комментируем описание cdrom-а.

Автоматизация

Путем несложных махинаций получаем скрипт для лентяев, создающий hvm-машину:

Скрипт для лентяя »

#!/bin/bash

NAME=windowstest     
VG=/dev/vg    
LV=$NAME        
LV_SIZE=10G      
MEM_SIZE=512    
VCPUS=1
VNCPORT=35
VNCPASSWD="password123"
MACADDR='00:16:18:55:55:55'
IMAGEPATH=/work/windows10.iso

lvcreate -L $LV_SIZE -n $LV $VG

CONFIG=/etc/xen/domu-available/$NAME.cfg
if [ -f "$CONFIG" ];
then
        mv $CONFIG $CONFIG.old
fi

cat >> $CONFIG << EOL
builder = "hvm"
name="$NAME"
vcpus=$VCPUS
memory=$MEM_SIZE
disk=['phy:$VG/$LV,xvda,w','file:$IMAGEPATH,ioemu:hdc:cdrom,r']
vif=['mac=$MACADDR,script=vif-bridge, bridge=xenbr0']
on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'
vnc=1
vnclisten = '0.0.0.0'
vncpasswd="$VNCPASSWD"
vncconsole=1
vncunused=0
vncdisplay=$VNCPORT
boot='dc'
EOL

xl create $CONFIG

 

Тюнинг

При всей своей функциональности, xen обладает одним неприятным фактом — в «чистом» виде (без libvirt) не стартует автоматически виртуальные машины после перезагрузки. помочь ему можно несколькими методами:

Первый и банальный — прописать в rc.local команды xl create для каждой виртуальной машины. Это неудобно, можно забыть и т.д.

Второй, более изощренный — написать скрипт. Выше мы создавали структуру папок с конфигами a-la nginx именно для этих целей.

Создадим скрипт:

touch /work/xenvmstart.sh
chmod 777 xenvmstart.sh

Скрипт автозапуска »

#!/bin/bash

VMS="/etc/xen/domu-enabled/*.cfg"

for vm in $VMS
do

  if [ -e "$vm" ]                      
  then
    data="" '+%d/%m/%Y - %H:%M:%S' 
    echo "starting at: $data"
    /usr/sbin/xl create $vm            
    sleep 10                           
    echo
    continue                           
  fi

  echo "Nothing to be done..."

done
exit 0

И пропишем его в /etc/rc.local

Теперь при старте системы виртуальные машины, симлинки на конфиг которых есть в папке domu-enabled будут запущены автоматически.

Полезные команды

xl create <config> #создать domU из конфига
xl shutdown domuname #остановить domU с именем domuname
xl restart domuname #перезагрузить domU с именем domuname
xl destroy domuname #выключить domU "как если бы ему отключили питание"
xl console domuname #подключиться к консоли domU
xl list #список работающих domU
xl top #загрузка ресурсов сервера по domU

Замечание

После завершения domU xen не возвращает использованную под нее память обратно в dom0

Если нужно зачем-то вернуть ее — придется сделать это вручную

xl mem-set 0 <размер памяти в МБ>

Вообще XL подобен автомату Калашникова — простой и надежный. Да, небогат функционалом, однако работает как часы, ввиду отсутствия свистоперделок прост в работе и надежен. Для многих его функционала будет вполне достаточно для обслуживания гостевых ОС, а с недостатками можно смириться.

 

Добавить комментарий

Войти с помощью: