Gentoo Xen 4

Автор | 02.01.2011

Повесть о том как я 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....

Залишити відповідь