虚拟时代的网络新产品
随着虚拟化平台的发展,越来越多的新产品基于虚拟化平台而发布。不经意之间,十多年前默默无闻,最多也就是大家随便玩玩的东西,诸如Vmware, Virtualbox, Qemu/KVM,发展起来,成为一条完整的产品链。当然,在这过程中,也有被厂商自己玩死的,比如微软收购VirtualPC改装成的HyperV,就岌岌可危了。 诸多的基于虚拟化的产品,安装或者测试起来就更为方便,因此,衍生了诸如unetlab, eve-ng之类的虚拟化模拟实验室,可以把任何你想要的东西都装到一个平台里,进行组网或者逐个测试。 在这里,我们不在逐一拉列表,看完整的虚拟列表,只是选择性的看看思科近些年的新产品,基本上都是基于虚拟化平台发展的。 'acs'=> 'Cisco ACS', 'asa'=> 'Cisco ASA', 'asav' => 'Cisco ASAv', 'cda'=> 'Cisco Context Directory Agent', 'csr1000v' => 'Cisco CSR 1000V', 'csr1000vng' => 'Cisco CSR 1000V (Denali and Everest)', 'cips' => 'Cisco IPS', 'cucm' => 'Cisco CUCM', 'ise'=> 'Cisco ISE', 'c1710' => 'Cisco IOS 1710 (Dynamips)', 'c3725' => 'Cisco IOS 3725 (Dynamips)', 'c7200' => 'Cisco IOS 7206VXR (Dynamips)', 'iol'=> 'Cisco IOL', 'titanium' => 'Cisco NX-OSv (Titanium)', 'nxosv9k'=> 'Cisco NX-OSv 9K', 'firepower' => 'Cisco FirePower', 'firepower6' => 'Cisco FirePower 6', 'ucspe' => 'Cisco UCS-PE', 'vios' => 'Cisco vIOS', 'viosl2' => 'Cisco vIOS L2', 'vnam' => 'Cisco vNAM', 'vwlc' => 'Cisco vWLC', 'vwaas' => 'Cisco vWAAS', 'phoebe' => 'Cisco Email Security Appliance (ESA)', 'coeus' => 'Cisco Web Security Appliance (WSA)', 'xrv'=> 'Cisco XRv', 'xrv9k' => 'Cisco XRv 9000', 除了最早期适用Qemu或dynamips模拟的各种路由设备和PIX外,新增加了很多类型的虚拟化产品,如vios, iou, nxos,titan, csr1000v, xrv,asav等。其中iou和vios可以认为是VIRL里专门用于试验的ios,其余的均为正式生产和销售的产品了。 如果你有一台相当强劲的服务器,32/64G的内存,可以选择eve-ng或者unetlab,轻松灌紧各种vm,实现试验的目的。否则可以如我一样,采用qemu/kvm单独挂载。 十年的发展,qemu已经从最初的0.9发展到现在的2.9了。当年为了在qemu下实现tap/udp等通信,还调试过很长时间的代码。现在这些事情都免了,新版本已经配全了。当然,如果要性能好,建议选用linux环境,因为支持kvm。Windows下跑啥都不行,跑个大点的虚拟机,启动都要半个小时以上了。因为qemu 2.9和0.9下的命令差异太大。现将各种不同虚拟机的启动方式给个说明。 1, IOU 可以在Linux环境下直接执行,无需qemu。在windows下,就算有qemu,还是先挂的虚拟机。没必要这样折腾了。 2, IOSv 或者vios qemu-system-x86_64 -m 4096 ./IOSv_R1-disk1.qcow2 -serial telnet:0.0.0.0:3001,server,nowait 思科虚拟产品有个很奇怪的存在,如果采用-hda/hdb的方式,挂载虚机,很多就会直接挂死。如果采用默认方式,直接挂虚拟机,一点问题都没有,而且启动飞快。 3, ASAv qemu-system-x86_64w -m 2048M -boot c -hda ASAv.vmdk -cpu Haswell -smp 4,sockets=4,cores=1,threads=1 与最早的PIX或者ASA一样,ASAv挂载也是比较方便的。对内存的消耗并不是特别大。 4, nxosv 即titanium, qemu-system-x86_64 -m 4096 -smp 4 ./titanium-final.7.3.0.D1.1.qcow2 -serial telnet:0.0.0.0:3001,server,nowait Titanium即nexus 7000的OS, 也就是用于Data Center环境的网络交换设备。对内存消耗不大,挂载或者升级都很容易。 username: admin password: admin 5, csr1000v qemu-system-x86_64 -m 4096 ./csr1000v-universalk9.03.17.00.S.156-1.S-ext.qcow2 -serial telnet:0.0.0.0:3001,server,nowait -smp 4,sockets=1,cores=4,threads=1 CSR1000v,即ISP环境下的网络设备,采用上述命令,可以直接挂载。如果有ova或者iso文件,记得是universal版本的,可以从头安装。 但是,对于adventerprise版本的,不清楚具体命令如何,未挂载成功。 6,xrv qemu-system-x86_64 -m 4096 ./iosxrv-k9-demo-6.0.0-disk1.vmdk -smp 2 -monitor telnet:0.0.0.0:11063,server,nowait -serial telnet:0.0.0.0:3001,nowait,server -serial telnet:0.0.0.0:3002,nowait,server -serial telnet:0.0.0.0:3003,nowait,server -serial telnet:0.0.0.0:3004,nowait,server -serial telnet:0.0.0.0:3001,server,nowait 对于xrv的demo版本,可以通过这个命令直接挂载,其中多个serial口,实际启动时用处不大,因为也用不着。 username root without passwd 7,xrv9k qemu-system-x86_64 -enable-kvm -m 8096 /root/xrv9k-fullk9-x.ova-6.0.2.qcow2 -smp 4 -monitor telnet:0.0.0.0:11063,server,nowait -serial telnet:0.0.0.0:3001,nowait,server -serial telnet:0.0.0.0:3002,nowait,server -serial telnet:0.0.0.0:3003,nowait,server -serial telnet:0.0.0.0:3004,nowait,server 但是,在普通的笔记本里,想挂xrv9k-fullk9的版本,难度就大了。会提示你内存不足: # ERROR: 7 GB RAM available # but the minimial memory requirement is 8 GB per socket # and the socket count is 1 # # Please assigin the VM with at least 8 GB RAM and reload 但是,在linux下,内存再也不是问题了,只要你有足够大的磁盘空间。通过将磁盘空间转化为swap的方式,可以轻松跨越内存不足的难题。 #dd if=/dev/zero of=/swapfile bs=1024M count=32 #mkswap /swapfile #swapon /swapfile 推荐的qemu-option: emu-system-x86_64 -enable-kvm -m 12G \ -smbios type=1,manufacturer=cisco,product=CiscoIOSXRv9000 \ -cpu host -smp cores=4,threads=1,sockets=1 \ -display gtk -vga std \ /run/media/root/Data/linux/xrv9k-v6.1.4-vrr.qcow2 \ -monitor telnet:0.0.0.0:11063,server,nowait \ -serial mon:stdio -rtc base=utc \ -serial telnet:0.0.0.0:3001,nowait,server \ -serial telnet:0.0.0.0:3002,nowait,server \ -serial telnet:0.0.0.0:3003,nowait,server \ -netdev tap,id=host1,ifname=tap0,script=no,downscript=no \ -netdev tap,id=host2,ifname=tap1,script=no,downscript=no \ -netdev tap,id=host3,ifname=tap2,script=no,downscript=no \ -device virtio-net-pci,romfile=,netdev=host1,id=host1,mac=00:0a:00:00:01:00 \ -device virtio-net-pci,romfile=,netdev=host2,id=host2,mac=00:0a:00:00:02:00 \ -device virtio-net-pci,romfile=,netdev=host3,id=host3,mac=00:0a:00:00:03:00 \ -netdev tap,id=data1,ifname=tap3,script=no,downscript=no \ -netdev tap,id=data2,ifname=tap4,script=no,downscript=no \ -netdev tap,id=data3,ifname=tap5,script=no,downscript=no \ -device e1000,romfile=,netdev=data1,id=data1,mac=00:0b:00:00:01:00 \ -device e1000,romfile=,netdev=data2,id=data2,mac=00:0b:00:00:02:00 \ -device e1000,romfile=,netdev=data3,id=data3,mac=00:0b:00:00:03:00 \ 但是新版本的xrv9k采用vga作为输出方式,推荐采用这种模式将输出从XR Console端口map到serial console。 安装时会提示你输入超级用户账号和密码,成功启动后以此登录即可。. 8, nxos9k 因为nexus 9000采用efi启动,在qemu里启动有点麻烦,需要ovmf https://sourceforge.net/projects/gns-3/files/Qemu%20Appliances/OVMF-20160813.fd.zip/download来支持。javascript:; qemu-system-x86_64 -m 6024 -smp 4 -bios OVMF-20160813.fd ./nxosn9k-final.7.0.3.I5.2.qcow2 -serial telnet:0.0.0.0:3001,server,nowait 不过就这样,我也没能成功启动。总是在loading xxx/717M后,重新启动。高人指点至少需要 assigned Node CPU 4 and RAM 8098内存,但是也有人初始化为4cpu/16G,增加为6cpu/24g才成功启动,哪我暂时是没招了。但是,如果不使用ovmf,就会一直挂在booting状态,不会有任何反应了。也许硬盘模式不选择ide,选择virtio可能会好点。不知道。 如果要nexus 9000v成功启动,一定要保证有足够的cpu和mem。如果16g还不能解决,哪就来俩倍! # more nxos9k.sh qemu-system-x86_64 -enable-kvm -m 8096 \ -serial telnet:0.0.0.0:3001,nowait,server \ -cpu Nehalem -smp sockets=1,cores=4,threads=1 \ -bios /data/titan/OVMF-20160813.fd \ -device ahci,id=ahci0,bus=pci.0 \ -drive file=/data/titan/nxosv9k-final.7.0.3.I5.2.qcow2,if=none,id=drive-sata-disk0,format=qcow2 \ -device ide-drive,bus=ahci0.0,drive=drive-sata-disk0,id=drive-sata-disk0 \ a, type exit when you stuck in EFI shell> b, choose UEFI QEMU HARDDISK QM00005 under Boot manager menu c, type boot nxps.7.0.3.I5.2.bin under loader > 9. FirePower NGFW Virtual qemu-system-x86_64 -enable-kvm -m 6128 \ /root/Firepower_NGFWv-6.2.0-362.qcow2 \ -smp 4 -monitor telnet:0.0.0.0:11063,server,nowait \ -net nic,vlan=1,model=e1000,macaddr=00:aa:00:00:01:00 \ -net nic,vlan=1,model=e1000,macaddr=00:aa:00:00:02:00 \ -net nic,vlan=1,model=e1000,macaddr=00:aa:00:00:03:00 \ -net nic,vlan=1,model=e1000,macaddr=00:aa:00:00:04:00 \ -serial telnet:0.0.0.0:3001,nowait,server
NGFWv成功初始化,至少需要4块网卡。 username admin, password Admin123. 10. Nexus 5K/6K (尚为成功引导) qemu-system-x86_64 -smp 4 -enable-kvm -m 4096 \ -serial telnet:0.0.0.0:3001,nowait,server \ -cdrom oac.iso nxos5.qcow2 -boot d
Could not access KVM kernel module: No such file or directory
failed to initialize KVM: No such file or directory
解决办法:f2进入bios界面,查找virtual字样的选项,将其开启(enable)
Could not access KVM kernel module: Permission denied
failed to initialize KVM
chown root:kvm /dev/kvm
在虚拟机产品里,吃内存的大户还是有很多的,比如Juniper的vMX系列,至少要8-16G的内存。其次就是思科的xrv9k,也是8-16G。从这点上看,nxos9k需要8G以上内存的可能,也是存在的。
在新版本的Qemu里,最大的区别在于磁盘和网络的挂载。当然了,其他的差异,我们也不在乎了。
drive挂载:drive挂载区分sata, ide和cdrom, 命令是不同的。
挂载sata drive
-device ahci,id=ahci0,bus=pci.0
-drive file=img.qcow2,if=none,id=drive-sata-disk0,format=qcow2
-device ide-drive,bus=ahci0.0,drive=drive-sata-disk0,id=drive-sata-disk0
挂载ide drive
-drive file=img.qcow2,if=none,id=drive-ide0-0-0,format=qcow2
-device ide-hd,bus=ide.0,unit=1,drive=drive-ide0-0-0,id=ide0-0-0
挂载virtio drive
-hda .\win2003.img-cdrom virtio-win-0.1.141.iso-boot order=dc,menu=on -device virtio-blk-pci,bus=pci.0,addr=0x6,drive=drive-virtio-disk0,id=virtio-disk0 -drive file=win.img,format=qcow2,if=none,id=drive-virtio-disk0
or
-drive file=win2003.img,format=qcow2,if=virtio,id=drive-virtio-disk0
通过热拔插方式添加virtio block device
drive_add 0 file=/root/qemu1.3.0/fake.img,format=raw,id=drive-virtio-disk1,if=none
device_add virtio-blk-pci,scsi=on,drive=drive-virtio-disk1
挂载cdrom:
-drive file=cfg.iso,media=cdrom
注意:在QEMU里,挂硬盘分为device和drive俩层。采用id和drive一一对应,drive才能被正确挂载。
nic挂载:
-net socket,vlan=x,name=nl_s0,listen=localhost:12000
-net nic,vlan=x,model=e1000,macaddr=aaaa.bbbb.cccc
以上为老版命令。
-netdev socket,listen=localhost:12000,id=eth_s_f -device e1000,addr=s.f,netdev=eth_s_f,mac=aaaa.bbbb.cccc,multifunction=on,romfile= or -netdev tap,ifname=tap_s_f,script=no,downscript=no,id=eth_s_f -device e1000,addr=s.f,netdev=eth_s_f,mac=aaaa.bbbb.ccc,multifunction=on,romfile= 这些为新版命令。也是-netdev和device配套使用,采用id和netdev来识别和对应。 虚拟3个网卡作为管理使用 -netdev tap,id=host1,ifname=tap0,script=no,downscript=no \ -netdev tap,id=host2,ifname=tap1,script=no,downscript=no \ -netdev tap,id=host3,ifname=tap2,script=no,downscript=no \ -device virtio-net-pci,romfile=,netdev=host1,id=host1,mac=00:0a:00:00:01:00 \ -device virtio-net-pci,romfile=,netdev=host2,id=host2,mac=00:0a:00:00:02:00 \ -device virtio-net-pci,romfile=,netdev=host3,id=host3,mac=00:0a:00:00:03:00 \ 虚拟3个网卡作为数据使用 -netdev tap,id=data1,ifname=tap3,script=no,downscript=no \ -netdev tap,id=data2,ifname=tap4,script=no,downscript=no \ -netdev tap,id=data3,ifname=tap5,script=no,downscript=no \ -device e1000,romfile=,netdev=data1,id=data1,mac=00:0b:00:00:01:00 \ -device e1000,romfile=,netdev=data2,id=data2,mac=00:0b:00:00:02:00 \ -device e1000,romfile=,netdev=data3,id=data3,mac=00:0b:00:00:03:00 \ 'olive' => 'Juniper Olive', 'vmx'=> 'Juniper vMX', 'vmxvcp' =>'Juniper vMX VCP', 'vmxvfp' =>'Juniper vMX VFP', 'vsrx' => 'Juniper vSRX', 'vsrxng' => 'Juniper vSRX NextGen', 'vqfxre' => 'Juniper vQFX RE', 'vqfxpfe'=> 'Juniper vQFX PFE', 'mikrotik' => 'MikroTik RouterOS', 'vyos' => 'VyOS', Reference: Qemu image naming Rules: http://www.eve-ng.net/index.php/documentation/images-table https://www.jianshu.com/p/e4b29d16bae4