centos7下kvm教程

2023/10/10 centoskvm

centos7下搭建与使用kvm

# 1、安装

# 1.1 检查宿主机CPU是否支持虚拟化及开启虚拟化

检查:

cat /proc/cpuinfo | egrep '(vmx|svm)' | wc -l;

结果大于0表示支持

esxi 交换机/端口组(开启):

  • 混杂模式
  • MAC 地址更改
  • 伪传输

esxi 全局开启虚拟化:

  • ssh 连接到esxi
  • 编辑 /etc/vmware/config,最后一行添加 vhv.enable = "TRUE"
  • 重启esxi

esxi 单个虚拟机开启虚拟化:

  • 关闭虚拟机
  • "编辑虚拟机设置" ---> "选项" ---> "高级" ---> "常规" ---->"配置参数"
  • 在配置参数中添加三个变量
nce.enable = TRUE
hypervisor.cpuid.v0 = FALSE
vhv.enable= TRUE

# 1.2 KVM核心软件包

安装:

yum install kvm libvirt python-virtinst qemu-kvm virt-viewer bridge-utils -y

如果服务器上有桌面环境,想使用图形界面管理器virt-manager,可以安装完整的KVM环境:

yum groupinstall Virtualization 'Virtualization Client' 'Virtualization Platform' 'Virtualization Tools' -y

验证内核模块是否加载:

lsmod | grep kvm

启动虚拟机管理接口服务并设置开机启动:

systemctl enable libvirtd && systemctl restart libvirtd

启动libvirtd后,会自动创建了一个网卡NAT,并启动dnsmasq服务,用来为虚拟机分配IP地址

# 1.3 libvirtd配置(可不配置)

mkdir /etc/default
vim /etc/default/libvirt-bin
start_libvirtd="yes"
libvirtd_opts="-d -l"
cat /etc/libvirt/libvirtd.conf
listen_tls = 0
listen_tcp = 1
tcp_port = "16509"
listen_addr = "0.0.0.0"
unix_sock_group = "libvirtd"
unix_sock_ro_perms = "0777"
unix_sock_rw_perms = "0770"
auth_unix_ro = "none"
auth_unix_rw = "none"
auth_tcp = "none"
auth_tls = "none"
cat /etc/libvirt/qemu.conf
# vnc_listen = "0.0.0.0"
vnc_tls = 0
# vnc_password = ""
systemctl restart libvirtd

# 2、配置桥接网络

cd /etc/sysconfig/network-scripts
cp ifcfg-ens192 ifcfg-br0

ifcfg-br0 修改TYPENAMEDEVICE, 删除UUID

TYPE="Bridge"
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="br0"
DEVICE="br0"
ONBOOT="yes"
IPADDR="192.168.1.120"
PREFIX="24"
GATEWAY="192.168.1.1"
DNS1="223.5.5.5"
DNS2="8.8.8.8"
IPV6_PRIVACY="no"

ifcfg-ens192 增加BRIDGE=br0

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="dfb90216-70bf-445c-a308-a94cea27854f"
DEVICE="ens192"
ONBOOT="yes"
IPADDR="192.168.1.120"
PREFIX="24"
GATEWAY="192.168.1.1"
DNS1="223.5.5.5"
DNS2="8.8.8.8"
IPV6_PRIVACY="no"
BRIDGE=br0
systemctl restart network && systemctl restart docker

# 3、创建虚拟机

# 3.1 创建相应目录

/kvm/
	img/
	vm/

# 3.2 下载iso文件

cd /kvm/img
wget https://repo.huaweicloud.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso

# 3.3 创建模版虚拟机

vm1.sh

virt-install \
  --name vm1 \
  --memory 1024 \
  --vcpus 1 \
  --location /kvm/img/CentOS-7-x86_64-DVD-2009.iso \
  --os-type linux \
  --os-variant rhel7 \
  --disk path=/kvm/vm/vm1.qcow2,size=10 \
  --network bridge=br0 \
  --graphics vnc,listen=0.0.0.0 \
  --noautoconsole \
  --accelerate \
  --autostart

创建虚拟机

sh vm1.sh

目录结构

