《三》企业级 KVM 网络以及脚本管理
5
2022-08-12
《三》企业级 KVM 网络以及脚本管理
1、KVM网络
1.1、网络介绍
NAT网络拓扑

隔离拓扑图(isolated)

桥接拓扑图

1.2、测试从交换机上删除vnet网卡
[root@10-20-30-125 ~]# brctl show bridge name bridge id STP enabled interfaces virbr0 8000.525400ac5c2e yes virbr0-nic vnet0 vnet1 [root@10-20-30-125 ~]# brctl delif virbr0 vnet0 [root@10-20-30-125 ~]# brctl show bridge name bridge id STP enabled interfaces virbr0 8000.525400ac5c2e yes virbr0-nic vnet1
这里可以看到虚拟机无法访问外网了

添加vnet⽹卡到交换机上:测试虚拟机已经可以恢复上网。
[root@10-20-30-125 ~]# brctl addif virbr0 vnet0 [root@10-20-30-125 ~]# brctl show bridge name bridge id STP enabled interfaces virbr0 8000.525400ac5c2e yes virbr0-nic vnet0 vnet1

2、配置桥接网络
2.1、创建桥接网卡配置文件
[root@10-20-30-125 ~]# ip a 2: enp1s0:mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:30:48:cf:7a:e8 brd ff:ff:ff:ff:ff:ff inet 222.186.190.134/25 brd 222.186.190.255 scope global enp1s0 valid_lft forever preferred_lft forever inet6 fe80::230:48ff:fecf:7ae8/64 scope link valid_lft forever preferred_lft forever 4: virbr0: mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 52:54:00:ac:5c:2e brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 5: virbr0-nic: mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000 link/ether 52:54:00:ac:5c:2e brd ff:ff:ff:ff:ff:ff [root@10-20-30-125 ~]# ls /etc/sysconfig/network-scripts/ ifcfg-enp1s0 ifdown-isdn ifup-bnep ifup-routes ifcfg-enp1s0.bak ifdown-post ifup-eth ifup-sit ifcfg-enp2s0 ifdown-ppp ifup-ib ifup-Team ifcfg-lo
可以看到宿主机并没有桥接网卡配置文件,我们新建一个
[root@10-20-30-125 network-scripts]# vim ifcfg-br0 TYPE=Bridge NAME=br0 DEVICE=br0 ONBOOT="yes" BOOTPROTO=static IPADDR=222.186.190.134 GATEWAY=222.186.190.1 PREFIX=25 DNS1=223.5.5.5 DNS2=223.6.6.6
查看宿主机网关,检查配置是否正确。
[root@10-20-30-125 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 222.186.190.129 0.0.0.0 UG 0 0 0 enp1s0 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 enp1s0 192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0 222.186.190.128 0.0.0.0 255.255.255.128 U 0 0 0 enp1s0
2.2、修改宿主机网卡
按住shift+v进入可视行模式,选中全部,按s 删除。
[root@10-20-30-125 network-scripts]# cp ifcfg-enp1s0 ifcfg-enp1s0.bak [root@10-20-30-125 network-scripts]# vim ifcfg-enp1s0 DEVICE="enp1s0" NAME="enp1s0" HWADDR=00:30:48:cf:7a:e8 ONBOOT=yes BOOTPROTO=static IPADDR=222.186.190.134 NETMASK=255.255.255.128 GATEWAY=222.186.190.129 DNS1=114.114.114.114 DNS2=114.114.114.114 ARPCHECK=no NM_CONTROLLED=no ZONE=public 修改后 DEVICE="enp1s0" ONBOOT="yes" BRIDGE=br0 [root@10-20-30-125 ~]# systemctl restart libvirtd [root@10-20-30-125 ~]# systemctl restart network
现在就是将宿主机的网卡桥接到我们新创建的网卡上。我们可以给虚拟机增加这个新增的桥接网卡。那么下面我们去恢复宿主机的网卡到正常状态。
[root@10-20-30-125 network-scripts]# rm -rf ifcfg-br0 [root@10-20-30-125 network-scripts]# rm -rf ifcfg-enp1s0 [root@10-20-30-125 network-scripts]# cp ifcfg-enp1s0.bak ifcfg-enp1s0 [root@10-20-30-125 network-scripts]# cat ifcfg-enp1s0 DEVICE="enp1s0" NAME="enp1s0" HWADDR=00:30:48:cf:7a:e8 ONBOOT=yes BOOTPROTO=static IPADDR=222.186.190.134 NETMASK=255.255.255.128 GATEWAY=222.186.190.129 DNS1=114.114.114.114 DNS2=114.114.114.114 ARPCHECK=no NM_CONTROLLED=no [root@10-20-30-125 network-scripts]# systemctl restart libvirtd [root@10-20-30-125 network-scripts]# systemctl restart network
3、创建NAT网络
3.1、复制配置文件
[root@10-20-30-125 ~]# cd /etc/libvirt/qemu/ autostart/ kvm03-clone.xml kvm04.xml kvm06.xml kvm02.xml kvm03.xml kvm05.xml networks/ [root@10-20-30-125 ~]# cd /etc/libvirt/qemu/networks/ [root@10-20-30-125 networks]# ll 总用量 4 drwx------ 2 root root 25 8月 10 15:36 autostart -rw------- 1 root root 576 8月 10 15:40 default.xml [root@10-20-30-125 networks]# cp default.xml nat1.xml
3.2、修改配置文件
[root@10-20-30-125 networks]# cat nat1.xmldefault c3a34232-2a65-40a7-bb7f-e94ef78d7f5a
- name:修改为nat1
- uuid:修改成不同的即可
- mode='nat':若删除此行则为isolated网络,这里不做修改
- bridge name:接口,不能和默认的接到同一个,修改为virbr1
- MAC地址:修改后三段任一值即可
- ip address:我们可以自定义一个新网段
- dhcp:地址池的范围,为此nat网卡分配地址
[root@10-20-30-125 networks]# vim nat1.xml[root@10-20-30-125 networks]# systemctl restart libvirtd nat1 c3a34232-2a65-40a8-bb7f-e94ef78d7f5a
然后就可给虚拟机添加新的网卡 “nat1” 了。

4、创建isolated网络(隔离)
[root@10-20-30-125 networks]# cp default.xml isolated1.xml [root@10-20-30-125 networks]# vim isolated1.xml[root@10-20-30-125 networks]# systemctl restart libvirtd isolated1 c3a34232-2a65-40a7-bb9f-e94ef78d7f5a
查看当前所有网络:virsh net-list仅显示激活了的
[root@10-20-30-125 networks]# virsh net-list --all 名称 状态 自动开始 持久 ---------------------------------------------------------- default 活动 是 是 isolated1 不活跃 否 是 nat1 不活跃 否 是 [root@10-20-30-125 networks]# virsh net-start isolated1 网络 isolated1 已开始 [root@10-20-30-125 networks]# virsh net-autostart isolated1 网络isolated1标记为自动启动 [root@10-20-30-125 networks]# virsh net-list --all 名称 状态 自动开始 持久 ---------------------------------------------------------- default 活动 是 是 isolated1 活动 是 是 nat1 不活跃 否 是
查看一个虚拟机的网络接口信息
[root@10-20-30-125 networks]# virsh domiflist kvm02 接口 类型 源 型号 MAC ------------------------------------------------------- vnet1 network default e1000 52:54:00:a0:78:f6
5、Virbr0的DHCP
Virbr0 是 KVM 默认创建的⼀个 Bridge,其作⽤是为连接其上的虚机⽹卡提供 NAT 访问外⽹的功能。 Virbr0 默认分配了⼀个IP 192.168.122.1,并为连接其上的其他虚拟⽹卡提供 DHCP 服务。 Virbr0 使⽤ dnsmasq 提供 DHCP 服务,可以在宿主机中查看该进程信息。
[root@10-20-30-125 ~]# ps -elf|grep dnsmasq 5 S nobody 8359 1 0 80 0 - 14035 poll_s 14:20 ? 00:00:00 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/isolated1.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper 1 S root 8361 8359 0 80 0 - 14028 pipe_w 14:20 ? 00:00:00 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/isolated1.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper 0 S root 8435 6595 0 80 0 - 28206 pipe_w 14:25 pts/1 00:00:00 grep --color=auto dnsmasq 5 S nobody 17909 1 0 80 0 - 14035 poll_s 8月10 ? 00:00:03 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper 1 S root 17910 17909 0 80 0 - 14028 pipe_w 8月10 ? 00:00:00 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper
在/var/lib/libvirt/dnsmasq/目录下有⼀个 virbr0.status ⽂件,当 虚拟机成功获得DHCP 的 IP 后,可以在该⽂件中查看到相应的信息。
[root@10-20-30-125 ~]# ll /var/lib/libvirt/dnsmasq/ 总用量 16 -rw-r--r-- 1 root root 0 8月 12 14:17 default.addnhosts -rw------- 1 root root 588 8月 10 15:40 default.conf -rw-r--r-- 1 root root 0 8月 12 14:17 default.hostsfile -rw-r--r-- 1 root root 0 8月 12 14:20 isolated1.addnhosts -rw------- 1 root root 635 8月 12 14:20 isolated1.conf -rw-r--r-- 1 root root 0 8月 12 14:20 isolated1.hostsfile -rw-r--r-- 1 root root 81 8月 12 13:48 virbr0.macs -rw-r--r-- 1 root root 311 8月 12 14:17 virbr0.status -rw-r--r-- 1 root root 0 8月 12 14:20 virbr2.status [root@10-20-30-125 ~]# cat /var/lib/libvirt/dnsmasq/virbr0.status [ { "ip-address": "192.168.122.147", "mac-address": "52:54:00:9b:d0:ee", "expiry-time": 1660286885 }, { "ip-address": "192.168.122.106", "mac-address": "52:54:00:a0:78:f6", "hostname": "WIN-1NT1ORK9U56", "client-id": "01:52:54:00:a0:78:f6", "expiry-time": 1660288275 } ]
6、外网访问虚拟机配置
本机开启路由,开启防⽕墙,写⼊如下规则:
iptables -t nat -A PREROUTING -d 222.186.190.134 -p tcp -m tcp --dport 10001 -j DNAT --to-destination 192.168.122.147:22
7、脚本管理KVM
7.1、批量创建虚拟机脚本
查看现在虚拟机 查看某个虚拟机的配置 升配/降配 添加/删除⽹络
7.3、运行脚本
#!/bin/bash # #提示信息--Prompt information echo cat << eof --------创建镜像-------- 1、批量创建 2、单个虚拟机 3、批量删除 4、删除单个 5、退出(sign out) ------Create mirror----- eof echo #输入选项--Input options read -p "输入选项(Input options):" option function num() { #虚拟机数量--Number of virtual machines read -p "虚拟机数量(Number of virtual machines):" number } function seat() { read -p "源配置文件(Source profile):" sfile read -p "源镜像(Source image):" simg read -p "存储池(Storage pool):" pools if [ -z $pools ]; then pools=/var/lib/libvirt/images fi } function opt() { #定义虚拟机名,UUID,MAC vm_name=vm${i}_$vmn vm_uuid=$(uuidgen) vm_mac=$(openssl rand -hex 3 | sed -r 's/(..)(..)(..)/52:54:00:\1:\2:\3/') } function files() { #判断文件是否存在 if [ -e $pools\/$vm_name.qcow2 ]; then echo "文件已存在(File exists)" read -p "是否删除(whether delete)(y/n):" yn if [ $yn == "y" ]; then virsh destroy $vm_name &> /dev/null virsh undefine $vm_name &> /dev/null rm -rf $pools\/$vm_name.qcow2 virtual else continue fi else virtual fi } function onle_files() { #判断文件是否存在 echo 已有虚拟机 virsh list --all | grep vm | awk '{print $2}' read -p "请输入虚拟机名:" kvm_name if [ -e $pools\/$kvm_name.qcow2 ]; then echo "文件已存在(File exists)" read -p "是否删除(whether delete)(y/n):" yn if [ $yn == "y" ]; then virsh destroy $kvm_name &> /dev/null virsh undefine $kvm_name &> /dev/null rm -rf $pools\/$kvm_name.qcow2 onle_virtual else exit fi else onle_virtual fi } function virtual() { #复制虚拟机配置文件--Copy virtual machine profile cp $sfile /etc/libvirt/qemu/vm${i}_$vmn.xml #部署虚拟机--Deploy virtual machine qemu-img create -f qcow2 -b $simg $pools\/$vm_name.qcow2 &> /dev/null #编辑配置文件--Edit profile #替换虚拟机名 sed -ri "s|vm_name|$vm_name|g" /etc/libvirt/qemu/vm${i}_$vmn.xml #替换虚拟机地址 sed -ri "s|vm_place|$pools\/$vm_name.qcow2|g" /etc/libvirt/qemu/vm${i}_$vmn.xml #替换uuid sed -ri "s|vm_uuid|$vm_uuid|g" /etc/libvirt/qemu/vm${i}_$vmn.xml #替换mac sed -ri "s|vm_mac|$vm_mac|g" /etc/libvirt/qemu/vm${i}_$vmn.xml #创建虚拟机--Create virtual machine virsh define /etc/libvirt/qemu/vm${i}_$vmn.xml &> /dev/null } function onle_virtual() { #复制虚拟机配置文件--Copy virtual machine profile cp $sfile /etc/libvirt/qemu/$kvm_name.xml #部署虚拟机--Deploy virtual machine qemu-img create -f qcow2 -b $simg $pools\/$kvm_name.qcow2 &> /dev/null #编辑配置文件--Edit profile #替换虚拟机名 sed -ri "s|vm_name|$kvm_name|g" /etc/libvirt/qemu/$kvm_name.xml #替换虚拟机地址 sed -ri "s|vm_place|$pools\/$kvm_name.qcow2|g" /etc/libvirt/qemu/$kvm_name.xml #替换uuid sed -ri "s|vm_uuid|$vm_uuid|g" /etc/libvirt/qemu/$kvm_name.xml #替换mac sed -ri "s|vm_mac|$vm_mac|g" /etc/libvirt/qemu/$kvm_name.xml #创建虚拟机--Create virtual machine virsh define /etc/libvirt/qemu/$kvm_name.xml &> /dev/null } #创建虚拟机--Create virtual machine case $option in 1) read -p "虚拟机名称:" vmn num seat for i in $(seq $number); do opt files virtual done ;; 2) seat opt onle_files onle_virtual ;; 3) echo 已有虚拟机 virsh list --all | grep vm | awk '{print $2}' read -p "输入系统名:" vmn num read -p "存储池(Storage pool):" pool for i in $(seq $number); do vm_name=vm${i}_$vmn virsh destroy $vm_name &> /dev/null virsh undefine $vm_name &> /dev/null rm -rf $pool\/$vm_name.qcow2 done ;; 4) echo 已有虚拟机 virsh list --all | grep vm | awk '{print $2}' read -p "虚拟机名称:" vm_name read -p "存储池(Storage pool):" pool virsh destroy $vm_name &> /dev/null virsh undefine $vm_name &> /dev/null rm -rf $pool\/$vm_name.qcow2 ;; 5) exit ;; *) echo 输入错误,请重新输入!!! echo Input error, please re-enter!!! ;; esac virsh list --all
[root@10-20-30-125 ~]# ./kvm.sh 1.创建⾃定义配置单个虚拟机 2.批量创建⾃定义配置虚拟机 3.批量创建默认配置虚拟机 4.删除虚拟机 选取你的操作(1/2/3):1 请输⼊新虚机名称:kvm08 请输⼊新虚机内存⼤⼩(G):1 请输⼊新虚机cpu个数:1 定义域 kvm08(从 /etc/libvirt/qemu/kvm08.xml) Id 名称 状态 ---------------------------------------------------- 9 kvm02 running - kvm03 关闭 - kvm03-clone 关闭 - kvm04 关闭 - kvm05 关闭 - kvm06 关闭 - kvm08 关闭
这里启动虚拟机报错了,是因为该模板中宿主机CPU类型和我的不一致
[root@10-20-30-125 ~]# virsh start kvm08 错误:开始域 kvm08 失败 错误:the CPU is incompatible with host CPU: Host CPU does not provide required features: pclmuldq, fma, x2apic, movbe, tsc-deadline, aes, xsave, avx, fsgsbase, bmi1, avx2, smep, bmi2, erms, invpcid
解决方案:查看本级宿主机类型,并修改模板。
[root@10-20-30-125 ~]# virsh capabilities54443858-4e54-3000-48cf-003048cf7ae8 x86_64 Nehalem-IBRS [root@10-20-30-125 ~]# vim /etc/libvirt/qemu/vmmodel.xml修改后 Haswell-noTSX Nehalem-IBRS
- 0
-
分享