【虚拟化应用系列教程】KVM虚拟机管理

上一期教程:虚拟化的类型和KVM虚拟化应用安装

一、创建虚拟机

1.图形化创建虚拟机

建议您的实体机已经安装GUI图形化界面
或者使用Xmanager软件

[root@lvm ~]# virt-manager

kvm08

kvm09

2.命令行创建虚拟机

[root@lvm ~]# virt-install --name=vm02 \
--graphics vnc,listen=0.0.0.0,port=5920,keymap=en_us \
--memory=1024,maxmemory=2048 \
--vcpus 1,maxvcpus=2 \
--disk path=/var/lib/libvirt/images/vm02.qcow2,size=10,format=qcow2 \
--bridge=virbr0 \
--cdrom=/img/CentOS-7-x86_64-DVD-2009.iso \
--autostart
  • --name=虚拟机名字
  • --graphics远程连接协议
  • keymap=键盘映射语言
  • --memory=虚拟机内存,maxmemory=最大允许内存
  • vcpus处理器核数,maxvcpus处理器最大核数
  • --disk path=硬盘文件存储位置和名字,size=硬盘大小,format=磁盘镜像格式
  • --bridge=网卡名
  • --cdrom=安装镜像路径
  • --autostart开机自启动虚拟机

3.查看所有虚拟机

