Xenomips

Материал из Xgu.ru

Перейти к: навигация, поиск
Автор: Игорь Чубин

This article in English: Xenomips/en

Xenomips -- это виртуальная машина Xenolinux, работающая в домене domU Xen. Внутри виртуальной машины работает dynamips (Cisco 7200 Simulator), интерфейсы которого подключены к сетевым интерфейсам виртуальной машины.


Содержание

[править] Идея

В 2005 году Кристоф Филло (Christophe Fillot) начал работу над программным эмулятором платформы Cisco 7200 для персонального компьютера, известным сейчас под названием Dynamips. Проект постоянно развивается. Сейчас выполняется эмуляция нескольких платформ маршрутизаторов и большого количества интерфейсных карт.

Существует проект Dynagen, который позволяет описывать виртуальные сети на dynamips, и затем управлять их работой. К сожалению, этот проект не позволяет также легко включать в сеть виртуальные машины других типов.

С другой стороны, известный проект Xen, позволяет создавать виртуальные машины, работающие под разнообразными операционными системами, в частности Linux, и объединять их между собой в сети любой сложности.

Упаковка dynamips внутрь виртуальной машины Xen позволяет добиться нескольких интересных результатов.

[править] Преимущества

[править] Возможность построения гетерогенных виртуальных сетей

На базе Xen и Xenomips легко строить гетерогенные сети, сочетающие в себе виртуальные машины, работающие под управление различных операционных систем. Например, построение сети, состоящей из нескольких виртуальных маршрутизаторов Cisco, соединяющих между собой виртуальные системы Windows XP с серверами Windows 2003 Server (*), Linux и OpenSolaris, является очень простой задачей.

(*) для поддержки виртуальных машин Windows обязательно наличие архитектурных расширений HVM в процессоре базовой системы.

[править] Унифицированные средства управления

Становятся едиными средства для управления виртуальными машинами Xen (Linux, FreeBSD, OpenSolaris, Windows) и Dynamips.

Существующие и вновь создаваемые инструменты для управления виртуальными машинами Xen точно также могут применяться для управления машинами Dynamips. Это в частности, относится к механизмам управления выделяемым процессорным временем и памятью.

[править] Миграция и живая миграция виртуальных маршрутизаторов Dynamips

Состояние всей виртуальной сети целиком может быть запомнено и восстановлено в любой момент времени. Виртуальная сеть может быть целиком или частично перенесена с одной хост-системы на другую без остановки (и даже приостановки) её работы.

(это преимущество является наиболее спорным, поскольку пока что непроработаны вопросы построения виртуальной сети на базе распределённой хост-системы)

[править] Управление трафиком между экземплярами Dynamips средствами Linux

Интерфейсы доменов Xen соединяются между собой с помощью мостов Linux. Все они видны в домене 0 Xen, и к трафику, проходящему через эти интерфейсы, применимы все стандартные механизмы управления: для управления трафиком между виртуальными маршрутизаторами становится доступным богатый инструментарий Linux. В частности, это позволяет использовать функционал iptables, ebtables, а также QoS-средств базовой Linux-системы.


[править] Недостатки

[править] Память

Xenomips требует больше оперативной памяти на каждый экземпляр чем чистый Dynamips. Память потребляет ОС, под управлением которой работает виртуальная машина, выполняющая процесс Dynamips.

[править] Интерфейсы Dynamips

В настоящий момент в Xenomips из всего богатства интерфейсов доступных в Dynamips используются только интерфейсы Ethernet. При желании от этого недостатка можно избавиться.

[править] Начальные требования

Требования к программному обеспечению:

  • Xen. Базовая система обязательно должна работать под управлением Xenolinux. В описываемой ниже процедуре предполагается, что Xen уже проинсталлирован и сконфигурирован, а все действия выполняются в домене 0 Xen. Если это не так, читайте о том, как подготовить систему на странице Xen.
  • Debian GNU/Linux. Можно использовать и другие дистрибутивы Linux, но в случае с Debian упрощается процедура подготовки образа Xenomips. При использовании готового образа Xenomips дистрибутив может быть любым. Ниже рассматривается процедура для дистрибутива Debian.
  • Dynamips не обязательно должен быть установлен в системе на момент начала экспериментов. Однако, следует иметь в виду, что это важнейший компонент системы Xenomips, и его обязательно придётся выкачивать, собирать и инсталлировать.

