横浜539のブログ

技術ブログっぽい雑記。

KVM初学者がvJunos-routerをインストールしてみた。

今年(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を準備します。
今回は作業の前提として、以下の環境を準備しています。

  • OS : Ubuntu 22.04.4 LTS
  • Ubuntuのユーザー名は「user」
  • Ubuntuはインターネットへ接続可能
  • ネットワーク構成
eth0 fxp0用の物理IF(兼Ubuntuのインターネット通信用ポート)
eth1 ge-0/0/0用の物理IF
eth2 ge-0/0/1用の物理IF

 
それでは実際の作業に入っていきます。
まず、(念のため)KVMが利用可能か調べます。

$ sudo egrep -c '(vmx|svm)' /proc/cpuinfo
16
//0でなければOK
$ sudo kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used
//使えそうならOK

 
次に必要なソフトをインストールします。念のため、パッケージのアップデートをその前にやります。

$ sudo apt update
$ sudo apt dist-upgrade
$ sudo apt install -y qemu-kvm virt-manager libvirt-daemon-system virtinst libvirt-clients bridge-utils

 

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 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