最近需要在客戶環境搭建 csr1000v,客戶環境不能聯網,同時使用 kvm 管理。所以需要離線安裝 kvm,在利用 kvm 安裝 csr100v ,中間遇到不少坑,現記錄如下。
所有安裝步驟是在 root 使用者的基礎上完成。
準備好的 kvm 安裝包和 csr1000v 安裝包所在地址:
ip: 10.124.205.51
user: root/cisco123
[root@localhost temp]# cd /opt/temp
[root@localhost temp]# ls
csr1000v-universalk9.16.12.04.qcow2 kvm_pkg.tar.gz
整體安裝思路如下:
- Linux 環境準備,檢驗系統版本以及是否具有虛擬化功能
- 離線安裝 kvm
- kvm 安裝 csr1000v
- 配置 KVM 相關網路
Linux 環境準備
檢查 Linux 版本及核心是否一致,因為涉及到離線安裝:
[root@localhost kvm_offile_pkg]# cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)
[root@localhost kvm_offile_pkg]# uname -r
3.10.0-1160.el7.x86_64
關閉 Selinux
setenforce 0
vim /etc/selinux/config
SELINUX=disabled
檢查虛擬化功能是否開啟
cat /proc/cpuinfo | egrep "vmx|svm"
如果看到 vmx 或者 svm,表示虛擬化功能正常開啟。
或者也可通過如下命令, 看到 VT-x 表示正常:
[root@localhost ~]# lscpu | grep Virtualization
Virtualization: VT-x
Virtualization type: full
離線安裝 kvm
找一臺可聯網,相同版本的 linux 伺服器,使用 yum 離線下載 kvm 相關包:
yum install --downloadonly --downloaddir=/opt/kvm qemu-kvm python-virtinst libvirt libvirt-python virt-manager libguestfs-tools bridge-utils virt-install virt-viewer
將其打包後匯入離線伺服器:
tar -czvf kvm_pkg.tar.gz kvm
在離線伺服器解壓並安裝:
tar -xzvf kvm_pkg.tar.gz
# 使用 ls 檢視,共有 250 個安裝包
ls -l | grep "^-" | wc -l
# 安裝:
yum localinstall -y {Path}/kvm/*.rpm
啟動 kvm
systemctl enable libvirtd
systemctl start libvirtd
檢視 kvm 版本資訊:
yum info qemu-kvm
/usr/libexec/qemu-kvm --version
kvm 安裝 csr1000v
將下載好的 csr1000v 映象匯入伺服器
# 將安裝包匯入到 /var/lib/libvirt/images 資料夾下
mv csr1000v-universalk9.16.12.04.qcow2 /var/lib/libvirt/images
安裝 csr1000v
virt-install \
--connect=qemu:///system \
--name=csr_1000v \
--os-type=linux \
--os-variant=rhel4 \
--arch=x86_64 \
--cpu host-model \
--vcpus=1,sockets=1,cores=1,threads=1 \
--hvm \
--ram=4096 \
--import \
--disk path=/var/lib/libvirt/images/csr1000v-universalk9.16.12.04.qcow2,bus=ide,format=qcow2 \
--network bridge=virbr0,model=virtio \
--noreboot
# --name 可以起一個自定義的名字
安裝成功可看到如下內容:
開啟 csr1000v
virsh --connect qemu:///system start csr_1000v
連線 csr1000v, 等等其啟動完成
virsh console csr_1000v
看到如下內容,表示啟動成功:
配置 KVM 網路
宿主機訪問 kvm
獲取虛擬機器有 DHCP 的分配 IP:
[root@localhost ~]# virsh net-dhcp-leases default
Expiry Time MAC address Protocol IP address Hostname Client ID or DUID
-------------------------------------------------------------------------------------------------------------------
2022-04-01 15:43:42 52:54:00:0d:86:d9 ipv4 192.168.122.130/24 Router 00:63:69:73:63:6f:2d:35:32:35:34:2e:30:30:32:62:2e:34:31:30:36:2d:47:69:31
如果手動配置的 IP 可以通過如下指令碼來獲取, 通過 mac 地址,反查 arp 表,獲取分配的 ip.
#!/bin/bash
running_vms=`virsh list |grep running`
echo -ne "共有`echo "$running_vms"|wc -l`個虛擬機器在執行.\n"
for i in `echo "$running_vms" | awk '{ print $2 }'`;do
mac=`virsh dumpxml $i |grep "mac address"|sed "s/.*'\(.*\)'.*/\1/g"`
ip=`arp -ne |grep "$mac" |awk '{printf $1}'`
printf "%-30s %-30s\n" $i $ip
done
[root@localhost net-util]# bash list_vm_ip.sh
共有2個虛擬機器在執行.
csr_1000v 192.168.122.130
new_csr_1000v 192.168.122.131
由於本身是橋接到 br0 網路卡上,可和宿主直接通訊:
所以可在 router 配置 telnet 登入:
外網訪問 KVM
上面的網路情況做到了,可以使用宿主機為 csr1000v 配置。但如果想從外部網路中,訪問裝置就無法做到了。
這時就需要新建立一個的網橋,然後和 kvm 的網路卡相連線。
先介紹下網路環境:
機器名 | IP | 描述 |
---|---|---|
宿主機 | 10.124.205.51 | 儲存 kvm 的物理機 |
csr1000v | 10.124.205.52 | 用 kvm 啟動的虛機 |
測試機器 | 10.124.205.14 | 用於測試能否訪問到 kvm 虛機 |
整體思路如下:
- 記錄當前宿主機可以訪問外網的網路卡資訊,比如 IP,閘道器等
- 新建一個網橋
- 將新建的網橋和原來的網路卡想關聯
- 修改 kvm 虛機檔案
- 進入 csr1000v 繫結真實 IP
- 測試
首先記錄當前物理網路卡資訊:
使用 ip addr 找到帶有 IP 的真實網路卡,比如我這裡是 ens192:
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:50:56:bb:93:c4 brd ff:ff:ff:ff:ff:ff
inet 10.124.205.51/24 brd 10.124.207.255 scope global noprefixroute ens192
valid_lft forever preferred_lft forever
inet6 fe80::eb4d:e564:a48:1835/64 scope link noprefixroute
valid_lft forever preferred_lft forever
記錄對應配置檔案的有效資訊:
cat /etc/sysconfig/network-scripts/ifcfg-ens192
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens192"
UUID="94a5dbcf-1d42-4fe1-ad0a-6f9743f0f033"
DEVICE="ens192"
ONBOOT="yes"
IPADDR="10.124.205.51"
PREFIX="24"
GATEWAY="10.124.205.254"
DNS1="64.104.14.184"
DNS2="208.67.222.222"
IPV6_PRIVACY="no"
這裡將一些有用的資訊,拷貝出來。之後新建網橋需要用到:
IPADDR="10.124.205.51"
PREFIX="24"
GATEWAY="10.124.205.254"
DNS1="64.104.14.184"
DNS2="208.67.222.222"
關閉網路
systemctl stop NetworkManager
因為要新建一個網橋,為了防止同名的情況,先檢視下, 沒有叫 br0 的網橋:
brctl show
建立新網橋,新增之前準備好的資訊:
vim /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
ONBOOT=yes
TYPE=Bridge
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR="10.124.205.51"
PREFIX="24"
GATEWAY="10.124.205.254"
DNS1="64.104.14.184"
DNS2="208.67.222.222"
更新原始 ens192 網路卡資訊,與新網橋建立連線, 記得把原始檔案備份
vim /etc/sysconfig/network-scripts/ifcfg-ens192
NAME="ens192"
DEVICE="ens192"
ONBOOT="yes"
TYPE=Ethernet
ONBOOT=yes
BRIDGE=br0
重啟網路:
systemctl restart network
檢視網路卡是否生效:
原始 IP 轉移到新網路卡上:
重啟 kvm:
systemctl restart libvirtd
修改 kvm csr1000v 配置檔案
virsh edit csr_1000v
將 interface 關聯的網路卡,改成新網路卡。
<interface type='bridge'>
<mac address='52:54:00:0d:86:d9'/>
<source bridge='br0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
其中 type 需要改變為 bridge,bridge 繫結的名字需要改成 `br0`
重啟 csr1000v
virsh reboot csr_1000v
檢視 csr_1000v 的網路卡是否掛載到 br0 上:
這時進入到裝置中,正常配置有效的 ip,因為是橋接的模式,外網就可以正常訪問了。
這裡配置 IP 為 10.124.205.52
, 從另外一臺物理機上可以正常 ping 通:
坑
之前使用 kvm 安裝 csr1000v 後,發現使用 console 無法登入到 router 裡面,一直卡在 Escape character is '^]'
。
使用官網文件,配置 tcp 串列埠依然不好用。最後是通過在 router 裡面配置 platform console serial
這句話得以用 console 訪問。
目前還存在一個問題,就是想給 router 預設刷一些 day0 配置進去,但安裝官網建立 iso 映象的方式也不太好用,後續研究後補充。