Требования к аппаратному обеспечению:

  • Никаких дополнительных требований в сравнении с требованиями Xen и Dynamips

Следует отметить, что наиболее ценным ресурсом в экспериментах с Xen и Dynamips является виртуальная память. Более-менее интересные эксперименты возможны начиная с 2GB ОЗУ в системе.

[править] Подготовка виртуальной машины

[править] Подготовка автоматически с помощью скрипта

В настоящий момент скрипта автоматической подготовки нет. Когда скрипт автоматической подготовки виртуальной машины xenomips будет написан, инсталляция будет выполняться так:

%# wget http://xgu.ru/xenomips/install
%# sh install

В ходе выполнения скрипта будут выполняться все действия, описанные в следующем разделе.

[править] Подготовка виртуальной машины вручную

Процесс подготовки виртуальной машины состоит из подпроцессов подготовки образов трёх файловых систем, важнейшим из которых является образ корневой файловой системы.

[править] Файловые системы Xenomips

Базовая операционная система в домене Xen, внутри которой работает Dynamips это Linux. Ниже используется Debian GNU/Linux, но это совершенно не обязательно. Фактически, это может быть любая система, в которой может исполняться Dynamips.

В режиме записи файловая система Xenomips используется исключительно для хранения конфигурационных (и подобных) файлов Dynamips, перечень которых невелик и хорошо известен. Остальные файлы используются исключительно для чтения.

Корневая файловая система Xenomips монтируется в режиме только для чтения.

Файловая система, предназначенная для записи, создаётся и монтируется отдельно. Независимая файловая система создаётся для каждого экземпляра Xenomips. Корневая же файловая система является общей для всех.

Естественно, что общая файловая система должна быть доступной только для чтения. Но для нормальной работы Linux необходимо чтобы ряд каталогов (в частности, в /var) был доступен для записи. Для этого эти каталоги монтируются в оперативную память (mount --bind ...). Монтирование каталогов выполняется с помощью скрипта xenomips-init (описан ниже).

Третья файловая система (для IOS) создаётся по другой причине. Каталог с образами IOS не используется для записи, и его можно было бы разместить и в корне. Это сделано из соображений лицензионной чистоты. Образ Xenomips является лицензионно чистым, он не содержит проприетарного кода. Теоретически, можно было бы подготовить образ Xenomips и выложить его для свободного использования, как, например, это сделано с образами других систем, подготовленных для запуска в качестве доменов Xen (см. например, Free OS Zoo).

[править] Создание образа корневой файловой системы xenomips

Процедура подготовки образа корневой системы состоит из нескольких этапов, включающих:

  • создание образа,
  • заполнение его базовой системой,
  • установку необходимого программного обеспечения,
  • редактирование конфигурационных файлов.

В результате этого этапа должен появиться образ, который можно использовать в качестве корневой файловой системы виртуальной машины xenomips.

[править] Создание пустого образа корневой файловой системы xenomips

Если образ будет находиться на логическом томе LVM:

%# lvcreate -L 2048M -n xenomips0 /dev/NAS0
%# mkfs.ext3 /dev/NAS0/xenomips0
%# mount /dev/NAS0/xenomips0 /mnt

Создаём логический том размером 2G (в действительности, нужно намного меньше места - создаём с запасом) на группе томов /dev/NAS0.

Если в качестве образа будет использоваться обычный файл, команды немного отличаются:

%# dd if=/dev/zero of=xenomips0.img bs=1024k count=2048
%# mkfs.ext3 xenomips0.img
%# mount -o loop xenomips0.img /mnt

Файл будет создан в текущем каталоге.

Созданная файловая система будет подмонтирована в каталог /mnt, в котором будет вестись дальнейшая работа.

[править] Выполнить debootstrap

Проинсталлировать базу дистрибутива etch Debian GNU/Linux:

%# debootstrap etch /mnt http://192.168.15.251:9999/debian/ 

