(e.g. xvif1.0).
xennet и xvif отображаются как нормальные сетевые устройства, им можно назначить IP адреса и mac адреса или использовать как мост.
Установка NetBSD как domain0
Сперва необходимо установить NetBSD/i386 current или 3.0_BETA
на имеющееся оборудование. Бинарный снимок доступен по адресу ftp://ftp.NetBSD.org/pub/NetBSD/arch/i386/snapshot/.
Разбивая дисковое пространство имейте вииду, что необходимо зарезервировать место и для будущих виртуальных
доменов. Как альтернативу, вы можете хранить файловые системы доменов как файлы и отображать их с помощью vnd(4).
Затем нам необходимо установить пакеты
sysutils/grub и
sysutils/xentools20.
grub необходим для загрузки ядер xen и domain0; xentools20 содержит утилиты для управления xen из domain0.
Затем вам необходимо само ядро Xen 2.0. Вы можете скачать один из бинарных файлов с
http://www.cl.cam.ac.uk/Research/SRG/netos/xen/downloads.html (необходим xen-2.0.x-install.tgz).
Ищем xen.gz и копируем его в корневую файловую систему.
Нам необходимо ядро NetBSD/Xen для domain0 в корневой файловой системе.
Ядро XEN0 поставляется вместе с бинарными файлами i386, но возможно вы захотите настроить его.
На всякий случай сохраните имеющееся ядро NetBSD/i386, чтобы иметь возможность восстановиться в случае неудачи.
Убедитесь, что ядро поддерживает KERNFS и /kern уже примонтирован.
Настраиваем Grub на загрузку ядра xen.gz и NetBSD domain0 в качестве модуля.
В файле конфигурации grub мы можем указать размер выделяемой памяти для domain0, используемую консоль и т.д.
Рассмотрим /grub/menu.lst:
#Grub config file for NetBSD/xen. Copy as /grub/menu.lst and run
# grub-install /dev/rwd0d (assuming your boot device is wd0).
#
# The default entry to load will be the first one
default=0
# boot after 10s the default entry if the user didn't hit keyboard
timeout=10
# Configure serial port to use as console. Ignore if you'll use VGA only
serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1
# Let the user select which console to use (serial or VGA), default
# to serial after 10s
terminal --timeout=10 serial console
# An entry for NetBSD/xen, using /netbsd as the domain0 kernel, and serial
# console. Domain0 will have 64MB RAM allocated.
# Assume NetBSD is installed in the first MBR partition.
title Xen 2.0 / NetBSD (hda0, serial)
root(hd0,0)
kernel (hd0,a)/xen.gz dom0_mem=65536 com1=115200,8n1
module (hd0,a)/netbsd root=/dev/hda1 ro console=ttyS0
# Same as above, but using VGA console
# We can use console=tty0 (Linux syntax) or console=pc (NetBSD syntax)
title Xen 2.0 / NetBSD (hda0, vga)
root(hd0,0)
kernel (hd0,a)/xen.gz dom0_mem=65536
module (hd0,a)/netbsd root=/dev/hda1 ro console=tty0
# NetBSD/xen using a backup domain0 kernel (in case you installed a
# nonworking kernel as /netbsd
title Xen 2.0 / NetBSD (hda0, backup, serial)
root(hd0,0)
kernel (hd0,a)/xen.gz dom0_mem=65536 com1=115200,8n1
module (hd0,a)/netbsd.backup root=/dev/hda1 ro console=ttyS0
title Xen 2.0 / NetBSD (hda0, backup, VGA)
root(hd0,0)
kernel (hd0,a)/xen.gz dom0_mem=65536
module (hd0,a)/netbsd.backup root=/dev/hda1 ro console=tty0
#Load a regular NetBSD/i386 kernel. Can be useful if you end up with a
#nonworking /xen.gz
title NetBSD 2.0
root (hd0,a)
kernel --type=netbsd /netbsd-GENERIC
#Load the NetBSD bootloader, letting it load the NetBSD/i386 kernel.
#May be better than the above, as grub can't pass all required infos
#to the NetBSD/i386 kernel (e.g. console, root device, ...)
title NetBSD chain
root (hd0,0)
chainloader +1
## end of grub config file.
Как только domain0 будет загружет, необходимо запустить xend для управления доменами
(/usr/pkg/share/examples/rc.d/xend start). Перед тем, как сделать это, убедитесь, что
существуют файлы /dev/xencons и /dev/xenevt. Если их нет, То создайте командой:
# cd /dev && sh MAKEDEV xen
xend ведет журналы /var/log/xend.log и /var/log/xend-debug.log.
Основным инструментом контроля служит утилита xm, например просмотреть список доменов можно так:
# xm list
Name Id Mem(MB) CPU State Time(s) Console
Domain-0 0 64 0 r---- 58.1
Обратите внимание, что связь между xend и xm осуществляется через сокет TCP, и xend прослушивает порты
*.8000, *.8001 and *.8002.
Я настоятельно советую вам фильтровать эти порты (с помощью IPF или PF) и принимать соединения только с адреса
127.0.0.1, при этом ограничить число пользователей, которые могут получить доступ к domain0.
Командой 'xm create' создается новый домен. Он будет использовать файл конфигурации, определяемой переменной
PKG_SYSCONFDIR (по умолчанию /usr/pkg/etc/xen/). Ядро домена должно быть установлено в файловую систему
domain0. Подходящее ядро также поставляется в комплекте i386 и называется XENU.
Вот пример конфигурации файла /usr/pkg/etc/xen/nbsd:
# -*- mode: python; -*-
#============================================================================
# Python defaults setup for 'xm create'.
# Edit this file to reflect the configuration of your system.
#============================================================================
#----------------------------------------------------------------------------
# Kernel image file. This kernel will be loaded in the new domain.
kernel = "/home/bouyer/netbsd-XENU"
#kernel = "/home/bouyer/netbsd-INSTALL_XENU"
# Memory allocation (in megabytes) for the new domain.
memory = 128
# A handy name for your new domain. This will appear in 'xm list',
# and you can use this as parameters for xm in place of the domain number.
name = "nbsd"
# Which CPU to start domain on (only relevant for SMP hardware)
cpu = -1 # leave to Xen to pick
#----------------------------------------------------------------------------
# Define network interfaces for the new domain.
# Number of network interfaces. Default is 1.
nics=1
# Optionally define mac and/or bridge for the network interfaces.
# Random MACs are assigned if not given.
# The MAC address specified is the one used for the interface in the new
# domain. The interface in domain0 will use this address xor'd with
# 00:00:00:01:00:00 (i.e. aa:00:00:51:02:f0 in our example)
# bridge is a required parameter, which will be passed to the vif script
# called by xend when a new domain is created to configure the new
# xvif interface in domain0. We can pass any information here.
# In our example, the xvif won't be added to a bridge, but configured with a
# private address. Pass the ifconfig line which will be used by the script
# here instead.
vif = [ 'mac=aa:00:00:50:02:f0, bridge=10.0.0.254 netmask 255.255.255.0' ]
#----------------------------------------------------------------------------
# Define the disk devices you want the domain to have access to, and
# what you want them accessible as.
# Each disk entry is of the form phy:DEV,VDEV,MODE
# where DEV is the device, VDEV is the device name the domain will see,
# and MODE is r for read-only, w for read-write.
# VDEV doesn't really matter for NetBSD guest OS, but does for Linux.
# Worse, the device has to exists in /dev/ of domain0, because xm will
# try to stat() it. This means that in order to load a Linux guest OS
# from a NetBSD domain0, you'll have to create /dev/hda1, /dev/hda2, ...
# on domain0, with the major/minor from Linux :(
disk = [ 'phy:/dev/wd0e,wd0d,w' ]
#----------------------------------------------------------------------------
# Set the kernel command line for the new domain.
# Set root device. This one does matter for NetBSD
root = "/dev/wd0d"
# extra parameters passed to the kernel
#extra = ""
#----------------------------------------------------------------------------
# Set according to whether you want the domain restarted when it exits.
# The default is False.
#autorestart = True
# end of nbsd config file ====================================================
Создание непривилегированных доменов
Когда новый домен был создан, xen вызывает скрипт /usr/pkg/etc/xen/vif-bridge для каждого сетевого
интерфейса виртуальной сети, созданного в domain0, это может использоваться для автоматического
конфигурирования xvif?.? интерфейса в domain0.
В нашем примере им будет назначен IP адрес, так как domain0 использует NAT для доступа к Internet через IPF.
Вот пример /usr/pkg/etc/xen/vif-bridge:
#!/bin/sh
#============================================================================
# /usr/pkg/etc/xen/vif-bridge
#
# Script for configuring a vif.
# Xend calls a vif script when configuring a vif up or down.
# This script is the default - but it can be configured for each vif.
#
# Example invocation:
#
# vif-bridge up domain=VM1 vif=vif1.0 bridge=xen-br0 mac=aa:00:00:50:02:f0
#
#
# Usage:
# vif-bridge (up|down) {VAR=VAL}*
#
# Vars:
#
# domain name of the domain the interface is on (required).
# vif vif interface name (required).
# mac vif MAC address (required).
# bridge bridge to add the vif to (required).
#
#============================================================================
# Exit if anything goes wrong
set -e
#this will be logged in xend-debug.log
echo "vif-bridge $*"
# Operation name.
OP=$1
shift
# Pull variables in args into environment
for arg ; do export "${arg}" ; done
# Required parameters. Fail if not set.
domain=${domain:?}
vif=${vif:?}
mac=${mac:?}
bridge=${bridge:?}
# Are we going up or down?
case $OP in
up)
# ${bridge} contains ifconfig parameters in our case.
# It could also be parameters to brctl, or anything else we
# want.
# xend gives us vif?.? as interface name, but on NetBSD
# they're called xvif?.?
ifconfig x${vif} ${bridge}
exit 0
;;
down)
exit 0
;;
*)
echo 'Invalid command: ' $OP
echo 'Valid commands are: up, down'
exit 1
;;
esac
#end of /usr/pkg/etc/xen/vif-bridge
И, запускаем:
xm create -c /usr/pkg/etc/xen/nbsd
Обратите внимание на то, что флаг -c указывает xm соединиться с консолью домена после создания.
Загруженное ядро будет пытаться найти корневую файловую систему xbd0 (то есть wd0e), но не преуспеет в этом.
В последствии wd0e будет обнаружено как дисковое устройство в новом домене и соответствующим образом поделено на разделы.
Вы можете присоединить ccd к wd0e и поделить его, создать файловую систему и установить NetBSD/i386,
но есть более простой путь: загрузите ядро INSTALL_XENU, поставляемое с NetBSD/i386.
Подобно другим установочным ядрам i386 вы можете использовать sysinst, для установки NetBSD в новый домен обычным порядком.
Если вы хотите установить NetBSD/Xen с образа CDROM, в /usr/pkg/etc/xen/nbsd должна использоваться строка:
disk = [ 'phy:/dev/cd0a,cd0a,r', 'phy:/dev/wd0e,wd0d,w' ]
После загрузки домена может быть выбрана опция установки с CDROM, потом устройство должно быть заменено на xbd1d.
Далее вводим halt -p (не reboot или halt, так как в этом случае загрузится ядро INSTALL_XENU,
даже если вы исправили файл конфигурации), исправляйте файл конфигурации обратно на XENU и запускайте новый домен снова.
Теперь вы можете использовать root на xbd0a и получите полностью функциональную NetBSD/i386.
При загрузке домена вы будете видеть предупреждения от wscons и псевдотерминалов.
Их можно устранить, редактируя файлы /etc/ttys и /etc/wscons.conf.
Вы должны отключить все терминалы в /etc/ttys, кроме console, подобно нижеследующему:
console "/usr/libexec/getty Pc" vt100 on secure
ttyE0 "/usr/libexec/getty Pc" vt220 off secure
ttyE1 "/usr/libexec/getty Pc" vt220 off secure
ttyE2 "/usr/libexec/getty Pc" vt220 off secure
ttyE3 "/usr/libexec/getty Pc" vt220 off secure
Также комментируем все экраны в /etc/wscons.conf и добавляем в rc.conf:
powerd=YES
Это позволит должным образом останавливать домен по получении команды 'xm shutdown -R' или 'xm shutdown -H'.
Теперь вся наша работа по созданию домена закончена.
Linux в качестве непривилегированного домена
Создание непривилигерованных доменов Linux не сильно отличается от приведенного выше
примера, но имеются некоторые отличия.
Во первых, это второй параметр диска ('wd0d' в примере ниже):
disk = [ 'phy:/dev/wd0e,wd0d,w' ]
действительно имеет значение для Linux. Здесь требуется имя устройства Linux (например hda1).
Но средства контроля Xen будут искать имя устройства в каталоге /dev домена domain0, для решения этой проблемы
можно указать имя устройства в шестнадцатеричной форме. Linux именует устройства по
следующей схеме: (major << 8 + minor). Так, имеет major 3 и minor 1, в результате получаем 0x301.
Для экспорта гостевого раздела Linux мы должны использовать:
disk = [ 'phy:/dev/wd0e,0x301,w' ]
root = "/dev/hda1 ro"
В результате, у нас появится раздел /dev/hda1 в гостевой системе, который будет использоваться в качестве
корневого раздела.
Виртуальное блочное устройство Linux не может быть разбито на разделы, поскольку находится в домене NetBSD.
Это означает, что каждый раздел, доступный в Linux, должен быть экспортирован из domain0.
Обычно, достаточно двух (/ и swap), для чего в файл конфигурации необходимо добавить
disk = [ 'phy:/dev/wd0e,0x301,w', 'phy:/dev/wd0f,0x302,w' ], где hda1 - раздел /, а hda2 - swap.
Для установки Linux на раздел, который впоследствии будет экспортирован,
может использоваться следующий метод: установить из портов sysutils/e2fsprogs.
Использовать mke2fs для форматирования корневого раздела домена Linux и примонтировать его.
Затем скопировать файлы с рабочей системы Linux и внести соответствующие изменения (fstab, конфигурация сетевых устройств).
Также можно распаковать пакеты .rpm или .deb на примонтированный раздел, используя соответствующий инструментарий,
запускаемый в NetBSD из режима эмуляции Linux.
После того, как система будет заполнена, отмонтируем ее.
Теперь можно загрузить гостевой домен Linux, используя ядро Linux vmlinuz-*-xenU, входящее в
дистрибутив Xen.