From: Игорь Чубин <igor@chub.in.>
Date: Mon, 9 Feb 2007 14:31:37 +0000 (UTC)
Subject: Симулятор работы сети из маршрутизаторов Cisco и Linux-машин
Оригинал: http://xgu.ru/wiki/Xenomips
Материал из Xgu.ru.
Автор: Игорь Чубин
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
Процедура подготовки образа корневой системы состоит из нескольких
этапов, включающих:
* создание образа,
* заполнение его базовой системой,
* установку необходимого программного обеспечения,
* редактирование конфигурационных файлов.
В результате этого этапа должен появиться образ, который можно
использовать в качестве корневой файловой системы виртуальной машины
xenomips.
Создание пустого образа корневой файловой системы xenomips
Если образ будет находиться на логическом томе LVM:
Здесь указан локальный apt-proxy
(http://192.168.15.251:9999/debian/). Вместо него нужно указать
адрес ближайшего зеркала репозитория Debian.
После того как Linux будет проинсталлирован, нужно сделать chroot в
каталог /mnt.
%# chroot /mnt
Дальнейшая работа выполняется с корневой файловой системой Xenolinux в
ограниченной среде. Когда работа с ней будет завершена, можно покинуть
среду командой exit.
Установить дополнительные пакеты
Пакеты, которые нужно установить для работы самой системы:
* openssh-server
* libc6-xen
Пакеты, которые должны быть проинсталлированы для работы dynamips:
* libelf1
* libpcap
Раздел /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
Необходимо создать каталоги, которые будут использоваться в ходе
работы системы, и скопировать недостающие скрипты.
Создать каталоги /xenomips/, /var/lib/xenomips, /data/Cisco_IOS:
Скопировать (или создать) скрипты xenomips:
* /usr/local/bin/xenomips.sh
* /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
В дальнейшем, при необходимости доработки образа, нужно подмонтировать
его и сделать необходимые изменения.
Если нужно будет поставить внутрь образа дополнительное программное
обеспечение, сделать это можно так:
Корневой раздел xenomips монтируется в режиме read-only. Тем не менее,
необходим раздел в системе, который будет содержать изменяющиеся файлы
-- рабочие файлы Xenomips.
Для этого предлагается использовать отдельный файл, передаваемый
виртуальной машине Xen как один из дисковых разделов. Такие файлы
должны быть по одному на каждую виртуальную машину Xenomips.
Выше был показан файл /etc/fstab виртуальной машины. Из него видно,
что раздел /dev/hda3 монтируется в каталог /xenomips. Этот каталог
делается текущим для процесса dynamips.
В данном случае создаётся один базовый файл, который затем копируется
для каждого экземпляра xenomips.
Предполагается, что файлы будут находиться в каталоге
/root/xenomips/images/ домена 0.
Создание раздела с образами IOS
Образы IOS можно было бы скопировать непосредственно в корневую
систему, но это идеологически не совсем корректно. Поэтому, мы будем
хранить образы IOS на отдельном разделе, и подмонтировать их в
виртуальной машине Xenomips.
Раздел с образами IOS должен быть доступен в виртуальных машинах в
режиме read-only.
Образы IOS лучше декомпрессировать, поскольку это сокращает время
запуска Dynamips.
Конфигурационный файл виртуальной машины
Конфигурационные файлы виртуальных машин в Xen -- это скрипты на
Python. Как правило, единственная операция, которая используется в
этих скриптах, это операция присваивания. Однако, на этом возможности
конфигурационных файлов не исчерпываются -- в них можно писать любые
программы на Python, что делает нетревиальное конфигурирование
виртуальных машин Xen чрезвычайно простым и гибким.
Конфигурация машин xenomips (всех экземпляров сразу), описывается в
одном конфигурационном файле.
/etc/xen/xenomips
Далее этот файл используется при создании виртуальных машин следующим
образом:
%# xm create xenomips N=0
Здесь N - номер порождаемого экземпляра Xenomips.
Конфигурация виртуальной машины, в частности, количество её сетевых
интерфейсов и способ их соединения с сетью, определяется номером
машины и конфигурационным файлом xenomips.
Ниже поэтапно описываются все составляющие конфигурационного файла, а
в конце приводится файл целиком.
Стандартная часть
Директивы, которые должны присутствовать в любом конфигурационном
файле домена Xen, и которые не требуют особого внимания в данном
случае:
В этом случае машина 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:
* Linux Bridge
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
#...
Виртуальной машине должны быть доступны три дисковых раздела:
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 задействован под сервисные нужды).
Если нужно создать сразу несколько машин, можно воспользоваться циклом
командного интерпретатора:
%# 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:
* 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, и на протяжении всего времени отвечает на все идиотские
вопросы по цискам, которые я ему задаю.
Обратная связь
Пожалуйста, если у вас есть какие-то идеи, замечания, пожелания или
вопросы, пишите об этом:
* на странице обсуждения Обсуждение:Xenomips
* на странице обсуждения OpenNet
* на странице обсуждения Linux.org.ru
* по электронной почте: igor @ chub.in
624 Прочтений • [Симулятор работы сети из маршрутизаторов Cisco и Linux-машин (xen emulator cisco virtual)] [08.05.2012] [Комментариев: 0]