【虚拟化应用系列教程】KVM虚拟机管理
上一期教程:虚拟化的类型和KVM虚拟化应用安装
一、创建虚拟机
1.图形化创建虚拟机
建议您的实体机已经安装
GUI
图形化界面
或者使用Xmanager
软件
[root@lvm ~]# virt-manager
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 编码
三、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.关于Linux
的OOM
机制
**
OOM
全称Out Of Memeroy
内存泄露 **
当系统内存不足的时候,会触发OOM
机制,保证内核的正常运行
当系统发生oom
时,内核会产生oom killer
机制,根据进程的oom_score
随机杀进程
四、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 活动 是 是