Повесть о том как я Xen4 мучал… или он меня…..
Что мы имеем:
uname -a
Linux Gentoo 2.6.34-xen-r4 #3 SMP Sat Jan 1 19:30:46 EET 2011 x86_64 AMD Phenom(tm) II X4 925 Processor AuthenticAMD GNU/Linux
И почти мертвый винт на 500Г
5 Reallocated_Sector_Ct 0x0033 090 090 140 Pre-fail Always FAILING_NOW 873
Перед установкой пакетов необходимо снять с них архитектурное маскирование (~x64):
echo "app-emulation/xen
app-emulation/xen-tools
sys-kernel/xen-sources" >> /etc/portage/package.keywords
До начала сборки нужно выполнить следующие шаги:
1. Добавить в /etc/make.conf опции компилятора:
CFLAGS="-march=native -O2 -pipe -fomit-frame-pointer -mfpmath=sse -funroll-loops -mno-tls-direct-seg-refs"
CXXFLAGS="${CFLAGS}"
2. Там же (в /etc/make.conf), можно включить опции сборки бинарных пакетов (готовые пакеты emerge разместит в /usr/portage/packages), они пригодятся для ускоренного развертывания domU:
FEATURES="buildpkg"
3. Пересобрать текущее окружение с новой опцией компилятора, которая нужна корректной работы системного окружения с гипервизором xen (заодно построятся бинарные пакеты окружения):
emerge -evat world
Предварительный этап окончен, можно запускать сборку/установку пакетов xen, xen-tools и исходников адаптированного для Xen ядра — xen-sources:
emerge -av xen-sources xen xen-tools
По USE-флагам рекомендаций особо не будет, всё на ваше усмотрения, для себя я выбрал api ioemu screen hvm к пакету app-emulation/xen-tools
echo app-emulation/xen-tools api ioemu screen hvm >> /etc/portage/package.use
emerge xen-sources xen xen-tools
После сборки необходимо переключить симлинк /usr/src/linux на новое дерево исходного кода ядра:
eselect kernel list
Available kernel symlink targets:
[1] linux-2.6.34-gentoo-r1 *
[2] linux-2.6.34-xen-r4
eselect kernel set 2
On amd64 you will also need to add sys-devel/dev86 if you plan on using hvm.
emerge -av dev86
Если у вас не собрался XEN (в моем случае 4.0.1) и вывалился с ошибкой
In file included from tapdisk.h:62,
from blk_linux.c:4:
../lib/blktaplib.h:199:1: error: "WRITE" redefined
In file included from blk_linux.c:3:
/usr/include/linux/fs.h:150:1: error: this is the location of the previous definition
make[5]: *** [blk_linux.o] Ошибка 1
make[5]: Leaving directory `/usr/src/xen/xen-4.0.1/xen-4.0.1/tools/blktap/drivers'
make[4]: *** [subdir-install-drivers] Ошибка 2
make[4]: Leaving directory `/usr/src/xen/xen-4.0.1/xen-4.0.1/tools/blktap'
make[3]: *** [subdirs-install] Ошибка 2
make[3]: Leaving directory `/usr/src/xen/xen-4.0.1/xen-4.0.1/tools/blktap'
make[2]: *** [subdir-install-blktap] Ошибка 2
make[2]: Leaving directory `/usr/src/xen/xen-4.0.1/xen-4.0.1/tools'
make[1]: *** [subdirs-install] Ошибка 2
make[1]: Leaving directory `/usr/src/xen/xen-4.0.1/xen-4.0.1/tools'
make: *** [install-tools] Ошибка 2
Полазив по форумах разработчиков нашел патч http://sticky.reverse.kiev.ua/1005/
И заодно решил собрать руками все это безобразие.
Качаем исходники Xen-4.0.1
cd /usr/src/xen
wget http://bits.xensource.com/oss-xen/release/4.0.1/xen-4.0.1.tar.gz
распаковываем
tar -xvf xen-4.0.1.tar.gz
Скачиваем патч отсюда http://sticky.reverse.kiev.ua/1005/raw/
и применяем его к нашим исходникам
patch -p1 < patch.txt
Теперь собираем все это :
make xen && make tools && make install-xen && make install-tools
Если хотите собрать с ядром которое рекомендует разработчик, то:
make && make xen && make tools && make install-xen && make install-tools
Конфигурируем ядро:
cat /usr/src/linux/.config | grep -i xen | grep -v ^#
CONFIG_X86_64_XEN=y
CONFIG_X86_XEN_MCE=y
CONFIG_XEN_PCIDEV_FRONTEND=y
CONFIG_XEN=y
CONFIG_XEN_INTERFACE_VERSION=0x00030207
CONFIG_XEN_PRIVILEGED_GUEST=y
CONFIG_XEN_PRIVCMD=y
CONFIG_XEN_XENBUS_DEV=y
CONFIG_XEN_BACKEND=y
CONFIG_XEN_BLKDEV_BACKEND=y
CONFIG_XEN_BLKDEV_TAP=y
CONFIG_XEN_BLKDEV_TAP2=y
CONFIG_XEN_BLKBACK_PAGEMAP=y
CONFIG_XEN_NETDEV_BACKEND=y
CONFIG_XEN_NETDEV_TX_SHIFT=8
CONFIG_XEN_PCIDEV_BACKEND=y
CONFIG_XEN_PCIDEV_BACKEND_VPCI=y
CONFIG_XEN_SCSI_BACKEND=y
CONFIG_XEN_USB_BACKEND=y
CONFIG_XEN_SCSI_FRONTEND=m
CONFIG_XEN_USB_FRONTEND=m
CONFIG_XEN_GRANT_DEV=y
CONFIG_XEN_DISABLE_SERIAL=y
CONFIG_XEN_SYSFS=y
CONFIG_XEN_NR_GUEST_DEVICES=256
CONFIG_XEN_COMPAT_LATEST_ONLY=y
CONFIG_XEN_COMPAT=0xffffff
CONFIG_XEN_VCPU_INFO_PLACEMENT=y
CONFIG_XEN_SMPBOOT=y
CONFIG_XEN_DEVMEM=y
CONFIG_XEN_BALLOON=y
CONFIG_XEN_SCRUB_PAGES=y
CONFIG_XEN_DEV_EVTCHN=y
Тут можно взять мой конфиг ядра http://sticky.reverse.kiev.ua/1006/ (AMD64, Phenom X4, ATI HD3200)
Компилируем ядро:
make && make modules_install
mount /boot
cp vmlinux /boot/vmlinux-2-6-34-xen
cat /boot/grub/menu.lst
......
title Xen-4 kernel 2.6.34-new
root (hd0,0)
kernel /boot/xen.gz dom0_mem=1024M
module /boot/vmlinux-2-6-34-xen root=/dev/sda5 dummy=dummy
Во время загрузки ядро ругалось на отсутствие микрокодов устройств, в моем случае он ругался на видео-карту, решение проблеммы для меня:
скомпилировать микрокод
emerge -av radeon-ucode
добавить 2 строки в файл .config ядра:
CONFIG_EXTRA_FIRMWARE="radeon/R600_rlc.bin"
CONFIG_EXTRA_FIRMWARE_DIR="/lib/firmware"
Еще может потребовать микрокод на процессор, см. сюда http://www.gentoo.ru/node/21477
В теории, все должно загрузиться.
Добавляем Xen в автозагрузку:
rc-update add xend default
Смотрим состояние:
# xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 1000 4 r----- 5205.2
Теперь посмотрим как вообще работает Xen, для этого попробуем запустить виртуальную машину посредством HVM (hardware virtualization mode)
HVM-домен Xen (hardware virtualization mode) — полностью виртуализированный домен Xen. Требует для своего исполнения поддержки аппаратной виртуализации со стороны процессора. Позволяет исполнять любые операционные системы, предназначенные для работы на процессоре этой архитектуры (C)
Я буду пытатся установить Gentoo в DomU Xen
Для этого качаем загрузочный диск
cd soft/
wget http://mirror.yandex.ru/gentoo-distfiles/releases/amd64/current-iso/install-amd64-minimal-20101209.iso
Сама ОС будет находится на LVM2 разделе.
Инициализируем винт и создадим на нем раздел на 20G
Добавляем физ.устройство
pvcreate /dev/sdb
Поверх создаем виртуальную группу
vgcreate virtuals /dev/sdb
В пределах группы создаем логический том на 20G
lvcreate -L20G -n gentoo virtuals
Смотрим, что получилось
lvdisplay
File descriptor 6 (pipe:[14917]) leaked on lvdisplay invocation. Parent PID 9279: bash
--- Logical volume ---
LV Name /dev/virtuals/gentoo
VG Name virtuals
LV UUID Or1vRI-IGJi-s7TB-bT1x-pDrd-Bkpx-DY7S0W
LV Write Access read/write
LV Status available
# open 2
LV Size 20,00 GiB
Current LE 5120
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:1
Сам том должен появится в /dev
ls -la /dev/virtuals/
итого 0
drwxr-xr-x 2 root root 80 Янв 2 12:03 .
drwxr-xr-x 19 root root 4260 Янв 2 12:03 ..
lrwxrwxrwx 1 root root 7 Янв 2 10:03 gentoo -> ../dm-0
lrwxrwxrwx 1 root root 7 Янв 2 11:52 hdd -> ../dm-1
Вродь все готово для запуска, но еще необходимо подготовить конфиг для Xen
Создадим папку /etc/xen/config
А внутри нее наш конфиг gentoo
cat gentoo
import os, re
arch = os.uname()[4]
if re.search('64', arch):
arch_libdir = 'lib64'
else:
arch_libdir = 'lib'
kernel = '/usr/lib/xen/boot/hvmloader'
builder = 'hvm'
memory = '256'
vcpus=1
device_model='/usr/lib/xen/bin/qemu-dm'
disk = [ 'phy:/dev/virtuals/gentoo,ioemu:sda,w', 'file:/data/soft/install-amd64-minimal-20101209.iso,hdc:cdrom,r' ]
name = 'gentoo'
vif = [ 'type=ioemu, mac=00:16:3e:55:44:12, bridge=xenbr0, model=rtl8139' ]
boot='d'
vnc=1
vncconsole=0
vncdisplay=31
sdl=0
pae=1
acpi=1
apic=1
#on_poweroff = 'destroy'
#on_reboot = 'restart'
#on_crash = 'destroy'
Для запуска amd64 ядра в виртуальной машине установлена опция pae=1.
После запуска мы можем подключится к экрану нашей ОС через VNC протокол, для чего нам необходим какой нибудь VNC-client (в моем случае отлично работает KRDC под KDE4)
Для инициализации VNC мы указали такие опции:
vnc=1
vncconsole=0
vncdisplay=31
Что говорит о том, что мы сможем подключится к экрану такими способами:
vncviewer :0
или KRDC по адресу 127.0.0.1:31
Но как-то у меня не заладилось с офф.документацией и мне не удалось подключится этими двумя способами, а прошло подключение через KRDC по адресу 127.0.0.1:5931 (порт = 5900+vncdisplay)
netstat -anp | grep 5931
tcp 0 0 127.0.0.1:5931 0.0.0.0:* LISTEN 11435/qemu-dm
boot='d' - указывает на запуск со второго диска 🙂 тоесть CD-ROM
NetInstall запустился без проблем. Устройства которые определились в виртуальной машине:
lspci
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 01)
00:02.0 VGA compatible controller: Cirrus Logic GD 5446
00:03.0 Class ff80: XenSource, Inc. Xen Platform Device (rev 01)
00:04.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 20)
Собираем базовую систему Gentoo по HandBook
Очень кратко опишу инсталяцию для тех кто впервые столкнулся с Gentoo:
#Делим винт
cfdisk /dev/hda
#hda1 - /boot
#hda5 - /
#hda6 - swap
#Форматируем разделы
mkfs.ext3 /dev/hda1 && mkfs.ext4 /dev/hda5 && mkswap /dev/hda6
#Цепляем разделы к системе (монтируем)
mount /dev/hda5 /mnt/gentoo && mkdir /mnt/gentoo/boot && mount /dev/hda1 /mnt/gentoo/boot && swapon /dev/hda6
#Монтируем псевдоФС
mount -t proc none /mnt/gentoo/proc && mount -o bind /dev /mnt/gentoo/dev
#качаем архив с базовой системой и деревом портежей
cd /mnt/gentoo/
wget http://mirror.yandex.ru/gentoo-distfiles/releases/amd64/current-stage3/stage3-amd64-20101230.tar.bz2
wget http://mirror.yandex.ru/gentoo-distfiles/snapshots/portage-latest.tar.bz2
# распаковываем
tar xvjpf stage3-*.tar.bz2
tar xvjf portage* -C usr/
# Правим /mnt/gentoo/etc/resolv.conf и /mnt/gentoo/etc/conf.d/net
nano /mnt/gentoo/etc/resolv.conf
nameserver 193.24.25.1
nano /mnt/gentoo/etc/conf.d/net
# This network configuration was written by net-setup
config_eth0=( "10.0.1.121 broadcast 10.0.1.255 netmask 255.255.255.0" )
routes_eth0=( "default via 10.0.1.1" )
#Заходим (chroot) в нашу голую систему
chroot /mnt/gentoo /bin/bash
env-update
source /etc/profile
export PS1="(chroot) $PS1"
#Устанавливаем пароль для root
passwd
#качаем ядро и компилим его по вкусу:
emerge -av gentoo-sources && cd /usr/src/linux/ && make menuconfig && make && make modules_install
#Ставим загрузчик и учим его грузить наше ядро
emerge -av grub && cp arch/x86/boot/bzImage /boot/vmlinux
grep -v rootfs /proc/mounts > /etc/mtab
nano /boot/grub/menu.lst
default 0
timeout 30
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
title Gentoo Linux 2.6.36-r1
root (hd0,0)
kernel /boot/vmlinux root=/dev/sda5
#Запихиваем загрузчик в MBR
grub-install /dev/hda
# Уходим в reboot
reboot
Кому лень вбивать команды может поставить Debian с NetInstall образа 🙂
.....
.......
много выпитого пива
.........
............
У меня Gentoo в DomU под управлением Xen запустилась и прекрасно работала (я так думаю), но ведь не серьёзно использовать Linux в DomU и при этом не использовать все прелести паравиртуализации.
И я было собрался переводить свой домен в режим паравиртуализации.... и тут меня ждал сюрприз
xm dmesg | grep -i svm
И пустота! Виртуализация в BIOS включена! О_о
....тут много матов......
А я то думал, чего так систему плющит.
Время познее... нада переставать выделываться.... плюнул и собрал то ядро, которое рекомендуют в Xen - 2.6.32-27
Скачать конфиг можно тут pv-ops-kernel -2.6.32-27
Собрал руцями ядро
make menuconfig
make
make modules_install
cp vmlinux /boot/
И привалило мне счастье
xm dmesg | grep -i svm
(XEN) HVM: SVM enabled
Приступим к переводу нашего DomU в паравиртуальный режим.
Для чего я создал еще один конфиг gentoo_new в котором буду в будущем описывать конфигурацию.
Но для начала нужно обьяснить виртуалке, что она будет работать под гипервизором
Ставим ксеновское ядро:
emerge -av /usr/portage/sys-kernel/xen-sources/xen-sources-2.6.34-r4
eselect kernel list
Available kernel symlink targets:
[1] linux-2.6.34-xen-r4 *
[2] linux-2.6.36-gentoo-r6
make menuconfig
Тут отмечаем такие опции
Processor type and features --->
[*] Xen-compatible
Bus options (PCI etc.) --->
[*] Xen PCI Frontend
XEN --->
[ ] Privileged Guest (domain 0)
<*> Backend driver support
<*> Block-device backend driver
<*> Block-device tap backend driver
<*> Block-device tap backend driver 2
<*> Network-device backend driver
(8) Maximum simultaneous transmit requests (as a power of 2)
[ ] Pipelined transmitter (DANGEROUS)
< > Network-device loopback driver
< > TPM-device backend driver
SCSI backend driver
USB backend driver
<*> Block-device frontend driver
<*> Network-device frontend driver
<*> Network-device frontend driver acceleration for Solarflare NICs
SCSI frontend driver
USB frontend driver
[*] Taking the HCD statistics (for debug)
[ ] HCD suspend/resume support (DO NOT USE)
< > User-space granted page access driver
<*> Framebuffer-device frontend driver
<*> Keyboard-device frontend driver
[*] Disable serial port drivers
<*> Export Xen attributes in sysfs
(256) Number of guest devices
Xen version compatibility (no compatibility code) --->
[*] Place shared vCPU info in per-CPU storage
Брал информацию с таких источников:
Gentoo-Wiki
pingvin.sumy.ua
Далее
make && make modules_install
cp vmlinux /boot/vmlinux
Ядро у нас есть, теперь нужно подготовить саму ОС:
cat /boot/grub/menu.lst
....
title Gentoo Linux 2.6.34-r4
root (hd0,0)
kernel /boot/vmlinux root=/dev/xvda5
....
Почему xvda5 ? На xgu.ru есть такое:
В конфигурационном файле нужно перейти на использование дисков типа xvda. Для этого нужно изменить название корневой файловой системы (сделать /dev/xvda1), изменить параметр disk в конфигурационном файле домена чтобы в нём использовались имена xvda и изменить /etc/fstab внутри самого домена
А также такие изменения:
# cd /dev
# mknod hvc0 c 229 0
# chown root:tty hvc0
# chmod 600 hvc0
# grep hvc0 /etc/inittab
1h:2345:respawn:/sbin/agetty 38400 hvc0
# grep hvc0 /etc/securetty
hvc0
# cat /etc/fstab
/dev/xvda1 /boot ext3 noauto,noatime 1 2
/dev/xvda5 / ext4 noatime 0 1
/dev/xvda6 none swap sw 0 0
Источник
Готово, систему мы подготовили. Приступим к сочинению конфига.
Так как мы будем использовать pv_ops, то нет необходимости указывать какое ядро грузить, а просто передаем управление pygrub
Вот такой конфиг получится в итоге(немного почистил от лишнего):
cat /etc/xen/config/gentoo_new
bootloader = '/usr/bin/pygrub'
memory = '256'
vcpus=1
disk = [ 'phy:/dev/virtuals/gentoo,xvda,w' ]
root="root=/dev/xvda5 ro console=hvc0"
name = 'gentoo-new'
vif = [ 'mac=00:16:3e:00:00:11, bridge=eth0' ]
boot='c'
vnc=1
vncconsole=0
vncdisplay=30
sdl=0
pae=1
acpi=1
apic=1
on_poweroff = 'destroy'
on_reboot = 'restart'
on_crash = 'destroy'
Запускаем наш домен:
xm create gentoo_new
Подключаемся к консоли:
xm console gentoo-new
И наблюдаем как грузится ОС
To be continued....