GNS3でvMX(VCP/VFP)を動かすぞい。

Posted on 2016/09/18(Sun) 03:15 in technical

今回の話題

以前、個人アカウントでvMX Trialのダウンロードができるようになった話 をしたんですけど、GNS3でvMXの動作確認が取れたので、ここに書き残しておきます。

簡単な解説

簡単ですが前置きを。

vMX Trialで入手可能なvMXは、以下の図のように制御プレーンと転送プレーンが分離しています。

g043409.png

Ref: https://www.juniper.net/techpubs/en_US/vmx16.1/topics/concept/vmx-architecture.html

全く転送を行わないのであればVCP(Virtual Control Plain)のみを動かせばいいのですが、vMXでパケットを転送するとなると、VFP(Virtual Forwarding Plane)も必要になります。

VCPとVFP間は、アドレス設定(図中の128.0.0.1/16とか)からVCPがVFPを見つけるところまで自動的に行われるので、通信可能なように接続されていれば問題ありません。

転送しないで終わると言うのも空しいので、今回は通信を含めたところまで確認してみます。

準備

今回のOSです。:

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"
$ head -27 /proc/cpuinfo
processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model               : 42
model name  : Intel(R) Xeon(R) CPU E31235 @ 3.20GHz
stepping    : 7
microcode   : 0x29
cpu MHz             : 3397.000
cache size  : 8192 KB
physical id : 0
siblings    : 8
core id             : 0
cpu cores   : 4
apicid              : 0
initial apicid      : 0
fpu         : yes
fpu_exception       : yes
cpuid level : 13
wp          : yes
flags               : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm epb tpr_shadow vnmi flexpriority ept vpid xsaveopt dtherm ida arat pln pts
bugs                :
bogomips    : 6399.87
clflush size        : 64
cache_alignment     : 64
address sizes       : 36 bits physical, 48 bits virtual
power management:

GNS3を入れます。:

sudo add-apt-repository ppa:gns3/ppa
sudo apt update
sudo apt install -y gns3-gui

vmx-bundle-16.1R1.7.tgz を入手して、以下のファイルを手元に置きます。:

$ ls vmx-16.1R1.7/images/
junos-vmx-x86-64-16.1R1.7.qcow2
metadata_usb.img
vFPC-20160617.img
vmxhdd.img

GNS3にvMXのイメージを登録

画像で雰囲気をお伝えしつつ、注意点のみ書き残します。

リソース要件等の詳細はこちら: https://www.juniper.net/techpubs/en_US/vmx16.1/topics/reference/general/vmx-hw-sw-minimums.html

VCP

制御プレーンで気を付ける点は、3つのHDDイメージが正しい順番で設定される必要があるところですね。

先ほど準備したファイルのうち、3つを使います。:

junos-vmx-x86-64-16.1R1.7.qcow2
metadata_usb.img
vmxhdd.img

GNS3のQemu VM Templatesの設定画面では、こんな風になれば良いです。画像がない部分はデフォルトでオッケー。

0918a_vMX_trial_on_gns3_001.png

通報

今回は vCPU 2, 2GB RAM にしていますが、必要要件は vCPU 1, 1GB RAM なので、もう少し絞ってもいいと思います。

0918a_vMX_trial_on_gns3_002.png

備考

ここで、HDDの順番を以下のように設定します。これ重要。

  1. junos-vmx-x86-64-16.1R1.7.qcow2
  2. vmxhdd.img
  3. metadata_usb.img
0918a_vMX_trial_on_gns3_003.png

通報

VCPのvNICも4つになっていますが、必要要件は2つなので、これも削っていいと思います。

Typeも、とりあえずe1000で動作確認しましたが、OSが認識するなら何でもいいはずです。

VFP

次にVFP。こっちはNICタイプだけ注意。

0918a_vMX_trial_on_gns3_004.png

通報

今回は vCPU 3, 8GB RAM にしていますが、必要要件は vCPU 3, 4GB RAM なので、もう少し絞ってもいいと思います。

0918a_vMX_trial_on_gns3_005.png

通報

HDDは vFPC-20160617.img を1つだけ。

0918a_vMX_trial_on_gns3_006.png

備考

Typeを virtio-net-pci にすること。Adapterの数は制御用2つと転送用に好きなだけ。今回は転送用に2ポートなので計4つ。

ここにもそう書いてある。: https://www.juniper.net/techpubs/en_US/vmx16.1/topics/concept/vmx-virtualization-techniques.html

ここまで。

疎通確認をするクライアントはなんか適当に入れておいてください。(適当)

配線と起動

こんな感じで繋ぎます。ubuntu1604-1, ubuntu1604-2はpingを打つだけなので、手元の環境で都合の良いものを適当にどうぞ。

0918a_vMX_trial_on_gns3_007.png

そして起動。

一応、操作と動作進捗確認のため、GNS3のコンソールを開いておきましょう。

