Xen
Материал из ALT Linux Wiki
Осторожно пока UNDERCONSTRUCTION
Содержание |
[править] Введение
Xen - это система виртуализации. Xen представляет собой паравиртуальный монитор виртуальных машин, т.е. позволяет запускать несколько операционных систем одновременно, либо с ядрами специального вида, либо немодифицированных (при наличии аппаратной поддержки паравиртуализации в CPU).
[править] Hypervisor
Это собственно Xen - маленькое ядро (в разы меньше, чем ядро опероационной системы), загружаемое первым и управляющее работой виртуальных машин. Обычно находится в /boot/xen.gz. Гипервизор исполняется в нулевом круге защиты CPU. Гипервизор умеет управлять памятью, процессором и частично ACPI, а также предоставляет API гипервызовов (hypercall), с помощью которых ядра операционных систем в виртуальных машинах могут с ним общаться. Загрузившись, гипервизор загружает ядро dom0.
[править] Domain 0
Он же dom0 - привилегированная виртуальная машина, имеющая доступ к практически всему железу и имеющая права давать гипервизору команду на запуск новых виртуальных машин. На практике это обычная Linux-система, единственное, чем она ограничена - это объёмом памяти. Обычно в такой системе установлен минимальный набор программ, демон управления xen, утилиты для управления xen, утилиты для создания виртуальных машин, и программный сетевой мост (bridge) который позволяет другим виртуальным машинам попадать в сеть. Виртуальные жесткие диски, предоставляемые Xen, также экспортируются из dom0. Обычно это файлы подключеные через loopback/blktap, либо LVM тома.
[править] Domain U
domU - это собственно виртуальная машина, запускаемая dom0. Получает свой участок памяти, жёсткие диски и сетевой интерфейс. Может быть запущена, остановлена, преостановлена, перезагруженна, задамплена на диск, перемещена в том числе без остановки на другую машину (live migration).
[править] В чём отличие в ALT Linux ядер dom0 от domU
Ядро dom0 может работать как в dom0, так и в domU, собрано со всеми стандартными опциями наших ядер. DomU ядра могут работать только в domU, поддеживают только PCI устройства (так как только их можно прокинуть в domU) и имеет включенную в само ядро поддержку ext3 и жестких дисков. Сделано это для того, чтобы в большинстве случаев domU ядра могли работать без initrd.
[править] Установка
[править] Установка загрузчика
[править] Ещё немного теории
Проблема в том что xen имеет загрузочный формат multiboot. Это формат позволяет загружать ядро, и пакеты с модулями прямо в загрузчике. Роль ядра у нас выполняет гипервизор, роль модулей ядро линукса, initrd и возможно файл с политиками. Зачем это? Гипервизор не умеет работать с жесткими дисками поэтому загручик должен загрузить ядро dom0 и его initrd в память, и делает он это обычно до запуска гипервизора. Гипервизор загрузившись находит и запускает ядро dom0, а оно уже вытягивает initrd как обычное ядро линукса.
Проблема в том что во-первых на практике единственным нормальным загрузчиком работающим с multiboot является grub. Хотя для сетевой загрузки можно использовать pxelinux, его аналог extlinux при локальной загрузке крайне неудобен.
Дефолтным загрузчиком в ALT Linux является lilo, grub существует но плохо поддеживается и в данный момент поддерживается только под i586. Поэтому для начала нам надо установить GRUB.
[править] Установка GRUB
GRUB достаточно плохо ставится из линукса, поэтому лучше его поставить из него самого. Для этого берём от сюда ISO образ(97kb). Сначала копируем из него директорию grub себе в boot.(чтобы была директория /boot/grub/) Далее делаем конфиг в /boot/grub/menu.lst. Для начала сделаем чтобы GRUB загружал обычные ядра.
timeout 5 color black/cyan yellow/cyan default 0 title default kernel /boot/vmlinuz root=/dev/sda1 vga=normal initrd /boot/initrd.img
Затем нужно закаченный файл разархивировать из bz2 и полученный iso записать на диск с которого и загрузиться. Загружаетесь и попадаете в консоль GRUB. Там делаем:
root(hd0,1) setup(hd0) reboot
Важно помнить что:
- Граб нумерует всё с нуля
- Диски нумеруется в порядке который выдает BIOS и обычно совпадает с порядком загрузки(тоесть hd0 это диск загружаемый по умолчанию)
- разделы нумеруются тоже с нуля
- В грабе работает TAB тоесть root (hd0,<tab> покажет таблицу разделов.
- В принципе GRUB можно поставить в раздел и грузить его из lilo через other
Если у нас загрузилось обычное ядро можно переходить к установке собственно XEN.
[править] Установка Xen
[править] Установка самого XEN
# apt-get install kernel-image-xen-dom0 kernel-modules-необходимые-xen-dom0 xen-hypervisor xen
Редактируем /boot/grub/menu.lst примерно до такого:
timeout 5 color black/cyan yellow/cyan default 0 title default kernel /boot/vmlinuz root=/dev/sda1 vga=normal initrd /boot/initrd.img title XEN kernel /boot/xen.gz dom0_mem=512M module /boot/vmlinuz-2.6.18-xen-dom0-alt6.M40.1 root=/dev/sda1 module /boot/initrd-2.6.18-xen-dom0-alt6.M40.1.img
Обратите внимание на двойную module — это обязательно.
Перезагружаемся в XEN-ядро, далее:
# service xend start
Проверим, что все в порядке:
[root@wintermute ~]# xm info host : wintermute.tld release : 2.6.18-xen-dom0-alt6.M40.1 version : #1 SMP Tue Mar 4 22:42:44 MSK 2008 machine : i686 nr_cpus : 4 nr_nodes : 1 sockets_per_node : 2 cores_per_socket : 1 threads_per_core : 2 cpu_mhz : 2392 hw_caps : bfebfbff:00000000:00000000:00000080:00004400 total_memory : 4095 free_memory : 3540 xen_major : 3 xen_minor : 1 xen_extra : .2 xen_caps : xen-3.0-x86_32p xen_scheduler : credit xen_pagesize : 4096 platform_params : virt_start=0xf5800000 xen_changeset : unavailable cc_compiler : gcc version 4.1.1 20070105 (ALT Linux, build 4.1.1-alt11) cc_compile_by : builder cc_compile_domain : rio.altlinux.org cc_compile_date : Tue Mar 4 23:38:33 MSK 2008 xend_config_format : 4
Поставим xend в автозапуск:
# chkconfig --level 345 xend on
[править] Настройка сети в XEN
Ещё есть проблема актуальная для XEN начиная с версии 3.2.0 - там страшно кривой скрипт для запуска сетевого бриджа. Решается она переносом настройки бриджа в /etc/net.
[править] Зачем нужен бридж?
В XEN сеть реализована так: для каждой(в том число dom0) виртуальной машины создаётся n виртуальных сетевых интерфейсов. Каждый представляет собой две виртуальные сетевые карты соединенный между собой одна находящаяся в DomX под названием ethY, а другая в Dom0 под названием vifX.Y (где X - номер виртуальной машины а Y больше или равно 0 и меньше n). На этом то что предоставляет Xen сам закачивается.
Далее вопрос: что с этим всем делать?
Вариант 1. присвоить каждому интерфейсу по ip адресу. так чтобы каждая пара была в своей сети. Поскольку в этом варианте данные ходят между dom0 и каждым доменом в отдельности, при этом домены не имею выхода во внешнюю сеть этот вариант используется редко.
Вариант 2. Продолжение первого, но при этом организовать например routing пакетов во внешнюю сеть и между виртуальными машинами. То есть dom0 становится роутером этой сети.
Вариант 3. Продолжение 2го но ещё включается NAT.
Вариант 4. Сделать bridge и объединить им реальную сетевую карту (она переименовывается в p<oldname>, интерфейс лишается ip и mac адресов) и коннекторы во все остальные виртуальные машины. то есть dom0 выполняет функцию свича. Любопытно что, в xen до 3.2 в dom0 ip и mac старой сетевухи присваивается интерфейсу ethY, а в 3.2 присваивается бриджу.
Таким образом bidge является самым удобным способом работы виртуальных машин с сетью, так как для сети машина с xen выглядит как свич на котором висят машины.
Для работы разных вариантов в xen есть скрипты по паре для разных вариантов, один (network-*) запускается при запуске системы и настраивает сеть в целом и vif-* который вызывается при старте каждого нового сетевого интерфейса в виртуальных машинах.
[править] Собственно настройка бриджа
Стоит рассказать про настройку брижда подробнее, так как это самый удобный и востребованый вариант сети.
[править] Установка виртуальной машины
Ставим kernel-image-xen-domU:
# apt-get install kernel-image-xen-domU
Делаем образ машины. Я использовал один из собственноручно приготовленных openvz-темплейтов.
# mkdir -p /xen/alt # dd if=/dev/zero of=/xen/alt.img bs=1M seek=10240 count=0 — создаем 10 ГБ «раздел» для машины # mkfs.ext3 /xen/alt.img # mount -o loop /xen/alt.img /xen/alt/ # cd /xen/alt && tar xf /altlinux-4.0.tar.gz
Поставим внутрь будущей виртуальной машины domU-ядро:
# chroot /xen/alt/ /bin/bash # vim /etc/resolv.conf — установим нужный nameserver # vim /etc/apt/sources.list — установим правильный репозиторий (можно пропустить, если устраивает тот, что преднастроен внутри контейнера) # apt-get update && apt-get install kernel-image-xen-domu
Поправим /etc/fstab в чруте, чтобы выглядело примерно так:
/dev/hda1 / ext3 defaults 0 1
Выходим из чрута:
# exit
Отмонтируем чрут: # umount /xen/alt
Ставим kernel-image-xen-domU в dom0-систему:
# apt-get install kernel-image-xen-domU
Пишем конфигурационный файл /etc/xen/alt:
kernel = "/boot/vmlinuz-2.6.18-xen-domU-alt6" memory = 256 name = "alt" root = "/dev/hda1 ro" extra = "xencons=tty" disk = [ 'file:/xen/alt.img,hda1,w' ]
Пробуем запустить: # xm create -c alt
В конце концов должен выдать приглашение на логин, куда собственно и нужно логиниться.
Для выхода из консоли нажать Ctrl-].