/kvm/
    img/
        CentOS-7-x86_64-DVD-2009.iso
	template/
	vm/
	    vm1.qcow2
	vm1.sh

# 3.4 制作镜像模板

# 虚拟机执行
yum install cloud-init -y
# 宿主机执行
yum install libguestfs-tools -y
cp /kvm/vm/vm1.qcow2 /kvm/template/vmt.qcow2
virt-sysprep -a /kvm/template/vmt.qcow2

# 3.5 cloud-init自定义创建虚拟机

metadata.yaml

instance-id: VM_NAME
local-hostname: VM_NAME

user-data.yaml

#cloud-config
preserve_hostname: False
hostname: VM_NAME
fqdn: VM_NAME.vm.pascall.cn

ssh_pwauth: true
users:
  - name: root
chpasswd:
  expire: false
  list: |
    root:ROOT_PWD

timezone: Asia/Shanghai
runcmd:
  - sed -i 's/BOOTPROTO=dhcp/BOOTPROTO=static/' /etc/sysconfig/network-scripts/ifcfg-eth0
  - echo "PROXY_METHOD=none" >> /etc/sysconfig/network-scripts/ifcfg-eth0
  - echo "NAME=eth0" >> /etc/sysconfig/network-scripts/ifcfg-eth0
  - echo "IPADDR=IP_ADDR" >> /etc/sysconfig/network-scripts/ifcfg-eth0
  - echo "NETMASK=255.255.255.0" >> /etc/sysconfig/network-scripts/ifcfg-eth0
  - echo "GATEWAY=192.168.1.1" >> /etc/sysconfig/network-scripts/ifcfg-eth0
  - echo "DNS1=223.5.5.5" >> /etc/sysconfig/network-scripts/ifcfg-eth0
  - echo "DNS2=8.8.8.8" >> /etc/sysconfig/network-scripts/ifcfg-eth0
  - systemctl restart network
  - systemctl restart docker
  - touch /etc/cloud/cloud-init.disabled

镜像扩容(不可缩容)

qemu-img info ./vm5.qcow2c
qemu-img resize ./vm5.qcow2c 20G
qemu-img info ./vm5.qcow2c

create.sh

VM_NAME=$1
CPU_NUM=$2
MEM_NUM=$3
IP_ADDR=$4
ROOT_PWD=$5

echo "VM_NAME: $VM_NAME, CPU_NUM: $CPU_NUM, MEM_NUM: $MEM_NUM, IP_ADDR: $IP_ADDR, ROOT_PWD: $ROOT_PWD"

if [ ! -n "$VM_NAME" ] ;then
  echo "VM_NAME参数为空"
  exit 1
fi
if [ ! -n "$CPU_NUM" ] ;then
  echo "CPU_NUM参数为空"
  exit 1
fi
if [ ! -n "$MEM_NUM" ] ;then
  echo "MEM_NUM参数为空"
  exit 1
fi
if [ ! -n "$IP_ADDR" ] ;then
  echo "IP_ADDR参数为空"
  exit 1
fi
if [ ! -n "$ROOT_PWD" ] ;then
  echo "ROOT_PWD参数为空"
  exit 1
fi

mkdir /kvm/vm/$VM_NAME
cp /kvm/template/vmt.qcow2 /kvm/vm/$VM_NAME/$VM_NAME.qcow2

cp /kvm/template/metadata.yaml /kvm/vm/$VM_NAME/metadata.yaml
sed -i "s/VM_NAME/$VM_NAME/" /kvm/vm/$VM_NAME/metadata.yaml

cp /kvm/template/user-data.yaml /kvm/vm/$VM_NAME/user-data.yaml
sed -i "s/VM_NAME/$VM_NAME/" /kvm/vm/$VM_NAME/user-data.yaml
sed -i "s/IP_ADDR/$IP_ADDR/" /kvm/vm/$VM_NAME/user-data.yaml
sed -i "s/ROOT_PWD/$ROOT_PWD/" /kvm/vm/$VM_NAME/user-data.yaml
 
cloud-localds /kvm/vm/$VM_NAME/init.img /kvm/vm/$VM_NAME/user-data.yaml /kvm/vm/$VM_NAME/metadata.yaml

