今年(2024年)の初めにvJunos-routerがリリースされました。
www.juniper.net
vJunos-routerは(上の公式の説明でも書いてある通り)ラボでの利用を想定したテスト用の仮想ルーターとなります。
これがあればJunosの勉強が捗る…!という訳で使ってみました。
公式の要件を見ると仮想化ソフトウェアは「QEMU-KVM」のみサポートで、今までQEMU-KVMを触ったことない私にとってなかなかなハードルでした。
実際インストール(デプロイ)してみたら、公式の説明があんまりイケてなく初学者な私の力不足で色々つまづいたので、仮想ルーターをコンソールで操作できるまでの手順をまとめました。
なお、制限事項やインストール要件などはこの記事では省略します。公式の説明をご覧ください。
まず、公式サイトからvJunos-routerのVMイメージとXML形式の定義ファイルをダウンロードします。
サーチバーに「vjunos」と入力すればサジェストされてvJunos-routerが出てきます。
Application PackageのvJunos-Router KVM imageとApplication ToolsのvJunos-Router libvirt XMLをダウンロードします。
なお、アカウントは作成しなくともダウンロードできます。
今回ダウンロードした際、ファイル名は「vJunos-router-23.2R1.15.qcow2」と「vjunos-router-23.2R1.15.xml」でした。
インストールするホストLinuxを準備します。
今回は作業の前提として、以下の環境を準備しています。
eth0 | fxp0用の物理IF(兼Ubuntuのインターネット通信用ポート) |
eth1 | ge-0/0/0用の物理IF |
eth2 | ge-0/0/1用の物理IF |
それでは実際の作業に入っていきます。
まず、必要なソフトをインストールします。念のため、パッケージのアップデートをその前にやります。
$ sudo apt update $ sudo apt dist-upgrade $ sudo apt install -y qemu-kvm virt-manager libvirt-daemon-system virtinst libvirt-clients bridge-utils
次に、(念のため)KVMが利用可能か調べます。
$ sudo egrep -c '(vmx|svm)' /proc/cpuinfo 16 //0でなければOK $ sudo kvm-ok INFO: /dev/kvm exists KVM acceleration can be used //使えそうならOK
libvirtdが動いているか確認します。
$ sudo systemctl status libvirtd // "Active: active (running)"が表示されてればOK
グループ「kvm」「libvirt」に自ユーザーを追加します。
コマンド投入後、いったんログアウトしないとグループ設定が有効にならないので注意。
$ sudo usermod -aG kvm $USER $ sudo usermod -aG libvirt $USER
仮想ブリッジを追加します。
/etc/netplan配下にあるyamlファイルに追記します。
$ sudo vi /etc/netplan/00-installer-config.yaml //以下を追記 bridges: ge-000: interfaces: [eth1のネットワークデバイス名] parameters: stp: false dhcp4: false dhcp6: false ge-001: interfaces: [eth2のネットワークデバイス名] parameters: stp: false dhcp4: false dhcp6: false $ sudo netplan apply //再起動 $ ip a 3: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel master ge-000 state DOWN group default qlen 1000 link/ether 12:34:56:78:90:ab brd ff:ff:ff:ff:ff:ff 4: eth2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel master ge-001 state DOWN group default qlen 1000 link/ether 34:56:78:90:ab:12 brd ff:ff:ff:ff:ff:ff 6: ge-000: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 0a:44:a5:ec:d4:52 brd ff:ff:ff:ff:ff:ff 7: ge-001: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 82:c8:2a:42:6a:c7 brd ff:ff:ff:ff:ff:ff //eth1とeth2がそれぞれge-00xに帰属して、かつge-000とge-001が作成されてればOK
念のため、brctlコマンドでも確認します。
$ brctl show bridge name bridge id STP enabled interfaces ge-000 8000.0a44a5ecd452 no eth1 ge-001 8000.82c82a426ac7 no eth2 virbr0 8000.525400e1fa2e yes //ge-000がeth1、ge-001がeth2に紐づけられてばOK
あらかじめ仮想IFのリンクをアップしておきます。
(ip aをしても何故かDOWNのままでした…)
$ sudo ip link set ge-000 up $ sudo ip link set ge-001 up
先ほどダウンロードしたVMイメージをUbuntuにアップロードします。
保存先ディレクトリはお好みで。
念のため、ファイル権限を変更しておきます(もしかしたら必要ない設定かも)
//SFTPとかでVMイメージをUbuntuにアップロードする $ ls /home/user/vjunos-router/* /home/user/vjunos-router/vJunos-router-23.2R1.15.qcow2 $ sudo chmod 755 /home/user/vjunos-router/vJunos-router-23.2R1.15.qcow2 $ ls -l /home/user/vjunos-router/* -rwxr-xr-x 1 user libvirt 3971612672 May 3 03:05 /home/user/vjunos-router/vJunos-router-23.2R1.15.qcow2
VM作成時に用いる定義ファイルを用意します。
先ほどダウンロードしたXMLファイルをUbuntuにアップロードしてもいいですし、ファイルを作成して中身のコードをベタ貼りでもいいかと。
(横着な私は後者で用意しました)
$ cd /etc/libvirt/qemu/ $ sudo touch vjunos-router-01.xml //ダウンロードした「vjunos-router-23.2R1.15.xml」の中身をviとかでコピペ
定義ファイルの中身をカスタマイズします。
$ sudo vi /etc/libvirt/qemu/vjunos-router-01.xml 9行目 変更 <name>vjunos-rtr1</name>→ <name>vjunos-router-01</name> 40行目 変更 type="qcow2”の <source file="/root/vjunos-rtr1-live.qcow2"/>→ <source file="/home/user/vjunos-router/vJunos-router-23.2R1.15.qcow2"/> //VMイメージを置いているディレクトリパスを指定 43行目-47行目 削除 <disk device="disk" type="file"> <driver cache="writeback" name="qemu" type="raw"/> <source file="/root/config.img"/> <target dev="sda" bus="usb"/> </disk> 47行目 変更 <source dev='eno1' mode='bridge'/>→ <source dev='eth0' mode='bridge'/> 63行目 変更 ge-001の <alias name="net1"/>→ <alias name="net2"/>
運よくダウンロードしたXMLファイルに定義しているIFはfxp含めて3つだったので、IF数は変更していません。
たくさんIFを用意したい人は、その分定義する必要があります。
定義ファイルよりVMを生成します。
$ sudo virsh define /etc/libvirt/qemu/vjunos-router-01.xml $ virsh list --all Id Name State ----------------------------------- - vjunos-router-01 shut off //"vjunos-router-01"が表示されればOK
このままVMを立ち上げようとすると、パーミッションエラーになります(ここで結構ハマった…)
以下2つのファイルを編集します。
$ sudo vi /etc/libvirt/qemu.conf 変更 #user = "root"→ user = "user" //コメントアウト解除してユーザー名を変更 変更 #group = "root"→ group = "libvirt" //コメントアウト解除してグループ名を変更 変更 #dynamic_ownership = 1 dynamic_ownership = 1 //コメントアウト解除
$ sudo vi /etc/libvirt/libvirtd.conf 変更 #unix_sock_group = "libvirt"→ unix_sock_group = "libvirt" //コメントアウト解除 変更 #unix_sock_ro_perms = "0777"→ unix_sock_ro_perms = "0777" //コメントアウト解除 変更 #unix_sock_rw_perms = "0770"→ unix_sock_rw_perms = "0770" //コメントアウト解除
libvirtdを再起動して、VMを起動します。
$ sudo systemctl restart libvirtd.service $ virsh start vjunos-router-01 $ sudo virsh list --all Id Name State ---------------------------------- 1 vjunos-router-01 running //"running"が表示されればOK
シリアルコンソール接続して確かめます。
$ sudo telnet localhost 8610 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. FreeBSD/amd64 (Amnesiac) (ttyu0) login: root Last login: Thu May 2 17:13:22 on ttyu0 --- JUNOS 23.2R1.15 Kernel 64-bit JNPR-12.1-20230815.735906f_buil root@:~ # cli root> show version Model: vmx Junos: 23.2R1.15 : :
なお、vJunos-routerのコンソールから抜けたい場合は、「Ctrl+]」でtelnet>プロンプトとなり、「q」でUbuntuに戻ります。
他のJuniper製品と同様、ユーザー名はroot、パスは無しでログインできます。
eth0はfxp0となっているため、IPアドレス設定をすれば、他の端末からアクセスできます。
またge-0/0/0とge-0/0/1に設定投入すれば、eth1とeth2に接続した外部の物理マシンとも通信できます。
色々検証してみましょう!!
VMを落とす際は(Junosと)virshのshutdownコマンドを忘れずに…。
$ sudo virsh shutdown vjunos-router-01 $ virsh list --all Id Name State ----------------------------------- - vjunos-router-01 shut off //"shut off"になってればOK
◆おまけ◆
vJunos-routerにすぐ入れた方がいい設定。
delete chassis auto-image-upgrade delete interfaces fxp0 unit 0 //MGMT IPアドレスは静的に設定しましょう delete protocols