秋栈博客

七月

《三》企业级 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.xml


  default
  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


  nat1
  c3a34232-2a65-40a8-bb7f-e94ef78d7f5a
  
  
  
  
    
      
    
  


[root@10-20-30-125 networks]# systemctl restart libvirtd
然后就可给虚拟机添加新的网卡 “nat1” 了。

4、创建isolated网络(隔离)

[root@10-20-30-125 networks]# cp default.xml isolated1.xml
[root@10-20-30-125 networks]# vim isolated1.xml


  isolated1
  c3a34232-2a65-40a7-bb9f-e94ef78d7f5a
  
  
  
    
      
    
  


[root@10-20-30-125 networks]# systemctl restart libvirtd
查看当前所有网络: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 capabilities


  
    54443858-4e54-3000-48cf-003048cf7ae8
    
      x86_64
      Nehalem-IBRS
[root@10-20-30-125 ~]# vim /etc/libvirt/qemu/vmmodel.xml


    Haswell-noTSX

修改后

    Nehalem-IBRS

 
  • 0