Xen: различия между версиями
м (Отмена правки 8621 участника ИльдарМулюков (обсуждение)) |
|||
Строка 10: | Строка 10: | ||
==== Domain 0 ==== | ==== Domain 0 ==== | ||
Он же dom0 - привилегированная виртуальная машина, имеющая доступ к практически всему железу и имеющая права давать гипервизору команду на запуск новых виртуальных машин. На практике это обычная Linux-система, единственное, чем она ограничена - это объёмом памяти. Обычно в такой системе установлен минимальный набор программ, демон управления xen, утилиты для | Он же dom0 - привилегированная виртуальная машина, имеющая доступ к практически всему железу и имеющая права давать гипервизору команду на запуск новых виртуальных машин. На практике это обычная Linux-система, единственное, чем она ограничена - это объёмом памяти. Обычно в такой системе установлен минимальный набор программ, демон управления xen, утилиты для управления xen, утилиты для создания виртуальных машин, и программный сетевой мост (bridge) который позволяет другим виртуальным машинам попадать в сеть. Виртуальные жесткие диски, предоставляемые Xen, также экспортируются из dom0. Обычно это файлы подключеные через loopback/blktap, либо LVM тома. | ||
==== Domain U ==== | ==== Domain U ==== |
Версия от 09:16, 9 июля 2009
Осторожно пока 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-].