Proxmox VEでvJunos-switchを動かしてみる

## はじめに

2023年4月から、NW装置ベンダーとして知られるJuniper社がvJunos-switchという仮想アプライアンスを公開しました。  
NW装置の自動化に取り組む可能性のある人にとっては、とてもありがたい出来事です。

Juniperのアカウントを持っていなくてもダウンロードできるので、早速仮想イメージを取得してProxmox VE上でも動かせるようにしてみることにします。

## 仮想イメージの取得

まず [Juniper - Support - Downloads](https://support.juniper.net/support/downloads/?p=vjunos) から vJunos-switch KVM image を選択して、ライセンスに同意したらダウンロードしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613240/fa0c0086-d111-a923-0e07-755b4091fa6a.png)

あとは数GBのファイルが降ってくるのを待つだけです。

## 仮想イメージの取り込み

Proxmox VEはKVMベースなので、作成した仮想マシンに取得したqcow2をインポートして完了です。  
Proxmox VEにrootでSSHログインしたら、以下のコマンドを順に実行します。  
この時 `vjunos-switch-23.1R1.8.qcow2` はコマンドを実行するのと同じディレクトリに格納済みとします。

```
qm create 2051 --cores 4 --memory 8192 --cpu host
qm importdisk 2051 vjunos-switch-23.1R1.8.qcow2 local-lvm
qm set 2051 --name vjunos-switch-23.1R1.8
qm set 2051 --scsihw virtio-scsi-pci --virtio0 local-lvm:vm-2051-disk-0
qm set 2051 --boot order=virtio0 --ostype l26
# fxp0
qm set 2051 --net0 virtio,bridge=vmbr0
# ge-0/0/{0-3}
qm set 2051 --net1 virtio,bridge=vmbr0
qm set 2051 --net2 virtio,bridge=vmbr0
qm set 2051 --net3 virtio,bridge=vmbr0
qm set 2051 --net4 virtio,bridge=vmbr0
qm set 2051 -serial0 socket
# Set -smbios product="VM-VEX"
SMBIOS_UUID=$(qm config 2051 | grep smbios1 | grep -o "uuid=.*")
qm set 2051 --smbios1 "base64=1,product=$(printf 'VM-VEX'|base64),${SMBIOS_UUID}"
```

ハードウェア要求は [Minimum Hardware and Software Requirements](https://www.juniper.net/documentation/us/en/software/vJunos/vjunos-switch-deployment-guide-for-kvm/vJunos-switch-kvm/topics/vJunos-switch-kvm-hw-requirements.html) を見ながら決定します。  

* CPU
    * VCPに1コア、VFPに3コア割り当てられるので最低4 vCPU必要です
    * vJunos-switchはnested-VMとなるので `--cpu host` でCPU機能を直接見せています
    * 今回は4コア
* Memory
    * VCPに2GB、VFPに3GB必要なので、最低5GB必要です
    * 今回は適当に8GB割り当てました
* NIC
    * 1つ目のネットワークインターフェースが管理ポート(fxp0)
    * 2つ目以降のネットワークがge-0/0/0から連番で割り当てられます
* Serial:
    * Serialポートをセットしておくと、Proxmox VEのホストから `qm terminal` コマンドでコンソール接続できます
* その他(smbios)
    * smbiosに `product="VM-VEX"` というマジックワードが必要です。これが無いと起動しません
    * Proxmox VEの場合は、CLIで設定する場合base64で符号化する必要があります

smbiosをGUI(WebUI)から設定する場合は、下図のように設定可能です。（ここではbase64は不要）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613240/df3713d9-1e15-cc7d-5264-290ca2e2afca.png)

念のため、ホストのCPU情報は以下の通り。（1つ目だけ）

```
# head -28 /proc/cpuinfo 
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 106
model name      : Intel(R) Xeon(R) Silver 4310 CPU @ 2.10GHz
stepping        : 6
microcode       : 0xd000390
cpu MHz         : 3300.000
cache size      : 18432 KB
physical id     : 0
siblings        : 24
core id         : 0
cpu cores       : 12
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 27
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 pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single intel_ppin ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect wbnoinvd dtherm ida arat pln pts avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid fsrm md_clear pconfig flush_l1d arch_capabilities
vmx flags       : vnmi preemption_timer posted_intr invvpid ept_x_only ept_ad ept_1gb flexpriority apicv tsc_offset vtpr mtf vapic ept vpid unrestricted_guest vapic_reg vid ple shadow_vmcs pml ept_mode_based_exec tsc_scaling
bugs            : spectre_v1 spectre_v2 spec_store_bypass swapgs mmio_stale_data eibrs_pbrsb
bogomips        : 4200.00
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 57 bits virtual
power management:

```

## 起動

それでは、起動して動作を確認してみます。

```
qm start 2051
qm terminal 2051
```

良いですね。起動シーケンスに入りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613240/afa7190c-4ae7-754b-4582-c33c4506ae6b.png)

パッケージの展開などで少し時間がかかります。  
起動シーケンスが完了すると、おなじみのログインプロンプトになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613240/3885ba70-6310-ca62-ef31-5d2d05a00110.png)

## 初回ログインと設定など

初回起動時は `root` でログインできます。

Juniperの初回起動後の設定については、この記事では詳しく扱いませんが、設定モードに入るのは以下の通り。

```
root@:~ # cli
root> configure 
```

最低限の設定としては、rootのパスワード設定、余計な自動設定機能の無効化、管理IPを設定してSSHを有効にする。くらいでしょうか。

```
delete chassis auto-image-upgrade 
delete protocols router-advertisement 
delete interfaces fxp0 unit 0
set system root-authentication plain-text-password
set interfaces fxp0 unit 0 family inet address 192.168.122.21/24
set system services ssh 
```

ここまで設定すると、自動設定機能によって繰り返されていたエラーログが収まります。（アドレスは例示です）

インターフェースの状態も確認してみましょう。

仮想NICは存在するポートだけがLink up状態になります。  
今回はインターフェースを5つ（net0～net5）設定しているので、ge-0/0/3までがup/upになります。

```
root> show interfaces terse | match ge-0/0/   
ge-0/0/0                up    up
ge-0/0/0.16386          up    up  
ge-0/0/1                up    up
ge-0/0/1.16386          up    up  
ge-0/0/2                up    up
ge-0/0/2.16386          up    up  
ge-0/0/3                up    up
ge-0/0/3.16386          up    up  
ge-0/0/4                up    down
ge-0/0/4.16386          up    down
ge-0/0/5                up    down
ge-0/0/5.16386          up    down
ge-0/0/6                up    down
ge-0/0/6.16386          up    down
ge-0/0/7                up    down
ge-0/0/7.16386          up    down
ge-0/0/8                up    down
ge-0/0/8.16386          up    down
ge-0/0/9                up    down
ge-0/0/9.16386          up    down
```

## おしまい

Proxmox VEの `qm terminal` コマンドは [Ctrl + O] で抜けることが出来ます。  
あとは必要なだけ設定するなり動かすなり、Junosの検証をしていきましょう。

特に、NW装置の設定や管理を自動化するためには、NETCONFやREST APIといった通信プロトコルの挙動を良く知る必要があります。  
Juniper社は依然として通信業界におけるパワフルなベンダーの1つであり、制御対象として卓上に上がる機会も多いことでしょう。  
そのような時に、試しに動かして通信できる相手がいることはとても心強いことです。

アカウント不要で仮想アプライアンスを活用できることは、通信業界の教育や研究活動にとって非常に心強いことです。  
この状況が続くことを心より願っております。