igor@0: \section{Linux в Xen} igor@0: igor@0: На этой странице описана процедура подготовки igor@0: гостевой системы под управлением Linux igor@0: для работы в качестве пользовательского домена Xen igor@0: (domain U). igor@0: igor@0: \subsection{Начальные требования} igor@0: igor@0: digraph G \{ igor@0: \begin{verbatim} igor@0: node [shape=rectangle]; igor@0: a [label="Подготовка\nдомена 0"]; igor@0: b [label="Подготовка\nдомена U",bgcolor=cyan,style=filled]; igor@0: c [label="Запуск и эксплуатация\nсистемы"]; igor@0: a -> b; igor@0: b -> c; igor@0: \end{verbatim} igor@0: \} igor@0: igor@0: igor@0: Для выполнение описанных ниже действий igor@0: необходимо наличие проинсталлированной и настроенной igor@0: хост-системы Xen (домена 0). igor@0: Как это сделать описано на странице Инсталляция Xen. igor@0: igor@0: Предполагается, что в домене 0 установлен Debian GNU/Linux. igor@0: Для других дистрибутивов некоторые действия будут выполняться igor@0: иначе. igor@0: igor@0: \subsection{Подготовка образа гостевой системы} igor@0: \subsubsection{Подготовка дисковых разделов для использования в качестве дисков виртуальной машины} igor@0: Для того чтобы разделы виртуальной машины igor@0: соответствовали дисковым разделам реальной машины, igor@0: используйте следующие шаги: igor@0: igor@0: \begin{verbatim} igor@0: node [shape=rectangle]; igor@0: a [label="Подготовка\nдомена 0"]; igor@0: b [label="Подготовка\nдомена U",bgcolor=cyan,style=filled]; igor@0: c [label="Запуск и эксплуатация\nсистемы"]; igor@0: a -> b; igor@0: b -> c; igor@0: \end{verbatim} igor@0: igor@0: В том случае, если в виртуальной машине должно быть igor@0: несколько дисковых разделов, igor@0: подготовьте их. igor@0: Например, для /usr: igor@0: igor@0: \begin{verbatim} igor@0: node [shape=rectangle]; igor@0: a [label="Подготовка\nдомена 0"]; igor@0: b [label="Подготовка\nдомена U"]; igor@0: c [label="Запуск и эксплуатация\nсистемы",bgcolor=cyan,style=filled]; igor@0: a -> b; igor@0: b -> c; igor@0: \end{verbatim} igor@0: igor@0: Если вам необходимо пространство подкачки (swap) в виртуальной машине, igor@0: подготовьте его с помощью команды mkswap: igor@0: igor@0: \begin{verbatim} igor@0: # mkswap /dev/hdX igor@0: \end{verbatim} igor@0: igor@0: \subsubsection{Подготовка файлов для использования в качестве диска виртуальной машины} igor@0: Создайте файл для использования в качестве основного igor@0: диска виртуальной машины. igor@0: igor@0: \begin{verbatim} igor@0: # dd if=/dev/zero of=/xen/images/debian-host1.img bs=1M count= igor@0: # mkfs.ext3 /xen/images/debian-host1.img igor@0: # mount -o loop /srv/debian-host1.img /mnt igor@0: \end{verbatim} igor@0: igor@0: В том случае, если в виртуальной машине должно быть igor@0: несколько дисковых разделов, igor@0: подготовьте их. igor@0: Например, для /usr: igor@0: igor@0: \begin{verbatim} igor@0: # dd if=/dev/zero of=/xen/images/debian-host1-usr.img bs=1M count= igor@0: # mkfs.ext3 /xen/images/debian-host1-usr.img igor@0: # mkdir /mnt/usr igor@0: # mount -o loop /xen/images/debian-host1-usr.img /mnt/usr igor@0: \end{verbatim} igor@0: igor@0: Если вам необходимо пространство подкачки (swap) в виртуальной машине, igor@0: подготовьте его с помощью команды mkswap: igor@0: igor@0: \begin{verbatim} igor@0: # mkswap /dev/hdX igor@0: \end{verbatim} igor@0: igor@0: \subsubsection{Подготовка виртуальной системы под управлением Debian GNU/Linux} igor@0: igor@0: \paragraph{Инсталляция ОС Debian GNU/Linux} igor@0: Этот этап может быть выполнен проще, igor@0: если использовать xen-tools. igor@0: Ниже показано, как провести инсталляцию igor@0: системы вручную. igor@0: igor@0: Смотрите таже \url{http://www.debuntu.org/2006/05/14/51-how-to-installing-debian-etch-from-a-running-debian-based-system/1/}. igor@0: igor@0: Запустите \textbf{debootstrap} для инсталляция базы igor@0: системы: igor@0: igor@0: \begin{verbatim} igor@0: # debootstrap sarge /mnt http://debian.org.ua/debian igor@0: \end{verbatim} igor@0: igor@0: Скопируйте пакет ядром для работы с Xen, igor@0: который был подготовлен ранее, igor@0: в новую виртуальную машину: igor@0: igor@0: \begin{verbatim} igor@0: # cp linux-xen0-2.6.16-xen_10.00.Custom_i386.deb /mnt/root igor@0: \end{verbatim} igor@0: igor@0: Сделайте новую файловую систему корневой (с помощью chroot): igor@0: igor@0: \begin{verbatim} igor@0: # chroot /mnt /bin/bash igor@0: \end{verbatim} igor@0: igor@0: Проинсталлируйте пакет с ранее подготовленным igor@0: ядро Xen: igor@0: igor@0: \begin{verbatim} igor@0: # dpkg -i /root/linux-xen0-2.6.16-xen_10.00.Custom_i386.deb igor@0: \end{verbatim} igor@0: igor@0: Измените запись, соответствующую корневой системе в файле /etc/fstab: igor@0: igor@0: \begin{verbatim} igor@0: # vi /etc/fstab igor@0: /dev/hda1 / ext3 defaults,errors=remount-ro 0 1 igor@0: \end{verbatim} igor@0: igor@0: Если используется несколько дисковых разделов igor@0: в виртуальной машине, перечислите их: igor@0: igor@0: \begin{verbatim} igor@0: /dev/hda2 /usr ext3 defaults 0 2 igor@0: /dev/hda3 /var ext3 defaults 0 2 igor@0: ... igor@0: \end{verbatim} igor@0: igor@0: Запустите программу \textbf{base-config} для установки базовой igor@0: системы Debian. igor@0: igor@0: \begin{verbatim} igor@0: # base-config new igor@0: \end{verbatim} igor@0: igor@0: Измените конфигурацию сети в виртуальной машине: igor@0: igor@0: \begin{verbatim} igor@0: # vi /etc/network/interfaces igor@0: # vi /etc/resolv.conf igor@0: # vi /etc/hosts igor@0: \end{verbatim} igor@0: igor@0: Отключите использование TLS, igor@0: в противном случае работа системы может сильно замедлиться. igor@0: igor@0: \begin{verbatim} igor@0: # mv /lib/tls /lib/tls.disabled igor@0: \end{verbatim} igor@0: igor@0: В том случае, если используется дистрибутив Etch, igor@0: проинсталлируйте \texttt{libc6-xen}. igor@0: igor@0: \begin{verbatim} igor@0: # apt-get install libc6-xen igor@0: \end{verbatim} igor@0: igor@0: Отключите лишние терминалы getty, igor@0: а первый терминал направьте на файл \texttt{/dev/console} igor@0: вместо \texttt{/dev/tty1}: igor@0: igor@0: \begin{verbatim} igor@0: 1:2345:respawn:/sbin/getty 38400 /dev/console igor@0: #2:23:respawn:/sbin/getty 38400 tty2 igor@0: #3:23:respawn:/sbin/getty 38400 tty3 igor@0: #4:23:respawn:/sbin/getty 38400 tty4 igor@0: #5:23:respawn:/sbin/getty 38400 tty5 igor@0: #6:23:respawn:/sbin/getty 38400 tty6 igor@0: \end{verbatim} igor@0: igor@0: Если в виртуальной машине будут загружаться модули ядра, igor@0: установить пакет \texttt{module-init-tools} igor@0: (обязательно для ядер 2.6 domU). igor@0: igor@0: \begin{verbatim} igor@0: # apt-get install module-init-tools igor@0: \end{verbatim} igor@0: igor@0: На этом инсталляция ОС в виртуальной машине завершена, igor@0: и можно завершить работу оболочки с изменённой корневой системой (chrooted shell). igor@0: igor@0: \begin{verbatim} igor@0: # exit igor@0: \end{verbatim} igor@0: igor@0: Если вы создавали несколько разделов в виртуальной машине, igor@0: размонтируйте их, начиная с самой глубокой. igor@0: igor@0: \begin{verbatim} igor@0: # umount /mnt/usr igor@0: # umount /mnt/var igor@0: \end{verbatim} igor@0: igor@0: После чего размонтируйте корневую файловую систему igor@0: виртуальной машины. igor@0: igor@0: \begin{verbatim} igor@0: # umount /mnt igor@0: \end{verbatim} igor@0: igor@0: \paragraph{Конфигурирование виртуальной машины} igor@0: Необходимо создать конфигурационный файл виртуальной igor@0: машины. igor@0: Пусть виртуальная машина называется debian-vm0. igor@0: igor@0: \begin{verbatim} igor@0: # vi /etc/xen/debian-vm0 igor@0: # Kernel to use igor@0: kernel = "/boot/xen0-linux-2.6.16-xen" igor@0: # Memory in megabytes igor@0: memory = 128 igor@0: # Your domain's name igor@0: name = "debian-vm0" igor@0: # Root device igor@0: root = "/dev/hda1 ro" igor@0: # Don't forget to specify your bridge correctly here igor@0: vif = [ 'mac=aa:00:00:00:00:d2, bridge=br-xen' ] igor@0: \end{verbatim} igor@0: igor@0: В том случае, если использует физический дисковый раздел: igor@0: igor@0: \begin{verbatim} igor@0: disk = [ 'phy:/dev/hdX,hda1,w' ] igor@0: \end{verbatim} igor@0: igor@0: В том случае, если используется несколько разделов: igor@0: igor@0: \begin{verbatim} igor@0: disk = [ 'phy:/dev/hdX,hda1,w', 'phy:/dev/hdY,hda2,w' ] igor@0: \end{verbatim} igor@0: igor@0: Если вместо раздела используется файл, igor@0: конфигурация дисковой подсистемы выглядит так: igor@0: igor@0: \begin{verbatim} igor@0: disk = [ 'file:/xen/images/debian-host1.img,hda1,w' ] igor@0: \end{verbatim} igor@0: igor@0: В том случае, если используется несколько файлов, igor@0: строка должна выглядеть так: igor@0: igor@0: \begin{verbatim} igor@0: disk = [ 'file:/xen/images/debian-host1.img,hda1,w', 'file:/xen/images/debian-host1-usr.img,hda2,w' ] igor@0: \end{verbatim} igor@0: igor@0: Обратите внимание на то, чтобы записи о диска в конфигурации igor@0: виртуальной машины соответствовали файлу \texttt{/etc/fstab} igor@0: операционной системы этой машины. igor@0: igor@0: \subsubsection{Инсталляция и настройка Fedora Core в domU} igor@0: igor@0: При условии, что домен 0 работает под управлением Debian GNU/Linux, igor@0: а образ гостевой системы подмонтирован в каталог /mnt, igor@0: процедура инсталляции выглядит следующим образом: igor@0: igor@0: \begin{verbatim} igor@0: %# apt-get install yum igor@0: %# yum -c /tmp/yum-xen.conf --installroot=/mnt -y groupinstall Base igor@0: \end{verbatim} igor@0: igor@0: Пример конфигурационного файла \texttt{yum-xen.conf} (вы можете использовать другой репозиторий и другой уровень отладки): igor@0: igor@0: \begin{verbatim} igor@0: [main] igor@0: cachedir=/var/cache/yum igor@0: debuglevel=2 igor@0: logfile=/var/log/yum.log igor@0: exclude=*-debuginfo igor@0: gpgcheck=0 igor@0: obsoletes=1 igor@0: reposdir=/dev/null igor@0: igor@0: [base] igor@0: name=Fedora Core 6 - i386 - Base igor@0: #mirrorlist=http://fedora.redhat.com/download/mirrors/fedora-core-6 igor@0: baseurl=http://redhat.download.fedoraproject.org/pub/fedora/linux/core/6/i386/os/ igor@0: enabled=1 igor@0: igor@0: [updates-released] igor@0: name=Fedora Core 6 - i386 - Released Updates igor@0: #mirrorlist=http://fedora.redhat.com/download/mirrors/updates-released-fc6 igor@0: baseurl=http://redhat.download.fedoraproject.org/pub/fedora/linux/core/updates/6/i386/ igor@0: enabled=1 igor@0: \end{verbatim} igor@0: igor@0: Если при инсталляции вы получаете ошибку igor@0: igor@0: \begin{verbatim} igor@0: Failed to add groups file for repository: base igor@0: Error: No Groups on which to run command igor@0: \end{verbatim} igor@0: igor@0: то модифицируйте код \textit{yum} следующим образом: igor@0: igor@0: \begin{verbatim} igor@0: # cp /usr/share/python-support/yum/yum/comps.py{,.ORIG} igor@0: # vi /usr/share/python-support/yum/yum/comps.py igor@0: # diff /usr/share/python-support/yum/yum/comps.py{.ORIG,} igor@0: 124c124 igor@0: < if type not in ('mandatory', 'default', 'optional'): igor@0: --- igor@0: > if type not in ('mandatory', 'default', 'optional', 'conditional'): igor@0: 143c143 igor@0: < if type not in ('mandatory', 'default', 'optional'): igor@0: --- igor@0: > if type not in ('mandatory', 'default', 'optional', 'conditional'): igor@0: \end{verbatim} igor@0: igor@0: Установленную систему можно доработать. igor@0: igor@0: \textit{Создать некоторые каталоги и файлы устройств.} igor@0: igor@0: \begin{verbatim} igor@0: %# mkdir /mnt/{dev,proc,etc} igor@0: %# for i in console null zero ; do /sbin/MAKEDEV -d /mnt/dev -x $i ; done igor@0: \end{verbatim} igor@0: igor@0: \textit{Отключить TLS}. igor@0: igor@0: \begin{verbatim} igor@0: %# mv /mnt/lib/tls /mnt/lib/tls-disabled igor@0: \end{verbatim} igor@0: igor@0: \textit{Создать /etc/fstab} igor@0: igor@0: \begin{verbatim} igor@0: %# cat < /mnt/etc/fstab igor@0: /dev/sda1 / ext3 defaults 1 1 igor@0: none /dev/pts devpts gid=5,mode=620 0 0 igor@0: none /dev/shm tmpfs defaults 0 0 igor@0: none /proc proc defaults 0 0 igor@0: none /sys sysfs defaults 0 0 igor@0: /dev/sda2 /mnt ext3 defaults 1 2 igor@0: /dev/sda3 swap swap defaults 0 0 igor@0: EOL igor@0: \end{verbatim} igor@0: igor@0: \textit{Настроить сетевые интерфейсы}. igor@0: igor@0: \begin{verbatim} igor@0: %# cat < /mnt/etc/sysconfig/network igor@0: NETWORKING=yes igor@0: HOSTNAME=localhost.localdomain igor@0: EOL igor@0: igor@0: cat < /mnt/etc/sysconfig/network-scripts/ifcfg-eth0 igor@0: ONBOOT=yes igor@0: DEVICE=eth0 igor@0: BOOTPROTO=dhcp igor@0: EOL igor@0: \end{verbatim} igor@0: igor@0: \textit{Скопировать модули ядра} igor@0: igor@0: \begin{verbatim} igor@0: %# cp -R /lib/modules/2.6.*xen* /mnt/lib/modules/ igor@0: \end{verbatim} igor@0: igor@0: \textit{Установить пароль root\rq{}а} igor@0: igor@0: \begin{verbatim} igor@0: %$ sudo chroot /mnt igor@0: bash-3.1# pwconv igor@0: bash-3.1# passwd igor@0: Changing password for user root. igor@0: New UNIX password: igor@0: Retype new UNIX password: igor@0: passwd: all authentication tokens updated successfully. igor@0: bash-3.1# exit igor@0: \end{verbatim} igor@0: igor@0: \textit{Отключить сообщения об ошибках ядра на консоль} (не обязательно) igor@0: igor@0: \begin{verbatim} igor@0: igor@0: \end{verbatim} igor@0: igor@0: После того как инсталляция закончена, igor@0: можно попробовать запустить домен. igor@0: igor@0: \begin{verbatim} igor@0: %# umount /mnt igor@0: %# xm console -c fc igor@0: \end{verbatim} igor@0: igor@0: (здесь \textit{fc} это конфигурационный файл домена). igor@0: igor@0: \begin{center} \resizebox{10cm}{!}{\includegraphics{/var/lib/mediawiki/images/9/90/Fc-in-xen.png}}\\ \textit{}\end{center} igor@0: igor@0: \subsubsection{Инсталляция и настройка других дистрибутивов Linux в domU} igor@0: \begin{itemize} igor@0: \item Centos5 — описание процедуры подготовки domU для Centos5 igor@0: \end{itemize} igor@0: igor@0: \subsubsection{Инсталляция Debian из-под других дистрибутивов Linux} igor@0: igor@0: \begin{verbatim} igor@0: %# wget http://ftp.de.debian.org/debian/pool/main/d/debootstrap/debootstrap-udeb_0.3.3_i386.udeb igor@0: %# ar t debootstrap-udeb_0.3.3_i386.udeb igor@0: %# mkdir debootstrap igor@0: %# cd debootstrap igor@0: %# tar xvzf ../data.tar.gz igor@0: \end{verbatim} igor@0: igor@0: После этого инсталляция с помощью \textit{./deboostrap} выполняется как обычно. igor@0: igor@0: \subsection{Запуск виртуальной машины} igor@0: igor@0: digraph G \{ igor@0: \begin{verbatim} igor@0: node [shape=rectangle]; igor@0: a [label="Подготовка\nдомена 0"]; igor@0: b [label="Подготовка\nдомена U"]; igor@0: c [label="Запуск и эксплуатация\nсистемы",bgcolor=cyan,style=filled]; igor@0: a -> b; igor@0: b -> c; igor@0: \end{verbatim} igor@0: \} igor@0: igor@0: igor@0: \begin{verbatim} igor@0: # xm create -c debian-vm0 igor@0: \end{verbatim} igor@0: igor@0: Данная команда запустит новую виртуальную машину и создаст igor@0: подключенную к ней консоль (ключ -c). igor@0: Можно войти в систему от имени пользователя igor@0: root и настроить сетевой интерфейс eth0. igor@0: igor@0: Обратите внимание на то, что на консоли (\texttt{/dev/console}) igor@0: по умолчанию комбинация клавиш Ctrl-C не настроена igor@0: для прерывания процессов. igor@0: igor@0: Отключиться от консоли виртуальной машины вернуться в igor@0: терминал, из которого выполнялось подключение/запуск, igor@0: можно с помощью комбинации Ctrl-]. igor@0: igor@0: Вернуться на отключенную консоль igor@0: можно с помощью команды: igor@0: igor@0: \begin{verbatim} igor@0: # xm console debian-vm0 igor@0: \end{verbatim} igor@0: igor@0: Остановить домен можно командой: igor@0: igor@0: \begin{verbatim} igor@0: # xm shutdown -H debian-vm0 igor@0: \end{verbatim} igor@0: igor@0: Выключить домен (как будто бы вырубить виртуальную машину igor@0: по питанию), можно с помощью команды: igor@0: igor@0: \begin{verbatim} igor@0: # xm destroy debian-vm0 igor@0: \end{verbatim} igor@0: igor@0: Для получения полного списка команд, таких как shutdown, destroy igor@0: и т.д. введите: igor@0: igor@0: \begin{verbatim} igor@0: # xm help igor@0: \end{verbatim} igor@0: igor@0: Для того чтобы виртуальная машина (domU) загружалась автоматически, igor@0: когда загружает основная система (dom0), igor@0: необходимо сделать ссылку на igor@0: конфигурационный файл виртуальной машины: igor@0: igor@0: \begin{verbatim} igor@0: # ln -s /etc/xen/auto/ igor@0: \end{verbatim} igor@0: igor@0: \subsection{Дополнительные вопросы} igor@0: \subsubsection{Сборка ядра Linux под Xen в Debian} igor@0:
\textit{Основная страница: \textbf{Сборка ядра Linux под Xen в Debian}} igor@0:
igor@0: igor@0: Ядро Linux, с поддержкой Xen, находящееся в репозитории Debian GNU/Linux igor@0: собрано с поддержкой PAE. igor@0: С другой стороны, большое количество систем (FreeBSD, NetBSD, Plan 9 и др.), работающих как гостевые системы в паравиртуальном домене Xen igor@0: не поддерживают PAE. igor@0: В этом случае потребуется пересобрать ядро домена 0 igor@0: без поддержки PAE. igor@0: Пересборка ядра может потребоваться и в других случаях. igor@0: igor@0: \subsection{Возможные проблемы при подготовке и запуске} igor@0: Множество проблем, с которыми можно столкнуться igor@0: при подготовке и запуске гостевой системы Xen, igor@0: описано на странице Xen FAQ. igor@0: igor@0: \subsubsection{Возможные проблемы с udev} igor@0: При старте домена может возникнуть такая проблема: igor@0: домен не стартует, на экран выдаётся сообщение igor@0: об ошибке: igor@0: igor@0: \begin{verbatim} igor@0: Device 768 (vbd) could not be connected. Hotplug scripts not working. igor@0: \end{verbatim} igor@0: igor@0: \textit{Номер устройства (768) может отличаться.} igor@0: igor@0: Если такая проблема возникла, причём она не пропадает igor@0: ни при отключении сетевых интерфейсов в виртуальной машине; igor@0: ни при изменении конфигурации дисков, проблема может быть связана с \textbf{udev}. igor@0: igor@0: Убедитесь, что udev достаточно новый. igor@0: Последние версии udev находятся здесь: http://kernel.org/pub/linux/utils/kernel/hotplug/ igor@0: igor@0: Проверьте, есть ли в конфигурации udev правила xen. igor@0: igor@0: Если нет, нужно их добавить. igor@0: Нужно создать файл \texttt{xen-backend.rules} igor@0: в каталоге \texttt{/etc/udev/rules.d} следующего содержания: igor@0: igor@0: \begin{verbatim} igor@0: # cat /etc/udev/rules.d/xen-backend.rules igor@0: SUBSYSTEM=="xen-backend", KERNEL=="tap*", RUN+="/etc/xen/scripts/blktap $env{ACTION}" igor@0: SUBSYSTEM=="xen-backend", KERNEL=="vbd*", RUN+="/etc/xen/scripts/block $env{ACTION}" igor@0: SUBSYSTEM=="xen-backend", KERNEL=="vtpm*", RUN+="/etc/xen/scripts/vtpm $env{ACTION}" igor@0: SUBSYSTEM=="xen-backend", KERNEL=="vif*", ACTION=="online", RUN+="$env{script} online" igor@0: SUBSYSTEM=="xen-backend", KERNEL=="vif*", ACTION=="offline", RUN+="$env{script} offline" igor@0: SUBSYSTEM=="xen-backend", ACTION=="remove", RUN+="/etc/xen/scripts/xen-hotplug-cleanup" igor@0: KERNEL=="evtchn", NAME="xen/%k" igor@0: \end{verbatim} igor@0: igor@0: Если такой файл \texttt{xen-backend.rules} уже есть, igor@0: можно переименовать его или создать символическую ссылку, igor@0: содержащую номер в названии. Правило должно грузиться предпоследним. igor@0: igor@0: \begin{verbatim} igor@0: # cd /etc/udev/rules.d igor@0: # mv xen-backend.rules 92-xen-backend.rules igor@0: \end{verbatim} igor@0: igor@0: После этого нужно перезапустить udev и попробовать igor@0: стартануть домен снова. igor@0: igor@0: \begin{verbatim} igor@0: # ps aux | grep udev igor@0: root 3321 0.0 0.2 1768 516 ? S