virt-install --name $VM_NAME \
  --vcpus $CPU_NUM \
  --memory $MEM_NUM \
  --os-variant=rhel7.9 \
  --network bridge=br0,model=virtio \
  --disk /kvm/vm/$VM_NAME/$VM_NAME.qcow2 \
  --disk /kvm/vm/$VM_NAME/init.img,device=cdrom \
  --import \
  --graphics vnc,listen=0.0.0.0 \
  --noautoconsole \
  --accelerate \
  --autostart

delete.sh

VM_NAME=$1

echo "VM_NAME: $VM_NAME"

if [ ! -n "$VM_NAME" ] ;then
  echo "VM_NAME参数为空"
  exit 1
fi

virsh destroy $VM_NAME \
  && virsh undefine $VM_NAME \
  && rm -rf /kvm/vm/$VM_NAME

start

sh create.sh vm2 1 1024 192.168.1.112 root

delete

sh delate.sh vm2

目录结构

/kvm/
    img/
        CentOS-7-x86_64-DVD-2009.iso
	template/
	    vmt.qcow2
		metadata.yaml
		user-data.yaml
	vm/
	    vm1.qcow2
	vm1.sh
	create.sh
	delete.sh

# 3.6 模版创建虚拟机

导出模版配置

virsh dumpxml --domain vm1 > /kvm/template/vmt.xml

修改vmt.xml, 修改disk>source引用模板vmt.qcow2, 删除字段nameuuiddevices.interface.mac

<domain type='kvm'>
  <memory unit='KiB'>1048576</memory>
  <currentMemory unit='KiB'>1048576</currentMemory>
  <vcpu placement='static'>1</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode='custom' match='exact' check='partial'>
    <model fallback='allow'>Broadwell</model>
  </cpu>
  <clock offset='utc'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/kvm/template/vmt.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hda' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <controller type='virtio-serial' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </controller>
    <interface type='bridge'>
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <channel type='unix'>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <input type='tablet' bus='usb'>
      <address type='usb' bus='0' port='1'/>
    </input>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <video>
      <model type='cirrus' vram='16384' heads='1' primary='yes'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </memballoon>
    <rng model='virtio'>
      <backend model='random'>/dev/urandom</backend>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
    </rng>
  </devices>
</domain>

创建虚拟机:

virt-clone \
  --connect qemu:///system \
  --original-xml /kvm/template/vmt.xml \
  --name=vm4 \
  --file=/kvm/vm/vm4.qcow2

修改ip:

# 虚拟机内操作
vim /etc/sysconfig/network-scripts/ifcfg-eth0
systemctl restart network && systemctl restart docker

目录结构:

/kvm/
	img/
		CentOS-7-x86_64-DVD-2009.iso
	template/
		vmt.qcow2
		vmt.xml
	vm/
	    vm4.qcow2
	vm1.sh

# 4 WebVirtMgr安装-docker

宿主机设置映射文件:

sudo groupadd -g 1010 webvirtmgr
mkdir /data && mkdir /data/vm
sudo useradd -u 1010 -g webvirtmgr -s /sbin/nologin -d /data/vm webvirtmgr
sudo chown -R webvirtmgr:webvirtmgr /data/vm

运行容器:

docker run -d -p 8080:8080 -p 6080:6080 --restart always --name webvirtmgr -v /data/vm:/data/vm primiano/docker-webvirtmgr

修改监听地址及修改密码、添加免密登录:

docker exec -it webvirtmgr bash
# 修改监听地址
sed -i 's/172.17.42.1/0.0.0.0/g' /webvirtmgr/vrtManager/create.py
# 修改admin密码
cd /webvirtmgr
python manage.py changepassword admin # 等待输入密码
# 添加免密登录
su - webvirtmgr -s /bin/bash
ssh-keygen # 一直回车
touch ~/.ssh/config && echo -e "StrictHostKeyChecking=no\nUserKnownHostsFile=/dev/null" >> ~/.ssh/config
chmod 0600 ~/.ssh/config
ssh-copy-id root@192.168.1.120 # 等待输入kvm主机ssh密码
exit