💾

IOSXRvをvagrant-libvirtとKVMで一発起動する

2021/05/10に公開

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

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

  • iosxrv-k9-demo-5.3.3.ova
  • libvirt 4.5.0
  • vagrant 2.2.15
  • vagrant-libvirtプラグイン 0.4.1

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

ovaイメージファイルからvmdkイメージファイルを取り出し、qcow2イメージファイルに変換する。

$ tar xvf iosxrv-k9-demo-5.3.3.ova
iosxrv-k9-demo.ovf
iosxrv-k9-demo.mf
iosxrv-demo.vmdk

$ qemu-img convert -f vmdk -O qcow2 iosxrv-demo.vmdk iosxrv-k9-demo-5.3.3.qcow2

$ ls
iosxrv-demo.vmdk  iosxrv-k9-demo-5.3.3.ova  iosxrv-k9-demo-5.3.3.qcow2  iosxrv-k9-demo.mf  iosxrv-k9-demo.ovf

変換されたqcow2イメージファイルからIOSXRvイメージを起動する。
起動されるとそのままコンソールに接続されるので、Enter root-system username:とプロンプトが表示されるまで待つ。

$ virt-install \
    --connect qemu:///system \
    --name=iosxrv \
    --vcpus=1 \
    --ram=2048 \
    --disk path=iosxrv-k9-demo-5.3.3.qcow2,format=qcow2,bus=ide,cache=writethrough \
    --network network=vagrant-libvirt,model=e1000 \
    --nographics \
    --import
WARNING  No operating system detected, VM performance may suffer. Specify an OS with --os-variant for optimal results.

Starting install...
Connected to domain iosxrv
Escape character is ^]

                             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ファイル作成にあたって、事前にshutdownさせておく必要がある。

$ virsh list --all
 Id    Name                           State
----------------------------------------------------
 1     iosxrv                         running

$ virsh destroy iosxrv
Domain iosxrv destroyed

$ virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     iosxrv                         shut off

boxファイル用にmetadata.jsonを作成する。

$ cat <<EOL> metadata.json
{"provider":"libvirt","format":"qcow2","virtual_size":4}
EOL

vagrant-libvirtのメンテナがqcow2イメージファイルをboxファイルへ変換する素敵スクリプトを作成してくれているため、ありがたく利用させてもらう。

$ curl -O https://raw.githubusercontent.com/vagrant-libvirt/vagrant-libvirt/master/tools/create_box.sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3261  100  3261    0     0   3769      0 --:--:-- --:--:-- --:--:--  3769

$ chmod +x create_box.sh

$ ./create_box.sh iosxrv-k9-demo-5.3.3.qcow2
{4}
==> Creating box, tarring and gzipping
./metadata.json
./Vagrantfile
./box.img
Total bytes written: 672317440 (642MiB, 94MiB/s)
==> iosxrv-k9-demo-5.3.3.box created
==> You can now add the box:
==>   'vagrant box add iosxrv-k9-demo-5.3.3.box --name iosxrv-k9-demo-5.3.3'

この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 'libvirt'!

$ vagrant box list
iosxrv/5.3.3       (libvirt, 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

  config.vm.provider :libvirt do |domain|
    domain.cpus = 1
    domain.memory = 2048
    domain.driver = "kvm"
    domain.disk_bus = "ide"
    domain.nic_model_type = "e1000"
  end
end
EOL

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

$ vagrant up
Bringing machine 'default' up with 'libvirt' provider...
==> default: Uploading base box image as volume into Libvirt storage...
==> default: Creating image (snapshot of base box volume).
==> default: Creating domain with the following settings...
==> default:  -- Name:              vagrant_default
==> default:  -- Domain type:       kvm
==> default:  -- Cpus:              1
==> default:  -- Feature:           acpi
==> default:  -- Feature:           apic
==> default:  -- Feature:           pae
==> default:  -- Clock offset:      utc
==> default:  -- Memory:            2048M
==> default:  -- Management MAC:
==> default:  -- Loader:
==> default:  -- Nvram:
==> default:  -- Base box:          iosxrv-5.3.3
==> default:  -- Storage pool:      default
==> default:  -- Image:             /var/lib/libvirt/images/vagrant_default.img (4G)
==> default:  -- Disk driver opts:  cache='default'
==> default:  -- Kernel:
==> default:  -- Initrd:
==> default:  -- Graphics Type:     vnc
==> default:  -- Graphics Port:     -1
==> default:  -- Graphics IP:       127.0.0.1
==> default:  -- Graphics Password: Not defined
==> default:  -- Video Type:        cirrus
==> default:  -- Video VRAM:        9216
==> default:  -- Sound Type:
==> default:  -- Keymap:            en-us
==> default:  -- TPM Backend:       passthrough
==> default:  -- TPM Path:
==> default:  -- INPUT:             type=mouse, bus=ps2
==> default: Creating shared folders metadata...
==> default: Starting domain.
==> default: Waiting for domain to get an IP address...
==> default: Waiting for SSH to become available...

無事に起動すれば以下ように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.121.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.121.191 Up                    Up

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

$ telnet 192.168.121.191
Trying 192.168.121.191...
Connected to 192.168.121.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! 🎉

Discussion