IOSXRvをvagrantとVirtualBoxで一発起動する

11 min read読了の目安(約10300字

VirtualBox環境でのIOSXRv検証を容易にするため、vagrantで一発起動できるようにしたい。

本記事ではVirtualBoxとvagrantが事前にインストールされていることを前提とする。IOSXRvイメージファイルはCiscoサイトから取得可能だが、CiscoのパートナーとなりCisco.com IDにService Contractを設定しておく必要がある。
以下では、次のソフトウェアを利用し動作を確認している。

  • Windows 10 with WSL
  • iosxrv-k9-demo-5.3.3.ova
  • VirtualBox 6.1.20
  • vagrant 2.2.15

IOSXRvのbaseイメージを作成する

iosxrv-k9-demo-5.3.3.ovaイメージファイルをダブルクリック等で起動する。
ova拡張子がVirtualBoxに関連付けられている環境であれば、仮想アプライアンスのインポートが開始される。

ここでは以下のようにCPUを1, RAMを2048MB程度に設定しておく。ネットワークアダプタは初期状態で8個作成されることになるが、この時点ではMgmtEthとなる最初のひとつ以外は必要ないためチェックボックスを外しておく。最後にインポートをクリックする。

virtualboxにovaイメージファイルを登録

無事にインポートが完了したのち、NamedPipe機構を利用したコンソールを追加するため作成されたイメージから設定(S)をクリックする。以下イメージのようにシリアルポートタブを選択し、ポートモード(M)ホストにパイプを選択、存在するパイプ/ソケットに接続(C)のチェックを外し、パス/アドレス(P)欄には\\.\pipe\iosxrvと記載する。

virtualboxからコンソールを設定する

さて、コンソールに接続するためにはNamedPipeをアタッチする必要があるが、ここでは
NamedPipeをTCPポートに変換してくれるNamed Pipe TCP Proxyを利用する。サイトからソフトウェアをダウンロードしてインストール。
Named Pipe TCP Proxy起動後の設定画面から、以下のように\\.\pipe\iosxrv9001/tcpにプロキシさせる。
Named Pipe TCP Proxyを設定する

さて、この状態でVirtualBoxからcom.cisco.ios-xrvイメージの起動(T)をクリックし、直後にWSL等のターミナルから以下のように9001/tcpにtelnetアクセスすることでコンソールに起動ログが流れ始める。
Enter root-system username:とプロンプトが表示されるまで待つ。

$ telnet localhost 9001

                             GNU GRUB  version 2.00

 +--------------------------------------------------------------------------+
 |IOS XRv                                                                   |
 |                                                                          |
 |                                                                          |
 |                                                                          |
 |                                                                          |
 |                                                                          |
 |                                                                          |
 |                                                                          |
 |                                                                          |
 |                                                                          |
 |                                                                          |
 +--------------------------------------------------------------------------+

      Use the ^ and v keys to select which entry is highlighted.
      Press enter to boot the selected OS, `e' to edit the commands
      before booting or `c' for a command-line. ESC to return
      previous menu.

...snip...

root-systemに設定するusername/secretはどちらもvagrantとしておく。このusername/secretがadmin-configに設定され、vagrantからアクセスする際に利用される。

!!!!!!!!!!!!!!!!!!!! NO root-system username is configured. Need to configure root-system username. !!!!!!!!!!!!!!!!!!!!

         --- Administrative User Dialog ---


  Enter root-system username: vagrant
  Enter secret:

VMにログインするにはここからさらに少し待つ必要がある。
次のようにプロンプトが表示されると、ようやく設定済みのvagrantユーザでログインできるようになる。

User Access Verification

Username: vagrant
Password:


RP/0/0/CPU0:ios#

それでは、ここからIOSXRvイメージの初期コンフィグを投入していく。

RP/0/0/CPU0:ios#configure
RP/0/0/CPU0:ios(config)#hostname iosxrv
RP/0/0/CPU0:ios(config)#aaa authentication login default local
RP/0/0/CPU0:ios(config)#ssh server v2
RP/0/0/CPU0:ios(config)#ssh server logging
RP/0/0/CPU0:ios(config)#telnet vrf default ipv4 server max-servers 15
RP/0/0/CPU0:ios(config)#interface MgmtEth 0/0/CPU0/0 ipv4 address dhcp
RP/0/0/CPU0:ios(config)#no interface MgmtEth 0/0/CPU0/0 shutdown
RP/0/0/CPU0:ios(config)#commit
RP/0/0/CPU0:ios(config)#exit

外部からのsshアクセスを可能にするためには、さらにIOSXRvイメージにキーペアを作成しておく必要があるので忘れずに。

RP/0/0/CPU0:iosxrv#crypto key generate rsa

The name for the keys will be: the_default
  Choose the size of the key modulus in the range of 512 to 4096 for your General Purpose Keypair. Choosing a key modulus greater than 512 may take a few minutes.

How many bits in the modulus [1024]:
Generating RSA keys ...
Done w/ crypto generate keypair
[OK]

設定がすべて完了すれば以下のようになる。

RP/0/0/CPU0:iosxrv#show running-config
Building configuration...
!! IOS XR Configuration 5.3.3
!! No configuration change since last restart
!
hostname iosxrv
telnet vrf default ipv4 server max-servers 15
aaa authentication login default local
interface MgmtEth0/0/CPU0/0
 ipv4 address dhcp
!
ssh server v2
ssh server logging
end

RP/0/0/CPU0:iosxrv#admin show running-config
Building configuration...
!! IOS XR Admin Configuration 5.3.3
username vagrant
 group root-system
 secret 5 $1$gszu$edh0GNZQTZe7mfx8QNBk.1
!
end

RP/0/0/CPU0:iosxrv#show crypto key mypubkey rsa
Key label: the_default
Type     : RSA General purpose
Size     : 1024
Created  : 00:00:00 UTC Mon May 10 2021
Data     :
 30819F30 0D06092A 864886F7 0D010101 05000381 8D003081 89028181 00CE553D
 F00E7081 DCA54B0A 1CC81CAE 038B289E 802D295C CEAB8244 3D8A0C2C 706CD6D2
 FEDC0EA7 2A928F02 41D1F82D B0E41E57 292575E5 81F9FC78 3399D649 E6C248D0
 76B06369 F1EA3DCB B9BA8F39 89C4A0C4 63B3529D 42A9BC83 102A4FBB 938C4CD0
 836BA6A9 E35D089B 349F65E5 4D37F482 1C187E36 88B92D11 54241F28 A5020301
 0001

IOSXRv baseイメージからvagrant boxファイルを作成する

IOSXRvイメージはboxファイル作成にあたって、事前にVirtualBoxからshutdownさせておく必要がある。

まずはboxファイルを作成するために必要なVagrantfileを作成する。

$ cat <<EOL> embedded_vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  config.vm.synced_folder ".", "/vagrant", disabled: true
  config.vm.boot_timeout = 400

  config.ssh.username = "vagrant"
  config.ssh.password = "vagrant"
  config.ssh.insert_key = false
end
EOL

続いて、以下のコマンドでIOSXRvイメージからboxファイルを作成する。

$ vagrant pacakge --base com.cisco.ios-xrv --output iosxrv-k9-demo-5.3.3.box --vagrantfile embedded_vagrantfile
==> com.cisco.ios-xrv: Exporting VM...
==> com.cisco.ios-xrv: Compressing package to: /tmp/iosxrv/iosxrv-k9-demo-5.3.3.box
==> com.cisco.ios-xrv: Packaging additional file: embedded_vagrantfile

このboxファイルをvagrantに登録する。boxの名前はここではiosxrv/5.3.3とする。

$ vagrant box add iosxrv-k9-demo-5.3.3.box --name iosxrv/5.3.3
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'iosxrv/5.3.3' (v0) for provider:
    box: Unpacking necessary files from: file:///tmp/iosxrv/iosxrv-k9-demo-5.3.3.box
==> box: Successfully added box 'iosxrv/5.3.3' (v0) for 'virtualbox'!

$ vagrant box list
iosxrv/5.3.3       (virtualbox, 0)

vagrantからIOSXRvイメージを起動

VM起動時にもVagrantfileが必要なので、まずはこれを作成する。
IOSXRvのバージョンが(おそらく)6.0.0より古い場合、IOSXRvイメージに作成したキーペアのalgorithmはaes256-cbc, aes192-cbc, aes128-cbcでvagrantのNet::SSHが標準ではサポートしていない。そのためVagrantfileの冒頭でこれらを暫定的かつ強制的にサポートさせる記述を加えた。

$ cat <<EOL> Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

class Net::SSH::Transport::Algorithms
  DEFAULT_ALGORITHMS[:encryption].unshift('aes256-cbc', 'aes192-cbc', 'aes128-cbc')
end

Vagrant.configure(2) do |config|
  config.vm.box = "iosxrv/5.3.3"
  config.vm.boot_timeout = 400
  config.vm.synced_folder ".", "/vagrant", disabled: true

  config.ssh.username = "vagrant"
  config.ssh.password = "vagrant"
  config.ssh.insert_key = false
end
EOL

さていよいよIOSXRvイメージを起動。
イメージが正常に起動完了するまですこし時間を要するので気長に待つ。私の環境では3~4分ほど必要だった。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'iosxrv/5.3.3'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: iosxrv_default_1620643366529_81167
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: password

無事に起動すれば以下ようにvagrantからsshでログインできる。
パスワードはもちろんvagrant

$ vagrant ssh
==> default: The machine you're attempting to SSH into is configured to use
==> default: password-based authentication. Vagrant can't script entering the
==> default: password for you. If you're prompted for a password, please enter
==> default: the same password you have configured in the Vagrantfile.
vagrant@192.168.33.191's password:


RP/0/0/CPU0:iosxrv#

さて、Mgmtインタフェースに設定されているIPv4アドレスを確認してみる。

RP/0/0/CPU0:iosxrv#show ipv4 interface MgmtEth 0/0/CPU0/0 brief

Interface                      IP-Address      Status                Protocol
MgmtEth0/0/CPU0/0              192.168.33.191 Up                    Up

ホストPCからはMgmtインタフェースに設定されたこのIPv4アドレスにアクセスが可能。ためしにtelnet接続してみると以下の通り。
username/passwordはvagrant/vagrantでもよいが、IOSXRvイメージのデフォルトcisco/ciscoでもログイン可能。

$ telnet 192.168.33.191
Trying 192.168.33.191...
Connected to 192.168.33.191.
Escape character is '^]'.



IMPORTANT:  READ CAREFULLY
Welcome to the Demo Version of Cisco IOS XRv (the "Software").
The Software is subject to and governed by the terms and conditions
of the End User License Agreement and the Supplemental End User
License Agreement accompanying the product, made available at the
time of your order, or posted on the Cisco website at
www.cisco.com/go/terms (collectively, the "Agreement").
As set forth more fully in the Agreement, use of the Software is
strictly limited to internal use in a non-production environment
solely for demonstration and evaluation purposes.  Downloading,
installing, or using the Software constitutes acceptance of the
Agreement, and you are binding yourself and the business entity
that you represent to the Agreement.  If you do not agree to all
of the terms of the Agreement, then Cisco is unwilling to license
the Software to you and (a) you may not download, install or use the
Software, and (b) you may return the Software as more fully set forth
in the Agreement.


Please login with any configured user/password, or cisco/cisco


User Access Verification

Username: cisco
Password:


RP/0/0/CPU0:iosxrv#

あとはnetconf設定を追加してみたり、好きに検証を進めればよい。

起動したVMを停止・削除する方法は下記。

$ vagrant halt
$ vagrant destroy -f

Enjoy! 🎉