И снова доброго утречка. В данной статье я рассажу о своем опыте эмуляции Juniper M-серии в домашних условиях и о тех трудностях, которые ждут экспериментаторов. Замечу, что данная статья является творческой компиляцией из этого, этого и вот этого, щедро сдобреного собственным опытом и несколько лишенным воды. Если этой статьи вам мало - добро пожаловать в первоисточники :)

Преамбула: Сестра, скальпель!

Основным плюсом для нас будет то, что Juniper Networks использует в качестве базы для своих решений x86 архитектуру (в частности M5 имеет на борту 500-й селерон, а Contiva 3000 - вообще 233-й). Кроме того, Juniper базируется на FreeBSD. Знание этих двух фокусов позволит нам достаточно успешно и недорого сэмулировать реальный маршрутизер. В отличие от Dynamips потери производительности будут минимальны, а если установить JunOS на реальную машину - вообще незаметны. Правда, установить реальный JunOS не так-то просто… Но если очень захотеть - можно. А эмулировать так вообще - сплошное удовольствие :)

Итак. В качестве платформы эмуляции я использовал Debian/GNU linux, в статье рассматриваю именно его. Предварительная подготовка: Потребуется готовая система Debian (графика не обязательна). Памяти - 512 минимум, 256 уйдет на эмулятор. 2 гига места на харде. Наличие второй сетевой карты, которую скормим эмулятору - не обязательно, но рекомендуется. Наличие широкого канала в инет строго рекомендуется, будем качать. Поехали: для начала нам потребуется эмулятор qemu. Причем простой не подходит, нужно патчить. Вытаскиваем инструменты для эмулятора:

apt-get build-dep qemu
apt-get install libpcap libcap-dev
apt-get install svntools

Сразу говорю - ставится будет немалое количество пакетов, это полный набор всех необходимых файлов для сборки qemu из исходного кода + компиляторы и библиотеки. lpcap нужен для непосредственного подсоединения эмулятора к сети. Можно собрать без него, но тогда эмулятор можно будет цеплять только к соседям или через tap-интерфейс, это сложнее.

Теперь тянем собственно qemu:

mkdir ~/src
cd ~/src
svn co svn://svn.savannah.nongnu.org/qemu/trunk -r 5193

Это достаточно старая версия, но нам она подойдет. Новую версию тащить не советую - будут проблемы при сборке libpcap

Патчим свежеприобретенный код:

cd qemu
wget http://www.internetworkpro.org/nemith/qemu-olive/qemu-cvs20080910-brb_01-olive.patch
patch -p1 < qemu-cvs20080910-brb_01-olive.patch

Поясню свои действия. Дело в том, что JunOS из “традиционных” сетевых интерфейсов знает только Intel, причем несколько вполне определенных плат. Если быть абсолютно точным, то это

  • Intel EtherExpress Pro/100 and Pro/100B (82558 / 82558B chipset)
  • Intel EtherExpress Pro/100+ Management Adapter (82559 chipset)
  • Intel Pro/1000MT Desktop Gigabit Adapter
  • Intel Pro/1000MT Dual Port Server Adapter (FW82546EB chipset)
  • Intel ICH3 Onboard Controller (82801CAM)
  • Compaq NC3120 (82258 chipset)
  • Compaq NC3121 (82558B chipset)
  • Matrox QS-NIC Quad FE NIC (8255x chipset)

Во FreeBSD это интерфейсы em и fxp. Остальные сетевушки просто не работают. Базовая поставка qemu предполагает эмуляцию сетевой карты Dec/Tulip (чип Lance 1010), которая в JunOS попросту не увидится. Патч исправляет эту историческую несправедливость, добавляя в qemu поддержку Intel 82559B карты.

Теперь собственно соберем:

./configure --prefix=/var/qemu --enable-pemu-i82559 \
--enable-net-pcap \
--disable-kqemu \
make
make install

Как соберется - у нас будет готовый qemu, с помощью которого мы будем эмулировать наш Juniper.

Первые шаги: Готовим будку.

Для эмуляции JunOS нам понадобится сама JunOS, а также FreeBSD, из которой мы соберем JunOS. JunOS я предоставлять не буду, это дело подсудное. Но найти ее несложно. Во-первых она есть в e2k и torrent сетях. А во вторых ее можно найти на Садыковском форуме. Важно не ошибиться в версии и собственно пакете. Версии старше 7.5 - очень старые, подходят мало. Версии новее 9.0 слишком новые. Кроме того, из-за них эмулятор может уйти в летаргию или crash-нутся. Лично я использую версию 8.5. Далее. Пакет бывает Junos-domestic и Junos-extraсt. Последний является апгрейдом к существующей системе и нам не подойдет, работать он откажется. Кроме собственно базовой системы Junos можно также стянуть jweb - веб-интерфейс для управления аппаратиком. Стягивать не обязательно, командная строка есть и без него, но интерфейс может пригодится, так что пусть будет.