同時に起動すると、おそらくVFPの方が早く立ち上がります。

VCPが自動的にVFPを検出して登録するので、VCPの起動を待ちます。

備考

VCPがVFPを検出すると、VFP側でDPDKの初期化が始まります。

この時、VFPのNIC Typeがvirtioではない場合、転送サービスの起動コマンドの引数が --rx "" とかになって動きません。

DPDK的には当たり前ですが、vCPUも1つとか2つしか無かったら同じように転送サービスがエラー吐いて止まります。

無事にVFPが検出されて転送サービスが起動すると、こんな感じの出力になると思います。

0918a_vMX_trial_on_gns3_008.png

今度は、VCPにログインして、VFPが認識されていることを確認します。

0918a_vMX_trial_on_gns3_009.png

テキストで貼るとこんな感じです。:

FreeBSD/amd64 (Amnesiac) (ttyu0)

login: root

--- JUNOS 16.1R1.7 Kernel 64-bit  JNPR-10.1-20160624.329953_builder_stable_10
root@:~ # cli
root> show chassis hardware
Hardware inventory:
Item             Version  Part number  Serial number     Description
Chassis                                VM57DD8115C8      VMX
Midplane
Routing Engine 0                                         RE-VMX
CB 0                                                     VMX SCB
CB 1                                                     VMX SCB
FPC 0                                                    Virtual FPC
CPU            Rev. 1.0 RIOT         123XYZ987
MIC 0                                                  Virtual
    PIC 0                 BUILTIN      BUILTIN           Virtual

ちゃんとFPC 0が登録されています。

設定と疎通確認

ここまでは、物理で言うとモジュールの認識が終わったところまでです。

いつも通り、設定を入れて疎通を確認してみます。

VFP

configure
set interfaces ge-0/0/0 unit 0 family inet address 172.16.0.1/24
set interfaces ge-0/0/1 unit 0 family inet address 172.17.0.1/24
commit

ubuntu1604-1

sudo ip link set up ens4
sudo ip add add 172.16.0.2/24 dev ens4
sudo ip route add 172.17.0.0/24 via 172.16.0.1

ubuntu1604-2

sudo ip link set up ens4
sudo ip add add 172.17.0.2/24 dev ens4
sudo ip route add 172.16.0.0/24 via 172.17.0.1

疎通確認

ubuntu1604-2から疎通確認:

$ ping -c 5 172.16.0.2
PING 172.16.0.2 (172.16.0.2) 56(84) bytes of data.
64 bytes from 172.16.0.2: icmp_seq=1 ttl=63 time=25.0 ms
64 bytes from 172.16.0.2: icmp_seq=2 ttl=63 time=1.04 ms
64 bytes from 172.16.0.2: icmp_seq=3 ttl=63 time=1.13 ms
64 bytes from 172.16.0.2: icmp_seq=4 ttl=63 time=1.05 ms
64 bytes from 172.16.0.2: icmp_seq=5 ttl=63 time=1.02 ms

--- 172.16.0.2 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4005ms
rtt min/avg/max/mdev = 1.026/5.867/25.072/9.602 ms
$ tracepath 172.16.0.2
1?: [LOCALHOST]                                         pmtu 1500
1:  172.17.0.1                                            0.567ms
1:  172.17.0.1                                            0.679ms
2:  172.16.0.2                                            0.701ms reached
    Resume: pmtu 1500 hops 2 back 2

はい、このように疎通も確認できました。

VFPの状態とか見てみたりする

インターフェース:

root> show interfaces terse | no-more
Interface               Admin Link Proto    Local                 Remote
ge-0/0/0                up    up
ge-0/0/0.0              up    up   inet     172.16.0.1/24
                                multiservice
lc-0/0/0                up    up
lc-0/0/0.32769          up    up   vpls
pfe-0/0/0               up    up
pfe-0/0/0.16383         up    up   inet
                                inet6
pfh-0/0/0               up    up
pfh-0/0/0.16383         up    up   inet
pfh-0/0/0.16384         up    up   inet
ge-0/0/1                up    up
ge-0/0/1.0              up    up   inet     172.17.0.1/24
                                multiservice
ge-0/0/2                up    down
ge-0/0/3                up    down
ge-0/0/4                up    down
ge-0/0/5                up    down
ge-0/0/6                up    down
ge-0/0/7                up    down
ge-0/0/8                up    down
ge-0/0/9                up    down
cbp0                    up    up
demux0                  up    up
dsc                     up    up
em1                     up    up
em1.0                   up    up   inet     10.0.0.4/8
                                            128.0.0.1/2
                                            128.0.0.4/2
                                inet6    fe80::25b:27ff:fe80:2101/64
                                            fec0::a:0:0:4/64
                                tnp      0x4
