Linux в Xen
Материал из Xgu.ru
- Короткий URL: xen/linux
На этой странице описана процедура подготовки гостевой системы под управлением Linux для работы в качестве пользовательского домена Xen (domain U).
[править] Начальные требования
Для выполнение описанных ниже действий необходимо наличие проинсталлированной и настроенной хост-системы Xen (домена 0). Как это сделать описано на странице Инсталляция Xen.
Предполагается, что в домене 0 установлен Debian GNU/Linux. Для других дистрибутивов некоторые действия будут выполняться иначе.
[править] Подготовка образа гостевой системы
[править] Подготовка дисковых разделов для использования в качестве дисков виртуальной машины
Для того чтобы разделы виртуальной машины соответствовали дисковым разделам реальной машины, используйте следующие шаги:
# mkfs.ext3 /dev/hdX # mount /dev/hdX /mnt
В том случае, если в виртуальной машине должно быть несколько дисковых разделов, подготовьте их. Например, для /usr:
# mkfs.ext3 /dev/hdY # mkdir /mnt/usr # mount /dev/hdY /mnt/usr
Если вам необходимо пространство подкачки (swap) в виртуальной машине, подготовьте его с помощью команды mkswap:
# mkswap /dev/hdX
[править] Подготовка файлов для использования в качестве диска виртуальной машины
Создайте файл для использования в качестве основного диска виртуальной машины.
%# dd if=/dev/zero of=/xen/images/debian-host1.img bs=1M count=<size_in_MB> %# mkfs.ext3 /xen/images/debian-host1.img %# mount -o loop /xen/images/debian-host1.img /mnt
Или, если вы используете LVM:
%# lvcreate -L <size_in_MB>M -n debian-host1 /dev/TURBO %# mkfs.ext3 /dev/TURBO/debian-host1 %# mount /dev/TURBO/debian-host1 /mnt
(группа томов TURBO или группа с другим названием, которое вы используете, должна существовать и иметь достаточно места; подробнее: LVM).
В том случае, если в виртуальной машине должно быть несколько дисковых разделов, подготовьте их. Например, для /usr:
# dd if=/dev/zero of=/xen/images/debian-host1-usr.img bs=1M count=<size_in_MB> # mkfs.ext3 /xen/images/debian-host1-usr.img # mkdir /mnt/usr # mount -o loop /xen/images/debian-host1-usr.img /mnt/usr
Если вам необходимо пространство подкачки (swap) в виртуальной машине, подготовьте его с помощью команды mkswap:
# mkswap /dev/hdX
[править] Подготовка виртуальной системы под управлением Debian GNU/Linux
Здесь описывается как подготовить образ гостевого домена Xen,в котором будет работать Debian GNU/Linux. Обязательно стоит прочитать ещё Xen Debian Wiki. |
[править] Инсталляция ОС Debian GNU/Linux
Этот этап может быть выполнен проще, если использовать xen-tools. Ниже показано, как провести инсталляцию системы вручную.
Смотрите также [1].
Запустите debootstrap для инсталляция базы системы:
# debootstrap sarge /mnt http://debian.org.ua/debian
Скопируйте пакет ядром для работы с Xen, который был подготовлен ранее, в новую виртуальную машину:
# cp linux-xen0-2.6.16-xen_10.00.Custom_i386.deb /mnt/root
Сделайте новую файловую систему корневой (с помощью chroot):
# chroot /mnt /bin/bash
Проинсталлируйте пакет с ранее подготовленным ядро Xen:
# dpkg -i /root/linux-xen0-2.6.16-xen_10.00.Custom_i386.deb
Измените запись, соответствующую корневой системе в файле /etc/fstab:
# vi /etc/fstab /dev/hda1 / ext3 defaults,errors=remount-ro 0 1
Если используется несколько дисковых разделов в виртуальной машине, перечислите их:
/dev/hda2 /usr ext3 defaults 0 2 /dev/hda3 /var ext3 defaults 0 2 ...
Запустите программу base-config для установки базовой системы Debian.
# base-config new
Измените конфигурацию сети в виртуальной машине:
# vi /etc/network/interfaces # vi /etc/resolv.conf # vi /etc/hosts
Отключите использование TLS, в противном случае работа системы может сильно замедлиться.
# mv /lib/tls /lib/tls.disabled
В том случае, если используется дистрибутив Etch, проинсталлируйте libc6-xen.
# apt-get install libc6-xen
Отключите лишние терминалы getty, а первый терминал направьте на файл /dev/console вместо /dev/tty1: (файл /etc/inittab)
1:2345:respawn:/sbin/getty 38400 /dev/console #2:23:respawn:/sbin/getty 38400 tty2 #3:23:respawn:/sbin/getty 38400 tty3 #4:23:respawn:/sbin/getty 38400 tty4 #5:23:respawn:/sbin/getty 38400 tty5 #6:23:respawn:/sbin/getty 38400 tty6
Если в виртуальной машине будут загружаться модули ядра, установить пакет module-init-tools (обязательно для ядер 2.6 domU).
# apt-get install module-init-tools
На этом инсталляция ОС в виртуальной машине завершена, и можно завершить работу оболочки с изменённой корневой системой (chrooted shell).
# exit
Если вы создавали несколько разделов в виртуальной машине, размонтируйте их, начиная с самой глубокой.
# umount /mnt/usr # umount /mnt/var
После чего размонтируйте корневую файловую систему виртуальной машины.
# umount /mnt
[править] Конфигурирование виртуальной машины
Необходимо создать конфигурационный файл виртуальной машины. Пусть виртуальная машина называется debian-vm0.
# vi /etc/xen/debian-vm0 # Kernel to use kernel = "/boot/xen0-linux-2.6.16-xen" # Memory in megabytes memory = 128 # Your domain's name name = "debian-vm0" # Root device root = "/dev/hda1 ro" # Don't forget to specify your bridge correctly here vif = [ 'mac=aa:00:00:00:00:d2, bridge=br-xen' ]
В том случае, если использует физический дисковый раздел:
disk = [ 'phy:/dev/hdX,hda1,w' ]
В том случае, если используется несколько разделов:
disk = [ 'phy:/dev/hdX,hda1,w', 'phy:/dev/hdY,hda2,w' ]
Если вместо раздела используется файл, конфигурация дисковой подсистемы выглядит так:
disk = [ 'file:/xen/images/debian-host1.img,hda1,w' ]
В том случае, если используется несколько файлов, строка должна выглядеть так:
disk = [ 'file:/xen/images/debian-host1.img,hda1,w', 'file:/xen/images/debian-host1-usr.img,hda2,w' ]
Обратите внимание на то, чтобы записи о дисках в конфигурации виртуальной машины соответствовали файлу /etc/fstab операционной системы этой машины.
[править] Инсталляция и настройка Fedora Core в domU
Здесь описывается как подготовить образ гостевого домена Xen,в котором будет работать Fedora Core 6. |
При условии, что домен 0 работает под управлением Debian GNU/Linux, а образ гостевой системы подмонтирован в каталог /mnt, процедура инсталляции выглядит следующим образом:
%# apt-get install yum %# yum -c /tmp/yum-xen.conf --installroot=/mnt -y groupinstall Base
Пример конфигурационного файла yum-xen.conf (вы можете использовать другой репозиторий и другой уровень отладки):
[main] cachedir=/var/cache/yum debuglevel=2 logfile=/var/log/yum.log exclude=*-debuginfo gpgcheck=0 obsoletes=1 reposdir=/dev/null [base] name=Fedora Core 6 - i386 - Base #mirrorlist=http://fedora.redhat.com/download/mirrors/fedora-core-6 baseurl=http://redhat.download.fedoraproject.org/pub/fedora/linux/core/6/i386/os/ enabled=1 [updates-released] name=Fedora Core 6 - i386 - Released Updates #mirrorlist=http://fedora.redhat.com/download/mirrors/updates-released-fc6 baseurl=http://redhat.download.fedoraproject.org/pub/fedora/linux/core/updates/6/i386/ enabled=1
Если при инсталляции вы получаете ошибку
Failed to add groups file for repository: base Error: No Groups on which to run command
то модифицируйте код yum следующим образом:
# cp /usr/share/python-support/yum/yum/comps.py{,.ORIG} # vi /usr/share/python-support/yum/yum/comps.py # diff /usr/share/python-support/yum/yum/comps.py{.ORIG,} 124c124 < if type not in ('mandatory', 'default', 'optional'): --- > if type not in ('mandatory', 'default', 'optional', 'conditional'): 143c143 < if type not in ('mandatory', 'default', 'optional'): --- > if type not in ('mandatory', 'default', 'optional', 'conditional'):
Установленную систему можно доработать.
Создать некоторые каталоги и файлы устройств.
%# mkdir /mnt/{dev,proc,etc} %# for i in console null zero ; do /sbin/MAKEDEV -d /mnt/dev -x $i ; done
Отключить TLS.
%# mv /mnt/lib/tls /mnt/lib/tls-disabled
Создать /etc/fstab
%# cat <<EOL > /mnt/etc/fstab /dev/sda1 / ext3 defaults 1 1 none /dev/pts devpts gid=5,mode=620 0 0 none /dev/shm tmpfs defaults 0 0 none /proc proc defaults 0 0 none /sys sysfs defaults 0 0 /dev/sda2 /mnt ext3 defaults 1 2 /dev/sda3 swap swap defaults 0 0 EOL
Настроить сетевые интерфейсы.
%# cat <<EOL > /mnt/etc/sysconfig/network NETWORKING=yes HOSTNAME=localhost.localdomain EOL cat <<EOL > /mnt/etc/sysconfig/network-scripts/ifcfg-eth0 ONBOOT=yes DEVICE=eth0 BOOTPROTO=dhcp EOL
Скопировать модули ядра
%# cp -R /lib/modules/2.6.*xen* /mnt/lib/modules/
Установить пароль root'а
%$ sudo chroot /mnt bash-3.1# pwconv bash-3.1# passwd Changing password for user root. New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully. bash-3.1# exit
Отключить сообщения об ошибках ядра на консоль (не обязательно)
Для загрузки ядра вы можете использовть ядро, которое используется в хост-системе, или воспользоваться ядром предлагаемым в дистрибутиве гостевой системы. Если использовать ядро Fedora (CentOS/RHEL), может понадобиться выполнить пересборку initrd:
mkinitrd /boot/initrd-2.6.18-8.el5xenU.img 2.6.18-8.el5xen --fstab /mnt/etc/fstab --with xenblk --with xennet --preload xenblk --preload xennet
После того как инсталляция закончена, можно попробовать запустить домен.
%# umount /mnt %# xm console -c fc
(здесь fc это конфигурационный файл домена).
[править] Инсталляция и настройка других дистрибутивов Linux в domU
- Centos5 — описание процедуры подготовки domU для Centos5
- http://www.gitco.de/repo/xen3.3.1/ — подборка пакетов, имеющих отношение к Xen, для CentOS
[править] Инсталляция Debian из-под других дистрибутивов Linux
%# wget http://ftp.de.debian.org/debian/pool/main/d/debootstrap/debootstrap-udeb_0.3.3_i386.udeb %# ar x debootstrap-udeb_0.3.3_i386.udeb %# mkdir debootstrap %# cd debootstrap %# tar xvzf ../data.tar.gz
После этого инсталляция с помощью ./debootstrap выполняется как обычно.
[править] Запуск виртуальной машины
# xm create -c debian-vm0
Данная команда запустит новую виртуальную машину и создаст подключенную к ней консоль (ключ -c). Можно войти в систему от имени пользователя root и настроить сетевой интерфейс eth0.
Обратите внимание на то, что на консоли (/dev/console) по умолчанию комбинация клавиш Ctrl-C не настроена для прерывания процессов.
Отключиться от консоли виртуальной машины вернуться в терминал, из которого выполнялось подключение/запуск, можно с помощью комбинации Ctrl-].
Вернуться на отключенную консоль можно с помощью команды:
# xm console debian-vm0
Остановить домен можно командой:
# xm shutdown -H debian-vm0
Выключить домен (как будто бы вырубить виртуальную машину по питанию), можно с помощью команды:
# xm destroy debian-vm0
Для получения полного списка команд, таких как shutdown, destroy и т.д. введите:
# xm help
Для того чтобы виртуальная машина (domU) загружалась автоматически, когда загружает основная система (dom0), необходимо сделать ссылку на конфигурационный файл виртуальной машины:
# ln -s <configfile> /etc/xen/auto/
[править] Дополнительные вопросы
[править] Сборка ядра Linux под Xen в Debian
- Основная страница: Сборка ядра Linux под Xen в Debian
Ядро Linux, с поддержкой Xen, находящееся в репозитории Debian GNU/Linux собрано с поддержкой PAE. С другой стороны, большое количество систем (NetBSD, Plan 9 и др.), работающих как гостевые системы в паравиртуальном домене Xen не поддерживают PAE (FreeBSD может быть собрано с поддержкой PAE). В этом случае потребуется пересобрать ядро домена 0 без поддержки PAE. Пересборка ядра может потребоваться и в других случаях.
[править] Использование домена с paravirt_ops
- При подготовке ядра создать модули (или включить в ядро) с драйверами блочных устройств frontend, работающие через paravirt_ops
- В конфигурационном файле домена добавить строчку
console=hvc0
в параметр extra.
- В конфигурационном файле нужно перейти на использование дисков типа xvda. Для этого нужно изменить название корневой файловой системы (сделать /dev/xvda1), изменить параметр disk в конфигурационном файле домена чтобы в нём использовались имена xvda и изменить /etc/fstab внутри самого домена
Пример конфигурационного файла домена:
kernel = "/boot/vmlinuz-2.6.25-2-xen-686" ramdisk = "/boot/initrd.img-2.6.25-2-xen-686" builder='linux' memory = 128 name = "dhcp" vif=[ 'bridge=eth0, mac=00:16:3e:00:01:02' ] disk=[ 'file:/xen/production/dhcp.img,xvda1,w' ] root="root=/dev/xvda1 ro console=hvc0"
Фрагменты файлов внутри домена:
# grep hvc0 /etc/inittab 1h:2345:respawn:/sbin/getty 38400 hvc0 # grep hvc0 /etc/securetty hvc0 # cat /etc/fstab proc /proc proc defaults 0 0 /dev/xvda1 / ext3 defaults,errors=remount-ro 0 1
В Ubuntu вмест правки /etc/inittab нужно создать /etc/init/hvc0.conf с таким содержимым:
start on stopped rc RUNLEVEL=[2345] stop on runlevel [!2345] respawn exec /sbin/getty -8 38400 hvc0
Для ядер в районе 2.6.34 может пригодиться патч [2] (подробнее: [3]).
[править] Ядро с paravirt_ops в домене 0
Если вы используете ядро с paravirt_ops в домене 0.
В /etc/fstab:
xenfs /proc/xen xenfs defaults 0 0
[править] Возможные проблемы при подготовке и запуске
Множество проблем, с которыми можно столкнуться при подготовке и запуске гостевой системы Xen, описано на странице Xen FAQ.
[править] Возможные проблемы с udev
При старте домена может возникнуть такая проблема: домен не стартует, на экран выдаётся сообщение об ошибке:
Device 768 (vbd) could not be connected. Hotplug scripts not working.
Номер устройства (768) может отличаться.
Если такая проблема возникла, причём она не пропадает ни при отключении сетевых интерфейсов в виртуальной машине; ни при изменении конфигурации дисков, проблема может быть связана с udev.
Убедитесь, что udev достаточно новый. Последние версии udev находятся здесь: http://kernel.org/pub/linux/utils/kernel/hotplug/
Проверьте, есть ли в конфигурации udev правила xen.
Если нет, нужно их добавить. Нужно создать файл xen-backend.rules в каталоге /etc/udev/rules.d следующего содержания:
# cat /etc/udev/rules.d/xen-backend.rules SUBSYSTEM=="xen-backend", KERNEL=="tap*", RUN+="/etc/xen/scripts/blktap $env{ACTION}" SUBSYSTEM=="xen-backend", KERNEL=="vbd*", RUN+="/etc/xen/scripts/block $env{ACTION}" SUBSYSTEM=="xen-backend", KERNEL=="vtpm*", RUN+="/etc/xen/scripts/vtpm $env{ACTION}" SUBSYSTEM=="xen-backend", KERNEL=="vif*", ACTION=="online", RUN+="$env{script} online" SUBSYSTEM=="xen-backend", KERNEL=="vif*", ACTION=="offline", RUN+="$env{script} offline" SUBSYSTEM=="xen-backend", ACTION=="remove", RUN+="/etc/xen/scripts/xen-hotplug-cleanup" KERNEL=="evtchn", NAME="xen/%k"
Если такой файл xen-backend.rules уже есть, можно переименовать его или создать символическую ссылку, содержащую номер в названии. Правило должно грузиться предпоследним.
# cd /etc/udev/rules.d # mv xen-backend.rules 92-xen-backend.rules
После этого нужно перезапустить udev и попробовать стартануть домен снова.
# ps aux | grep udev root 3321 0.0 0.2 1768 516 ? S<s 22:51 0:00 udevd --daemon root 9349 0.0 0.2 1860 640 pts/2 S+ 23:27 0:00 grep udev # udevd --daemon # ps aux | grep udev root 9352 0.0 0.2 1768 516 ? S<s 23:28 0:00 udevd --daemon root 9356 0.0 0.2 1860 640 pts/2 S+ 23:29 0:00 grep udev
Ещё возможный вариант (например, на Debian Lenny) -- отсутствие бита исполнения на скриптах Xen, исправляется простым
# chmod a+x /etc/xen/scripts/*
и неправильный в них шебанг #!/bin/sh, либо его отсутствие, исправляется ручным добавлением #!/bin/bash в начало каждого скрипта.
Дополнительные сведения о проблеме: [4]
|
---|