UNIX FORUM
07 September 2010, 18:35:02 *
Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length
News: SMF форум только что установлен!
 
   Home   Help Login Register  
Pages: [1]
  Print  
Author Topic: NetBSD/xen Howto  (Read 3204 times)
0 Members and 1 Guest are viewing this topic.
admin
Администратор
Ветеран
*****
Offline Offline

Posts: 33957

OS:
FreeBSD
Browser:
Firefox 2.0.0.12


View Profile WWW
« on: 22 June 2008, 02:32:24 »

NetBSD/xen Howto

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

Скриншот: http://www.netbsd.org/gallery/in-Action/hubertf-xen.png

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

    * Введение
    * Установка NetBSD как domain0
    * Создание непривилегированных доменов
    * Linux в качестве непривилегированного домена


Введение

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/xentools20. grub необходим для загрузки ядер xen и domain0; xentools20 содержит утилиты для управления xen из domain0. Затем вам необходимо само ядро Xen 2.0. Вы можете скачать один из бинарных файлов с http://dreamcatcher.ru/docs/ (необходим 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:

Code:
      #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. Если их нет, То создайте командой:


   
Code:
   # cd /dev && sh MAKEDEV xen

xend ведет журналы /var/log/xend.log и /var/log/xend-debug.log. Основным инструментом контроля служит утилита xm, например просмотреть список доменов можно так:


 
Code:
    # 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:

Code:
      #  -*- 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:


 
Code:
     #!/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

И, запускаем:


Code:
      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 должна использоваться строка:


Code:
      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, подобно нижеследующему:


Code:
      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:


Code:
      powerd=YES

Это позволит должным образом останавливать домен по получении команды 'xm shutdown -R' или 'xm shutdown -H'. Теперь вся наша работа по созданию домена закончена.

Linux в качестве непривилегированного домена

Создание непривилигерованных доменов Linux не сильно отличается от приведенного выше примера, но имеются некоторые отличия.

Во первых, это второй параметр диска ('wd0d' в примере ниже):


Code:
      disk = [ 'phy:/dev/wd0e,wd0d,w' ]

действительно имеет значение для Linux. Здесь требуется имя устройства Linux (например hda1). Но средства контроля Xen будут искать имя устройства в каталоге /dev домена domain0, для решения этой проблемы можно указать имя устройства в шестнадцатеричной форме. Linux именует устройства по следующей схеме: (major << 8 + minor). Так, имеет major 3 и minor 1, в результате получаем 0x301. Для экспорта гостевого раздела Linux мы должны использовать:


Code:
      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.


Перевод: Сгибнев Михаил

Похожие:
http://dreamcatcher.ru/docs/netbsd_xen_now.html
http://www.freebsd.3dn.ru/publ/2-1-0-163
http://ru.wikipedia.org/wiki/Xen
« Last Edit: 22 June 2008, 02:43:50 by admin » Logged
Pages: [1]
  Print  
 
Jump to:  

1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
Powered by MySQL Powered by PHP Powered by SMF | SMF © 2006-2007, Simple Machines LLC | Sitemap Valid XHTML 1.0! Valid CSS!