GNS3でvMX(VCP/VFP)を動かすぞい。
Posted on 2016/09/18(Sun) 03:15 in technical
今回の話題
以前、個人アカウントでvMX Trialのダウンロードができるようになった話 をしたんですけど、GNS3でvMXの動作確認が取れたので、ここに書き残しておきます。
簡単な解説
簡単ですが前置きを。
vMX Trialで入手可能なvMXは、以下の図のように制御プレーンと転送プレーンが分離しています。
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の設定画面では、こんな風になれば良いです。画像がない部分はデフォルトでオッケー。
通報
今回は vCPU 2, 2GB RAM にしていますが、必要要件は vCPU 1, 1GB RAM なので、もう少し絞ってもいいと思います。
備考
ここで、HDDの順番を以下のように設定します。これ重要。
- junos-vmx-x86-64-16.1R1.7.qcow2
- vmxhdd.img
- metadata_usb.img
通報
VCPのvNICも4つになっていますが、必要要件は2つなので、これも削っていいと思います。
Typeも、とりあえずe1000で動作確認しましたが、OSが認識するなら何でもいいはずです。
VFP
次にVFP。こっちはNICタイプだけ注意。
通報
今回は vCPU 3, 8GB RAM にしていますが、必要要件は vCPU 3, 4GB RAM なので、もう少し絞ってもいいと思います。
通報
HDDは vFPC-20160617.img を1つだけ。
備考
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を打つだけなので、手元の環境で都合の良いものを適当にどうぞ。
そして起動。
一応、操作と動作進捗確認のため、GNS3のコンソールを開いておきましょう。
同時に起動すると、おそらくVFPの方が早く立ち上がります。
VCPが自動的にVFPを検出して登録するので、VCPの起動を待ちます。
備考
VCPがVFPを検出すると、VFP側でDPDKの初期化が始まります。
この時、VFPのNIC Typeがvirtioではない場合、転送サービスの起動コマンドの引数が --rx "" とかになって動きません。
DPDK的には当たり前ですが、vCPUも1つとか2つしか無かったら同じように転送サービスがエラー吐いて止まります。
無事にVFPが検出されて転送サービスが起動すると、こんな感じの出力になると思います。
今度は、VCPにログインして、VFPが認識されていることを確認します。
テキストで貼るとこんな感じです。:
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