Здесь указан локальный apt-proxy (http://192.168.15.251:9999/debian/). Вместо него нужно указать адрес ближайшего зеркала репозитория Debian.

[править] Скопировать модули ядра

Скопировать модули ядра, под управление которого будет работать виртуальная машина Xenomips:

%# cp -R /lib/modules/*2.6.26*xen* /mnt/lib/
[править] Переход внутрь окружения

После того как Linux будет проинсталлирован, нужно сделать chroot в каталог /mnt.

%# chroot /mnt

Дальнейшая работа выполняется с корневой файловой системой Xenolinux в ограниченной среде. Когда работа с ней будет завершена, можно покинуть среду командой exit.

[править] Установить дополнительные пакеты

Пакеты, которые нужно установить для работы самой системы:

  • openssh-server
  • libc6-xen

Пакеты, которые должны быть проинсталлированы для работы dynamips:

  • libelf1
  • libpcap

Инсталляция выполняется так:

%# apt-get install openssh-server libc6-xen libelf1 libpcap
[править] Пароль root'а

Если вы собираетесь обращаться к Linux-системе через SSH, обязательно установить пароль root'а:

 %# passwd
 Enter new password: rootpass
[править] Файл /etc/fstab

Отредактировать файл /etc/fstab

proc            /proc           proc            defaults                0       0
tmpfs           /tmp            tmpfs           defaults,nosuid,nodev   0       0

/dev/hda1       /                       ext3    ro              0       0
/dev/hda2       /data/Cisco_IOS         ext3    ro              0       0
/dev/hda3       /xenomips               ext3    rw              0       0

Раздел /dev/hda1 содержит образ корневой файловой системы. Его мы готовили ранее.

Раздел /dev/hda2 содержит образы IOS.

Раздел /dev/hda3 будет содержать рабочие файлы Dynamips. Он должен монтировать в режиме read-write.

[править] Файл /etc/network/interfaces

Отредактировать файл /etc/network/interfaces.

Файл должен содержать следующее:

auto lo eth0

iface lo inet loopback 
        up for i in `ifconfig -a | grep 'eth.*Link encap' | awk '{print $1}'`; do ifconfig $i up ; done

iface eth0 inet dhcp

Это означает:

  • Автоматически при загрузке поднимать интерфейсы lo и eth0
  • Когда интерфейс lo успешно поднялся, выполнить скрипт, который найдёт все интерфейсы Ethernet в системе и поднимет их, без установки IP-адресов и выполнения любой другой конфигурации.
  • Поднять eth0 по dhcp. Мы используем eth0 как сервисный интерфейс, через который будет при необходимости осуществлять доступ к виртуальной машине Linux. К нему не будет подключаться Dynamips.

Необходимость в хитром скрипте, поднимающем интерфейсы eth, связана с тем, что dynamips может работать только через включенные интерфейсы.

Заранее количество интерфейсов, которые будут присутствовать в данном экземпляре Xenomips неизвестно, поэтому нужно просто поднимать все.

[править] Загрузочные файлы системы

Для того чтобы после старта машины сразу же запускался dynamips, добавим его вызов в файл /etc/rc.local.

/usr/local/bin/xenomips.sh

Скрипт xenomips.sh выполняет запуск dynamips. Процесс dynamips выполняется на консоли, не в фоновом режиме. Можно сказать, что на этапе запуска xenomips.sh загрузка системы завершается.


В каталоге /etc/rc2.d нужно добавить ссылку на скрипт /etc/init.d/xenomips-init, который готовит систему к использованию корневого раздела в режиме read-only. Пока что скрипт отсутствует, он будет создан позже. Ссылку можно сделать и сейчас.

# cd /etc/rc2.d; ln -s ../init.d/xenomips-init S20xenomips-init
[править] Установка dynamips

Сборка dynamips выполняется в базовой системе. Нужно покинуть среду ограниченного исполнения, в которой выполнялась доработка системы.

%# exit

Собранный код инсталлируется в дерево каталогов /mnt.

Для сборки dynamips из исходников в базовой системе должно быть установлены следующие пакеты:

  • libelf-dev
  • libpcap-dev (точнее, libpcap0.8-dev)

Установить их можно так:

%# apt-get install libelf-dev libpcap0.8-dev 

Наличие этих пакетов в самой виртуальной машине xenomips не обязательно. Они нужны только на этапе сборки.

Процесс сборки:

%# wget http://   # Точный адрес дистрибутива необходимо уточнять на сайте
%# tar xvfz dynamips*
%# cd dynamips*
%# make
%# make install DESTDIR=/mnt
[править] Установка xenomips

Необходимо вернуться в среду ограниченого исполнения, создать каталоги, которые будут использоваться в ходе работы системы, и скопировать недостающие скрипты.

%#chroot /mnt

Создать каталоги /xenomips/, /var/lib/xenomips, /data/Cisco_IOS:

%# mkdir -p /xenomips/ /var/lib/xenomips/ /data/Cisco_IOS/

Скопировать (или создать) скрипты xenomips:

  • /usr/local/bin/xenomips.sh
  • /etc/init.d/xenomips-init

Не забудьте сделать скрипты исполняемыми, после того как вы их скопируете в файловую систему:

# chmod +x /usr/local/bin/xenomips.sh
# chmod +x /etc/init.d/xenomips-init

Скрипт xenomips.sh

#!/bin/sh

DYNAMIPS_WORKDIR="/xenomips"
DYNAMIPS_ARGS=`cat /proc/cmdline | sed 's/.*xenomips="//; s/".*//'`


cd "$DYNAMIPS_WORKDIR"
dynamips $DYNAMIPS_ARGS

Этот скрипт вырезает аргументы командной строки dynamips из параметра xenomips="...", переданного ядру Linux. После этого выполняется переход в рабочий каталог /xenomips, в котором dynamips будет сохранять свои файлы (в частности, файлы конфигурации виртуальных машин), и выполняется запуск dynamips.


Скрипт xenomips-init (Скрипт позаимствован из проекта LTSP.)

#!/bin/sh

bind_mounts () {
  # set defaults
  test -z "$tmpfs_dir" && tmpfs_dir=/var/lib/xenomips
  test -z "$rw_dirs" && rw_dirs="/var/cache/man /var/lock /var/run /var/log /var/spool /var/tmp /tmp /var/lib/urandom"
  test -z "$copy_dirs" && copy_dirs=""
  test -z "$temp_copy_dirs" && temp_copy_dirs="/var/cache/debconf"
  test -z "$bindfiles" && bindfiles=""
  mount -t tmpfs -o mode=0755 tmpfs $tmpfs_dir
  # preserve directory structure
  for d in $rw_dirs ; do
    if [ -d "$d" ]; then
      cd $tmpfs_dir
      tar --no-recursion -cpf - $(find $d -type d 2> /dev/null) 2> /dev/null | tar xpf -
      mount --bind $tmpfs_dir/$d $d
    else
      echo "WARNING: $d does not exist"
    fi
  done  
  # copy contents into tmpfs
  for d in $copy_dirs $temp_copy_dirs; do
    if [ -d "$d" ]; then
      cd $tmpfs_dir
      tar -cpf - $d 2> /dev/null | tar xpf -
      mount --bind $tmpfs_dir/$d $d
    else
      echo "WARNING: $d does not exist"
    fi
  done
  # mount one file on top of another
  for f in $bindfiles ; do
    if [ -e "$f" ]; then
      mkdir -p "$(dirname $tmpfs_dir/$f)"
      cp $f $tmpfs_dir/$f
      mount --bind $tmpfs_dir/$f $f
    else
      echo "WARNING: $f does not exist"
    fi
  done
  touch /var/log/dmesg
}


bind_mounts

Данный скрипт предназначен для того чтобы сделать возможным использование корневой файловой системы в режиме read/only.

Он должен запускаться каждый раз при старте системы.

[править] Завершение подготовки образа

Когда образ готов, его можно отмонтировать.

%# umount /mnt

В дальнейшем, при необходимости доработки образа, нужно подмонтировать его и сделать необходимые изменения.

Если нужно будет поставить внутрь образа дополнительное программное обеспечение, сделать это можно так:

%# mount /dev/NAS0/xenomips0 /mnt
%# chroot /mnt
%# apt-get install ______
%# exit
%# umount /mnt

[править] Создание файла образа для рабочих файлов xenomips

Корневой раздел xenomips монтируется в режиме read-only. Тем не менее, необходим раздел в системе, который будет содержать изменяющиеся файлы -- рабочие файлы Xenomips.

Для этого предлагается использовать отдельный файл, передаваемый виртуальной машине Xen как один из дисковых разделов. Такие файлы должны быть по одному на каждую виртуальную машину Xenomips.

Выше был показан файл /etc/fstab виртуальной машины. Из него видно, что раздел /dev/hda3 монтируется в каталог /xenomips. Этот каталог делается текущим для процесса dynamips.

Создание файла:

%# dd if=/dev/zero of=/root/xenomips/images/xenomips.img bs=1024k count=100
%# mkfs.ext3 /root/xenomips/images/xenomips.img
%# cp /root/xenomips/images/xenomips.img /root/xenomips/images/xenomips0.img

В данном случае создаётся один базовый файл, который затем копируется для каждого экземпляра xenomips.

Предполагается, что файлы будут находиться в каталоге /root/xenomips/images/ домена 0.

[править] Создание раздела с образами IOS

Образы IOS можно было бы скопировать непосредственно в корневую систему, но это идеологически не совсем корректно. Поэтому, мы будем хранить образы IOS на отдельном разделе, и подмонтировать их в виртуальной машине Xenomips.

Раздел с образами IOS должен быть доступен в виртуальных машинах в режиме read-only.

Если используются LVM:

%# lvcreate -n ios -L 2048M /dev/NAS0
%# mkfs.ext3 /dev/NAS0/ios
%# mount /dev/NAS0/ios /mnt
%# cp /path/to/ios/images/* /mnt
%# umount /mnt

Если используются обычные файлы:

%# dd if=/dev/zero of=ios-images.img count=2048 bs=1024k
%# mkfs.ext3 ios-images.img
%# mount -o loop ios-images.img /mnt 
%# cp /path/to/ios/images/* /mnt
%# umount /mnt

Образы IOS лучше декомпрессировать, поскольку это сокращает время запуска Dynamips.

[править] Конфигурационный файл виртуальной машины

Конфигурационные файлы виртуальных машин в Xen -- это скрипты на Python. Как правило, единственная операция, которая используется в этих скриптах, это операция присваивания. Однако, на этом возможности конфигурационных файлов не исчерпываются -- в них можно писать любые программы на Python, что делает нетревиальное конфигурирование виртуальных машин Xen чрезвычайно простым и гибким.

Конфигурация машин xenomips (всех экземпляров сразу), описывается в одном конфигурационном файле.

/etc/xen/xenomips

Далее этот файл используется при создании виртуальных машин следующим образом:

%# xm create xenomips N=0

Здесь N - номер порождаемого экземпляра Xenomips.

Конфигурация виртуальной машины, в частности, количество её сетевых интерфейсов и способ их соединения с сетью, определяется номером машины и конфигурационным файлом xenomips.

Ниже поэтапно описываются все составляющие конфигурационного файла, а в конце приводится файл целиком.


[править] Стандартная часть

Директивы, которые должны присутствовать в любом конфигурационном файле домена Xen, и которые не требуют особого внимания в данном случае:

kernel = "/boot/vmlinuz-2.6.18-3-xen-686"
ramdisk = "/boot/initrd.img-2.6.18-3-xen-686"
#builder='linux'
memory = 400

#....

on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'

Предполагается, что файлы /boot/vmlinuz-2.6.18-3-xen-686 и /boot/initrd.img-2.6.18-3-xen-686 существуют.

Объём оперативной памяти домена, задаваемый директивой memory, зависит от конфигурации dynamips и может быть понижен.

[править] Имя

Имя виртуального домена должно быть уникальным. Пусть оно определяется номером машины xenomips:

#...
name = "xenomips"+N
#...

Тогда, например для машины N=3, имя домена будет xenomips3.

[править] Мосты

Виртуальные машины соединяются между собой с помощью мостов Linux в домене 0.

Названия мостов, к которым должны подключаться интерфейсы машин, описываются списком списков vbridges_table.

Например:

vbridges_table = [
                ['service0', 'xenbr0', 'xenbr1'],
                ['service0', 'xenbr1', 'xenbr2'],
                ['service0', 'xenbr0', 'xenbr2']
                 ]

В этом случае машина N=0 подключается своими интерфейсами:

  • eth0 к мосту service0
  • eth1 к мосту xenbr0
  • eth2 к мосту xenbr1

А, например, машина N=2 подключается к таким мостам:

  • eth0 к мосту service0
  • eth1 к мосту xenbr0
  • eth2 к мосту xenbr2

Предполагается, что интерфейсы eth0 будет использоваться в сервисных целях (например, для захода на виртуальный Linux по ssh), а остальные интерфейсы (начиная с eth1) будут подключены к dynamips. Об этом ниже.

Мосты service0, xenbr0 и xenbr1 должны быть созданы и включены.

%# brctl addbr service0
%# ifconfig service0 up

Подробнее о мостах Linux:

[править] MAC-адреса

Dynamips отправляет пакеты с интерфейса со своим собственным MAC-адресом. MAC-адреса виртуальной машины Xen использует только операционная система.

MAC-адреса машин Xen и Dynamips:

  • 00:16:3e:01:XX:YY - для Xen
  • 00:16:3e:02:XX:01 - для Dynamips (будем использовать адреса из пространства Xen, хотя это и не совсем корректно)

Числа XX и YY выбираются по следующему правилу:

  • XX=N , где N - номер машины.
  • YY=C0+K для интерфейсов ethK

При такой схеме выделения адресов можно адресовать до 256 машин, у каждой из которых до 64 интерфейсов.

Список vif, описывающий интерфейсы, генерируется следующим образом:

#...
vif=[]
x=1
for i in vbridges:
  vif.append('bridge='+i+',mac=00:16:3e:01:'+hex(int(N))[2:]+':'+hex(int('c0',16)+x)[2:])
  x+=1
#...

Например, при условии, что N='1', а

vbridges=['service0', 'xenbr1', 'xenbr2']

код сгенерирует список:

vif=['bridge=service0,mac=00:16:3e:01:1:c1', 'bridge=xenbr1,mac=00:16:3e:01:1:c2', 'bridge=xenbr2,mac=00:16:3e:01:1:c3'] 

[править] Диски

Виртуальной машине должны быть доступны три дисковых раздела:

  1. Корневой раздел с Debian GNU/Linux (одинаковый для всех);
  2. Раздел с образами IOS (одинаковый для всех);
  3. Раздел с рабочими файлами Dynamips (индивидуальный);

Первые два раздела могут использоваться совместно всеми машинами. Они монтируются в режиме read-only. Последний раздел содержит рабочие файлы dynamips, в частности конфигурацию виртуальных машин. Он монтируется в режиме read/write и должен быть индивидуальным для каждой машины.

Таким образом, список disk в конфигурационном файле xenomips будет выглядеть следующим образом:

#...
disk = [ 'phy:/dev/NAS0/xenomips0,hda1,r', 'phy:/dev/NAS0/ios,hda2,r', 'file:/root/xenomips/images/xenomips'+N+'.img,hda3,w' ]
#...

Первые два раздела представлены томами LVM, третий - обычным файлом. Он используется через loopback-устройство.

Имя файла с конфигурацией зависит от номера виртуальной машины N. Например, для машины N=1, файл будет называться так:

/root/xenomips/images/xenomips1.img

Если все разделы базируются на файлах, а не на LVM, измените список соответствующим образом.

[править] Dynamips

Параметры процессу dynamips, который будет запускаться внутри виртуальной машины передаются как аргрумент в командной строке ядра. Затем, после того как операционная система домена загрузится, она находит эти параметры, и передаёт их в командную строку dynamips при его вызове.

Пример командной строки ядра:

linux ro root=/dev/hda1 xenomips="....."

Получается, что аргументы командной строки, которые мы хотели бы передать процессу dynamips, должны задаваться в двойных кавычках в параметре xenomips ядра Linux.

В качестве аргументов передаётся:

  • имя файла с IOS
  • -m - базовый MAC-адрес шасси (см. выше)
  • -p - описание сетевых адаптеров
  • -s - описание подключения сетевых адаптеров

Пусть в dynamips будет столько адаптеров, сколько интерфейсов в Linux (на один меньше - сервисный адаптер к dynamips не подключается). В действительности это самая простая, но не единственная конфигурация. Адаптеры пусть подключаются к интерфейсам виртуальной машины.

Один адаптер в dynamips есть всегда, остальные создаются с помощью ключа -p. Например:

-p 1:PA-FE-TX -p 2:PA-FE-TX

Означает добавить 2 FastEthernet адаптера.

Существует большое количество вариантов подключения интерфейсов виртуальной машины Dynamips. В частности, интерфейсы Cisco можно подключить непосредственно к интерфейсам Linux:

-s 0:0:gen_eth:eth0

Означает подключить интерфейс fa0/0 Cisco к интерфейсу eth0 Linux.

Будем автоматически подключать интерфейсы faX/0 Cisco к интерфейсам ethX+1 в Linux (интерфейс eth0 задействован под сервисные нужды).

#....
xenomips='/data/Cisco_IOS/C7200-JK.BIN -m 00:16:3e:02:'+hex(int(N))[2:]+':01'

for i in range(len(vbridges)-2):
 xenomips += ' -p '+str(i+1)+':PA-FE-TX'

for i in range(len(vbridges)-1):
 xenomips += ' -s '+str(i)+':0:gen_eth:eth'+str(i+1)

extra = "xenomips=\""+xenomips+"\""
#...

[править] Конфигурационный файл виртуальной машины

Итоговый конфигурационный файл xenomips представлен ниже.

Он должен быть размещён в каталоге /etc/xen домен 0 хоста под управлением Xenolinux.

kernel = "/boot/vmlinuz-2.6.18-3-xen-686"
ramdisk = "/boot/initrd.img-2.6.18-3-xen-686"
#builder='linux'
memory = 400

name = "xenomips"+N

vbridges_table = [
                ['service0', 'xenbr0', 'xenbr1'],
                ['service0', 'xenbr1', 'xenbr2'],
                ['service0', 'xenbr0', 'xenbr2']
                 ]

vbridges = vbridges_table[int(N)]

vif=[]
x=1
for i in vbridges:
 vif.append('bridge='+i+',mac=00:16:3e:01:'+hex(int(N))[2:]+':'+hex(int('c0',16)+x)[2:])
 x+=1


disk = [ 'phy:/dev/NAS0/xenomips0,hda1,r', 'phy:/dev/NAS0/ios,hda2,r', 'file:/root/xenomips/images/xenomips'+N+'.img,hda3,w' ]
root = "/dev/hda1 ro"

#xenomips='/data/Cisco_IOS/C7200-JK.BIN -m 00:16:3e:01:'+hex(int(N))[2:]+':01 -p 1:PA-FE-TX -p 2:PA-FE-TX -s 0:0:linux_eth:eth1 -s 1:0:gen_et
h:eth2'
xenomips='/data/Cisco_IOS/C7200-JK.BIN -m 00:16:3e:01:'+hex(int(N))[2:]+':01'

for i in range(len(vbridges)-2):
 xenomips += ' -p '+str(i+1)+':PA-FE-TX'

for i in range(len(vbridges)-1):
 xenomips += ' -s '+str(i)+':0:gen_eth:eth'+str(i+1)

extra = "xenomips=\""+xenomips+"\""

on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'

[править] Запуск виртуальных машин

Виртуальные машины запускаются стандартным способом:

%# xm create xenomips N=0
%# xm create xenomips N=1
%# xm create xenomips N=2

Если нужно создать сразу несколько машин, можно воспользоваться циклом командного интерпретатора:

%# for i in `seq 1 10`; do xm create xenomips N=$i; done

Внимание! Каждая виртуальная машина потребляет значительную оперативную память, поэтому нужно быть уверенным, что физической памяти на хост-системе достаточно чтобы разместить заданное количество машин. Например, для запуска 10 машин, каждая из которых потребляет 400MB потребуется больше 4GB ОЗУ.

После того как машины запущены, можно посмотреть, работают ли они:

%# xm list
Name                                      ID Mem(MiB) VCPUs State   Time(s)
Domain-0                                   0      555     1 r-----   1433.8
ltsp0                                     15      256     1 -b----     24.0
xenomips0                                 43      400     1 ------     13.7
xenomips1                                 44      400     1 ------     13.2
xenomips2                                 45      400     1 ------     13.2

[править] Использование

Подключиться к консоли виртуальной машины можно с помощью команды:

%# xm console xenomips0

Отключиться от консоли Xen можно с помощью комбинации клавиш ^] (Ctrl+]).