em2                     up    up
em3                     up    up
esi                     up    up
fxp0                    up    up
gre                     up    up
ipip                    up    up
irb                     up    up
jsrv                    up    up
jsrv.1                  up    up   inet     128.0.0.127/2
lo0                     up    up
lo0.16384               up    up   inet     127.0.0.1           --> 0/0
lo0.16385               up    up   inet
lsi                     up    up
mtun                    up    up
pimd                    up    up
pime                    up    up
pip0                    up    up
pp0                     up    up
rbeb                    up    up
tap                     up    up
vtep                    up    up

ルーティングテーブル:

root> show route

inet.0: 4 destinations, 4 routes (4 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

172.16.0.0/24      *[Direct/0] 00:03:26
                    > via ge-0/0/0.0
172.16.0.1/32      *[Local/0] 00:03:26
                    Local via ge-0/0/0.0
172.17.0.0/24      *[Direct/0] 00:03:26
                    > via ge-0/0/1.0
172.17.0.1/32      *[Local/0] 00:03:26
                    Local via ge-0/0/1.0

ちゃんと見えましたね。ずらぁー(鳴き声)

おしまい

vMXをGNS3で動かすことができました。

これを使って簡単にネットワークをエミュレーション、とはいかないかもしれませんが、どこまで活用できるか考えてみるのは楽しいことです。

秋の夜長とか言いながら試し始めたんですけど、冷静に考えて夜長って夜更かしのことじゃないことに気付きました。

おわり。

付録

GNS3とは無関係に欲しい人がいるかもしれないので、GNS3が生成したqemuコマンドの引数載せておきますね。HDDは差分ディスクになってるから分かりにくいけど。:

$ ps ax | grep [v]MX_VCP-1
4026 pts/9    Sl+    5:57 /usr/bin/qemu-system-x86_64 -name vMX_VCP-1 -m 1024M -smp cpus=1 -enable-kvm -boot order=c -drive file=/home/yuki/GNS3/projects/vMX_VPLS/project-files/qemu/e0a1e7a9-9637-4b87-833f-147ad6684288/hda_disk.qcow2,if=ide,index=0,media=disk -drive file=/home/yuki/GNS3/projects/vMX_VPLS/project-files/qemu/e0a1e7a9-9637-4b87-833f-147ad6684288/hdb_disk.qcow2,if=ide,index=1,media=disk -drive file=/home/yuki/GNS3/projects/vMX_VPLS/project-files/qemu/e0a1e7a9-9637-4b87-833f-147ad6684288/hdc_disk.qcow2,if=ide,index=2,media=disk -serial telnet:127.0.0.1:5000,server,nowait -monitor tcp:127.0.0.1:37134,server,nowait -net none -device virtio-net-pci,mac=00:65:58:42:88:00,netdev=gns3-0 -netdev socket,id=gns3-0,udp=127.0.0.1:10017,localaddr=127.0.0.1:10016 -device virtio-net-pci,mac=00:65:58:42:88:01,netdev=gns3-1 -netdev socket,id=gns3-1,udp=127.0.0.1:10005,localaddr=127.0.0.1:10004 -device virtio-net-pci,mac=00:65:58:42:88:02 -device virtio-net-pci,mac=00:65:58:42:88:03
$ ps ax | grep [v]MX_VFP-1
5563 pts/9    Sl+  162:31 /usr/bin/qemu-system-x86_64 -name vMX_VFP-1 -m 4096M -smp cpus=3 -enable-kvm -boot order=c -drive file=/home/yuki/GNS3/projects/vMX_VPLS/project-files/qemu/15ecaa0e-63a7-448b-bb5e-034209b4e147/hda_disk.qcow2,if=ide,index=0,media=disk -serial telnet:127.0.0.1:5001,server,nowait -monitor tcp:127.0.0.1:52958,server,nowait -net none -device virtio-net-pci,mac=00:65:58:e1:47:00,netdev=gns3-0 -netdev socket,id=gns3-0,udp=127.0.0.1:10023,localaddr=127.0.0.1:10022 -device virtio-net-pci,mac=00:65:58:e1:47:01,netdev=gns3-1 -netdev socket,id=gns3-1,udp=127.0.0.1:10004,localaddr=127.0.0.1:10005 -device virtio-net-pci,mac=00:65:58:e1:47:02,netdev=gns3-2 -netdev socket,id=gns3-2,udp=127.0.0.1:10000,localaddr=127.0.0.1:10001 -device virtio-net-pci,mac=00:65:58:e1:47:03,netdev=gns3-3 -netdev socket,id=gns3-3,udp=127.0.0.1:10008,localaddr=127.0.0.1:10009 -device virtio-net-pci,mac=00:65:58:e1:47:04 -device virtio-net-pci,mac=00:65:58:e1:47:05 -device virtio-net-pci,mac=00:65:58:e1:47:06,netdev=gns3-6 -netdev socket,id=gns3-6,udp=127.0.0.1:10028,localaddr=127.0.0.1:10029 -device virtio-net-pci,mac=00:65:58:e1:47:07