Теперь собственно будка. Скачиваем FreeBSD 4.11 отсюда:

Не смотря на несерьезные размеры, скачиваться будет долго - сервер сильно нагружен, а он один… После того как образ скачается - начинаем работу:

cd /var/qemu
./bin/qemu-img j1.img 2G

j1.img - диск, с которого мы будем грузится.

Для удобства запуска я написал простенький скрипт:

#!/bin/sh
/var/qemu/bin/qemu -L /var/qemu/share/qemu -m 256 -hda /var/qemu/j1.img \
-cdrom /var/qemu/4.11-RELEASE-i386-miniinst.iso -boot d \
-localtime \
-serial tcp::6001,server \
-vnc :1 \
-net nic,macaddr=00:aa:00:00:01:01,model=pemu_i82559 -net lcap,ifname=eth0 &

Кидаем его в /var/qemu и даем права на запуск, потом запускаем. Скрипт черканет пару строчек и свалится в фон. В случае, если установка пошла не так или эмулятор ушел в летаргию - достаточно с консоли просто убить процесс qemu:

killall -9 qemu

А для продолжения установки цепляемся к серверу с qemu по VNC, порт - 5901. Далее ставим FreeBSD, это процесс совсем не сложен и детально описан в руководстве на сайте. Крайне рекомендую прописать машине hostname и IP для сетевой карты (fxp0). Единственное уточнение - разметка. Выглядеть должно так:

  • / - 512M
  • swap - 256M
  • /config - 256M
  • /var - все остальное (должно быть около гига).

Ставить надо только base system, ничего больше не потребуется.

После установки фри, когда она предложит загрузится снова жмем ^C (ctrl-c) или убиваем процесс qemu. Открываем наш скрипт запуска и меняем -boot d на -boot c. То есть наш новый скрипт будет смотреться примерно так:

#!/bin/sh
/var/qemu/bin/qemu -L /var/qemu/share/qemu -m 256 -hda /var/qemu/j1.img \
-cdrom /var/qemu/4.11-RELEASE-i386-miniinst.iso -boot с \
-localtime \
-serial tcp::6001,server \
-vnc :1 \
-net nic,macaddr=00:aa:00:00:01:01,model=pemu_i82559 -net lcap,ifname=eth0 &

А теперь зверюшки!

Вновь запускаем систему и любуемся свежеустановленной системой. Забираем через сеть наш JunOS

cd /var/tmp
scp [email protected]:~/jinstalll-8.3R2.8-domestic-signed.tgz ./

и ставим:

pkg_add -f ./jinstalll-8.3R2.8-domestic-signed.tgz

Тут есть еще один скользкий момент. Если JunOS у вас 8.0 или новее - поставить вы ее не сможете, будет ошибка ELF type 0. Но это победимо. Чтобы это забороть нужно подменить ./pkgtool/bin/checkpic на /usr/bin/true из системы, в которую закатываем JunOS:

mkdir junos
cp jinstall-8.3R2.8-domestic-signed.tgz
cd junos
tar -xf jinstall-8.3R2.8-domestic-signed.tgz
mkdir jinstall
cp jinstall-8.3R2.8.tgz ./jinstall
cd jinstall
tar -xf jinstall-8.3R2.8.tgz
mkdir pkgtools
cp pkgtools.tgz ./pkgtools
cd ./pkgtools
tar -xf pkgtools.tgz
cp /usr/bin/true ./bin/checkpic

А теперь затрамбуем это все обратно!

tar czvf ../pkgtools.tgz *
cd ../
rm -rf pktools
tar czvf ../jinstall-8.3R2.8.tgz *
cd ..
rm -rf jinstall

Последний архив нам собирать не надо, для установки используется jinstall При обратной запаковке пользуемся табами - файлы, в которые система пакуется должны называться так же, как и те, из которых мы распаковались, иначе система не поставится.

Ставим:

pkg_add -f jinstall-8.3R2.8.tgz

После всех мытарств рутер перезагрузится. Отцепляемся от VNC (там все равно ничего интерестного не будет) и цепляемся telnet-ом на сервере на адрес 127.0.0.1:6001 и смотрим на свежезагруженый джунипер. Наш эмулятор готов!