Внимание! Escape-последовательность Xen и Dynamips совпадает. По этому воспользоваться Escape-последовательностью Dynamips через консоль Xen не удастся. Если вам нужно поработать с Linux, воспользуйтесь доступом через сервисный интерфейс Xenomips -- зайдите на него через SSH.

Другой способ: при компиляции Dynamips изменить его исходный код и указать другую escape-последовательность.

Рекомендуется воспользоваться программой GNU Screen и подключаться к консолям разных доменов Xen из отдельных окон screen. Это удобно.

К машинам xenomips применимы все действия, которые Xen позволяет делать со своими доменами, в частности, сохранять и восстанавливать их состояние, выполнять миграцию, живую миграцию и другие.

Подробнее об использовании доменов Xen:

[править] Проверка

Конфигурация роутера стандартная:

router0>ena
router0#show run
Building configuration...

Current configuration : 864 bytes
!
version 12.3
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
!
hostname router0
!
boot-start-marker
boot-end-marker
!
!
no aaa new-model
ip subnet-zero
!
ip cef
ip audit po max-events 100
no ftp-server write-enable
!         
no crypto isakmp enable
!         
interface FastEthernet0/0
 ip address 192.168.15.170 255.255.255.0
 duplex half
!         
interface FastEthernet1/0
 ip address 192.168.16.1 255.255.255.0
 duplex half
