IOSXRvをvagrant-libvirtとKVMで一発起動する
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