[root@lvm ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 4     vm01                           running
 6     vm02                           running

4.停止/启动虚拟机

[root@lvm ~]# virsh shutdown vm01
域 vm01 被关闭
[root@lvm ~]# virsh start vm01
域 vm01 已开始

二、连接KVM虚拟机

1.SSH

[root@lvm ~]# ssh root@192.168.122.51

2.virt-manager图形化工具

[root@lvm ~]# virt-viewer 虚拟机名字
[root@lvm ~]# virt-viewer vm01

3.VNC远程

先安装VNC依赖

[root@lvm ~]# yum install -y vnc

连接KVM虚拟机

[root@lvm ~]# vncviewer 物理机IP:端口号
查看VNC端口号

关于grep过滤教程:https://www.wsjj.top/archives/39
过滤结果并不是VNC的真正端口号!!!
VNC有个默认行为,列:端口号为5910,那么过滤出来的只有后2位数字,就是10

[root@lvm ~]# ps -aux  | grep "vnc" | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:[0-9]{1,5}"
0.0.0.0:10
0.0.0.0:20

使用VNC连接KVM虚拟机

[root@lvm ~]# vncviewer 192.168.140.16:5910

TigerVNC 查看器 64 位 v1.8.0
构建于:2023-04-05 13:47
版权所有 1999-2017 TigerVNC 团队及众多开发者(参见 README.txt)
访问 http://www.tigervnc.org 以获取更多关于 TigerVNC 的信息。

Tue May 30 19:27:28 2023
 DecodeManager: Detected 4 CPU core(s)
 DecodeManager: Creating 4 decoder thread(s)
 CConn:       已连接到主机 192.168.140.16 的端口 5910
 CConnection: Server supports RFB protocol version 3.8
 CConnection: Using RFB protocol version 3.8
 CConnection: Choosing security type None(1)
 CConn:       正在使用像素格式 depth 24 (32bpp) little-endian rgb888
 CConn:       使用 Tight 编码

kvm10

三、CPU热添加、内存气球

1.CPU热添加

  • 前提: 设置最大CPU数量
  • 作用:提升CPU利用率

A.查看当前虚拟机CPU数量

# virsh dominfo 虚拟机名
[root@lvm ~]# virsh dominfo vm01
Id:             4
名称:       vm01
UUID:           edbc2be7-4aa8-4980-a7da-a29b078cd610
OS 类型:    hvm
状态:       running
CPU:          1
CPU 时间:   68.7s
最大内存: 2097152 KiB
使用的内存: 1048576 KiB
持久:       是
自动启动: 启用
管理的保存: 否
安全性模式: none
安全性 DOI: 0

B.在线调整CPU

# virsh setvcpus 虚拟机名 CPU数量
[root@lvm ~]# virsh setvcpus vm01 2 --live
  • --live立即生效
[root@lvm ~]# virsh dominfo vm01
Id:             4
名称:       vm01
UUID:           edbc2be7-4aa8-4980-a7da-a29b078cd610
OS 类型:    hvm
状态:       running
CPU:          2	#CPU变成2了
CPU 时间:   73.0s
最大内存: 2097152 KiB
使用的内存: 1048576 KiB
持久:       是
自动启动: 启用
管理的保存: 否
安全性模式: none
安全性 DOI: 0

2.内存气球memballoon

  • 前提:
    • 设置最大的内存量
    • 确保虚拟机支持内存气球驱动virtio
  • 作用:提升内存利用率

A.检查虚拟机是否支持virtio驱动

能查到结果,代表支持

# virsh dumpxml 虚拟机名
[root@lvm ~]# virsh dumpxml vm01 | grep -i "memballoon"
    <memballoon model='virtio'>
    </memballoon>

B.查看当前虚拟机内存

# virsh qemu-monitor-command 虚拟机名 --hmp info balloon
[root@lvm ~]# virsh qemu-monitor-command vm01 --hmp info balloon
balloon: actual=1024

C.增加内存

[root@lvm ~]# virsh qemu-monitor-command vm01 --hmp balloon 2048
[root@lvm ~]# virsh qemu-monitor-command vm01 --hmp info balloon
balloon: actual=2048

D.缩减内存

此操作存在危险,请谨慎操作!

[root@lvm ~]# virsh qemu-monitor-command vm01 --hmp balloon 20

E.关于LinuxOOM机制

**OOM全称Out Of Memeroy内存泄露 **
当系统内存不足的时候,会触发OOM机制,保证内核的正常运行
当系统发生oom时,内核会产生oom killer机制,根据进程的oom_score随机杀进程

kvm11

四、KVM虚拟机相关文件

KVM虚拟机的组成包括:xml配置文件+虚拟磁盘镜像文件

1.虚拟机配置文件

配置文件路径:/etc/libvirt/qemu/
虚拟机加入开机自启动配置文件路径:/etc/libvirt/qemu/autostart/
虚拟机网络配置文件路径:/etc/libvirt/qemu/networks/
虚拟机网络开机自启动配置文件路径:/etc/libvirt/qemu/networks/autostart/
虚拟机虚拟磁盘文件路径:/var/lib/libvirt/images/

2.修改虚拟机配置文件

注意:不支持使用vim编辑器直接修改

# virsh edit 虚拟机名
[root@lvm ~]# virsh edit vm01

<domain type='kvm'>
  <name>vm01</name>
  <uuid>edbc2be7-4aa8-4980-a7da-a29b078cd610</uuid>
  <memory unit='KiB'>2097152</memory>
  <currentMemory unit='KiB'>1048576</currentMemory>
  <vcpu placement='static' current='1'>2</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-noTSX-IBRS</model>
    <feature policy='require' name='md-clear'/>
    <feature policy='require' name='spec-ctrl'/>
    <feature policy='require' name='ssbd'/>
  </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='/var/lib/libvirt/images/vm01.qcow2'/>
      <target dev='hda' bus='ide'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hdb' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='1'/>
    </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>
    <interface type='bridge'>
      <mac address='52:54:00:4f:35:95'/>
      <source bridge='virbr0'/>
      <model type='rtl8139'/>
      <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>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='vnc' port='5910' autoport='no' listen='0.0.0.0' keymap='en-us'>
      <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='0x05' function='0x0'/>
    </memballoon>
  </devices>
</domain>

3.把虚拟机加入开机自启动

# virsh autostart 虚拟机名
[root@lvm ~]# virsh autostart vm02
域 vm02标记为自动开始

4.删除虚拟机(重要)

大概过程:1.关闭虚拟机–>2.先删除虚拟机配置文件–>3.删除虚拟磁盘文件

关机

[root@lvm ~]# virsh destroy vm02
域 vm02 被删除

删除配置文件

[root@lvm ~]# virsh undefine vm02
域 vm02 已经被取消定义

删除虚拟磁盘文件

[root@lvm ~]# rm -rf /var/lib/libvirt/images/vm02.qcow2

5.离线迁移虚拟机

被迁移的机器,需要安装KVM环境

A.先关闭要迁移的虚拟机

[root@lvm ~]# virsh shutdown vm01
域 vm01 被关闭

[root@lvm ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     vm01                           关闭

B.拷贝配置文件

[root@lvm ~]# scp -r /etc/libvirt/qemu/vm01.xml root@192.168.140.10:/etc/libvirt/qemu/

C.拷贝虚拟磁盘文件

[root@lvm ~]# scp -r /var/lib/libvirt/images/vm01.qcow2 root@192.168.140.10:/var/lib/libvirt/images/

D.在新服务器上,定义虚拟机

[root@lvm2 ~]# virsh define /etc/libvirt/qemu/vm01.xml

E.启动虚拟机

[root@lvm2 ~]# virsh start vm01

F.设置开启自启动

[root@lvm2 ~]# virsh autostart vm01

6.虚拟网络配置

虚拟机网络配置文件路径:/etc/libvirt/qemu/networks/
虚拟机网络开机自启动配置文件路径:/etc/libvirt/qemu/networks/autostart/

A.查看所有虚拟网络

[root@lvm ~]# virsh net-list --all
 名称               状态     自动开始  持久
----------------------------------------------------------
 default              活动     是           是

B.创建一个自定义网络test

复制模板文件
[root@lvm ~]# cp /etc/libvirt/qemu/networks/default.xml /etc/libvirt/qemu/networks/test.xml
修改配置文件

可以使用uuidgen命令让系统随机生成一个uuid

[root@lvm ~]# vim /etc/libvirt/qemu/networks/test.xml

<network>
  <name>test</name>
  <uuid>0b8cd119-dfde-4f6c-bf18-a0822d867d72</uuid>	#可以使用注释中的uuidgen命令随机生成
  <forward mode='nat'/>
  <bridge name='test' stp='on' delay='0'/>
  <mac address='52:54:00:53:e6:5c'/>	#MAC地址随机,前6个字节52:54:00所有都是一样的,不用修改
  <ip address='192.168.123.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.123.2' end='192.168.123.254'/>
    </dhcp>
  </ip>
</network>
定义新配置文件
[root@lvm ~]# virsh net-define /etc/libvirt/qemu/networks/test.xml
从 test定义网络/etc/libvirt/qemu/networks/test.xml
查看所有网络
[root@lvm ~]# virsh net-list --all
 名称               状态     自动开始  持久
----------------------------------------------------------
 default              活动     是           是
 test                 不活跃  否           是
启用自定义网络,并且加入开机自启动
[root@lvm ~]# virsh net-start test
网络 test 已开始

[root@lvm ~]# virsh net-autostart test
网络test标记为自动启动

[root@lvm ~]# virsh net-list --all
 名称               状态     自动开始  持久
----------------------------------------------------------
 default              活动     是           是
 test                 活动     是           是

C.删除自定义虚拟网络

[root@lvm ~]# virsh net-destroy test
网络 test 被删除

[root@lvm ~]# virsh net-undefine test
网络 test 已经被取消定义

[root@lvm ~]# virsh net-list --all
 名称               状态     自动开始  持久
----------------------------------------------------------
 default              活动     是           是