!         
router ospf 10
 log-adjacency-changes
!         
router ospf 1
 log-adjacency-changes
 network 192.168.15.0 0.0.0.255 area 0
 network 192.168.16.0 0.0.0.255 area 0
!         
ip classless
no ip http server
no ip http secure-server
!         
control-plane
!   
gatekeeper
 shutdown 
!         
!         
line con 0
 stopbits 1
line aux 0
 stopbits 1
line vty 0 4
 login    
!         
end

Пингуем реальные машины:

router0#ping 192.168.15.254
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.15.254, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 24/76/92 ms

Пингуем виртуальные машины:

#ping 192.168.17.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.17.1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 84/208/360 ms

Проверяем, работает ли OSPF:

router0#show ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area 
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route

Gateway of last resort is not set

C    192.168.15.0/24 is directly connected, FastEthernet0/0
O    192.168.17.0/24 [110/2] via 192.168.16.2, 12:52:45, FastEthernet1/0
                     [110/2] via 192.168.15.171, 12:52:45, FastEthernet0/0
C    192.168.16.0/24 is directly connected, FastEthernet1/0
router0#show ip ospf neighbor

Neighbor ID     Pri   State           Dead Time   Address         Interface
192.168.17.1      1   FULL/BDR        00:00:34    192.168.16.2    FastEthernet1/0
192.168.17.2      1   FULL/BDR        00:00:39    192.168.15.171  FastEthernet0/0


[править] Благодарности

Спасибо разработчикам систем Xen и Dynamips за то, что они дают возможность работать с такими необыкновенными вещами.

Отдельное спасибо Игорю Подолюху -- тренеру по системам Cisco учебного центра Сетевые Технологии, который в своё время познакомил меня с маршрутизаторами Cisco, в другое время показал мне Dynamips, и на протяжении всего времени отвечает на все идиотские вопросы по цискам, которые я ему задаю.

[править] Обратная связь

Пожалуйста, если у вас есть какие-то идеи, замечания, пожелания или вопросы, пишите об этом:

Xentaur
Xentaur

Инсталляция и использование Xentaur
Инсталляция | Консоль | Интеграция с реальной сетью | Описание сети
(репозиторий: http://xgu.ru/hg/xentaur)
Компоненты
Узлы: Xen | Xenomips (Dynamips + Pixemu + Xen) | Qemu
Сеть: linux bridges | ebtables | vnet | gvpe | vde | QoS в Linux | iptables
Управление: IPython | GNU Screen
Источник — «http://xgu.ru/wiki/Xenomips»