The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

NetBSD/xen Howto (netbsd xen virtual)


<< Предыдущая ИНДЕКС Правка src / Печать Следующая >>
Ключевые слова: netbsd, xen, virtual,  (найти похожие документы)
From: Михаил Сгибнев <mixa(@).dreamcatcher.ru> Date: 2006-09-13 15:12:07 Subject: NetBSD/xen Howto
Перевод: Сгибнев Михаил

Оригинал: http://www.netbsd.org/Ports/xen/howto.html

Примечание: в переводе возможны неточности и огрехи, просьба высылать замечания и предложения на mixa(at)dreamcatcher.ru

Содержание

Введение

Xen является монитором виртуальных машин для платформы x386 (запускается только на машинах класса x686) и позволяет выполнять несколько гостевых операционных систем на одной физической машине. Гостевые ОС (также называемые "домены") требуют специально модифицированного ядра, которое поддерживает запросы Xen к физическим устройствам. Во время начальной загрузки (с помощью grub) происходит запуск ядра Xen и гостевого домена первого уровня, называемого также domain0. Домен domain0 имеет привилегированный доступ к физическим устройствам (PCI и ISA), администрирует другие домены и обеспечивает работу виртуальных устройств(диски и сетевые устройства). Для получения более подробной информации обратитесь к руководству пользователя http://www.cl.cam.ac.uk/Research/SRG/netos/xen/.

NetBSD может использоваться как для domain0, так и для непривилегированных доменов. Для справки, привилилегированных доменов может быть несколько и они могут обращаться к различным физическим устройствам, также как и непривилегированные домены могут обращаться к различным виртуальным устройствам. Мы будем рассматривать ситуацию, когда имеется только один главный домен - domain0. Он не очень сильно отличается от обычного ядра i386, имеет реальную консоль (VGA или последовательный порт), в отличие от виртуальных, имеющих только псевдоконсоль, псевдодиск (xbd) и виртуальный сетефой интерфейс (xennet), предоставляемые главным доменом. Устройство xbd связано с реальным блочным устройством (раздел на диске, raid, ccd, ...) в главном домене. Устройство xennet связано с виртуальным устройством в привилегированном домене, именуемым по схеме xvif. (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.

<< Предыдущая ИНДЕКС Правка src / Печать Следующая >>

 Добавить комментарий
Имя:
E-Mail:
Заголовок:
Текст:




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2020 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру