KVM 虚拟机管理和基本使用

KVM 虚拟机管理和基本使用

KVM 简介
KVM — 全称是基于内核的虚拟机(Kernel-based Virtual Machine)
是一个开源软件,基于内核的虚拟化技术,实际是嵌入系统的一个虚拟化模块,通过
优化内核来使用虚拟技术,该内核模块使得Linux 变成了一个Hypervisor,虚拟机使用Linux自身的调度器进行管理。

KVM 是基于虚拟化扩展(Intel VT 或者AMD-V)的X86 硬件的开源的Linux 原生
的全虚拟化解决方案。KVM 中,虚拟机被实现为常规的Linux 进程,由标准Linux 调度
程序进行调度;虚机的每个虚拟CPU 被实现为一个常规的Linux 进程。这使得KVM 能
够使用Linux 内核的已有功能。但是,KVM 本身不执行任何硬件模拟,需要客户空间程序通过/dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是QEMU。

QEMU 是一套由Fabrice Bellard 所编写的模拟处理器的自由软件。它与Bochs,PearPC 近似,但其具有某些后两者所不具备的特性,如高速度及跨平台的特性。经由kqemu 这个开源的加速器,QEMU 能模拟至接近真实电脑的速度。

libvirt 是管理虚拟机和其他虚拟化功能的软件,比如存储管理,网络管理的软件集合。它包括一个API 库,一个守护程序(libvirtd)和一个命令行工具(virsh);libvirt 本身构建于一种抽象的概念之上。它为受支持的虚拟机监控程序实现的常用功能提供通用的API。libvirt的主要目标是为各种虚拟化工具提供一套方便、可靠的编程接口,用一种单一的方式管理多种不同的虚拟化提供方式。

注意:我们通常所说和使用的KVM 虚拟机,实际上是这三个软件的结合

安装kvm、qemu、libvirtd:
查看和打开CPU 虚拟化支持:

egrep "(svm|vmx)" /proc/cpuinfo #查看cpu 是否支持虚拟化
注:
vmx 对应inter 的cpu
svm 对应amd 的cpu
需在主板bios 打开虚拟化选项,多数计算机默认处于打开状态

查看内核kvm 支持

lsmod|grep kvm

安装所需软件包

apt-get install libvirt0 libvirt-daemon qemu virt-manager bridge-utils libvirt-clients
python-libvirt qemu-efi uml-utilities virtinst qemu-system

#安装KVM 和相关虚拟化工具
启动libvirtd

systemctl restart libvirtd.service #启动libvirtd
systemctl status libvirtd.service #查看启动状态

两种管理虚拟机的方法:
virt-manager 是图形化方式,相对直观。
virsh 是命令行方式

KVM 配置与应用

virsh 命令行管理工具详解

virsh(虚拟shell),基于命令行的管理工具,可以实现简单的资源管理。支持交互模式
virsh shutdown deepin1 #正常关闭vm 虚拟机
virsh start deepin1 #启动kvm 虚拟机
virsh destroy deepin1 #强制关闭kvm 虚拟机
virsh list #显示本地活动虚拟机
virsh list --all #查看所有虚拟机
virsh suspend deepin1 #挂起kvm 虚拟机
virsh resume deepin1 #恢复被挂起虚拟机
virsh dominfo deepin1 #查看指定虚拟机的配置摘要信息
virsh undefine deepin1 #删除kvm 虚拟机(如果虚拟机处于runing,一旦关闭就会消失)
virsh dumpxml deepin1 #显示虚拟机的当前配置文件
virsh define deepin2.xml #通过配置文件定义一个虚拟机(这个虚拟机还不是活动的)
virsh autostart deepin1 #虚拟机设为自动启动(成/etc/libvirt/qemu/autostart/)
virsh autostart --disable deepin1 #取消自动启动
virsh edit deepin1 #编辑配置文件(一般是在刚定义完虚拟机之后)
virsh setmem deepin1 512000 #给虚拟机设置内存大小
virsh setvcpus deepin1 4 #给虚拟机设置cpu 个数

qemu-img 是一个功能强制磁盘镜像管理工具

qemu-img --help 包括以下功能
check 检查完整性
create 创建镜像
commit 提交更改
compare 比较
convert 转换
info 获得信息
map 映射
snapshot 快照管理
rebase 在已有的镜像的基础上创建新的镜像
resize 调整大小
amend 修订镜像格式选

KVM 虚拟机的xml 配置文件说明

xml 配置文件也就是通常所说的虚拟机的描述文件,主要用来定义一个虚拟机的名称、UUID、CPU、内存、虚拟磁盘、网卡等各种参数设置
/etc/libvirt/qemu/ #配置文件默认路径

deepin.xml 配置文件说明:

<domain type='kvm'>
<name>deepin</name> #虚拟机的名字
<uuid>16e9cb49-8b05-4b34-9325-3bcf169dd32e</uuid> #uuid 值
<memory unit='KiB'>4194304</memory> #虚拟机的最大内存
<currentMemory unit='KiB'>4194304</currentMemory> #虚拟机当前的内存
<vcpu placement='static'>4</vcpu> #该虚拟机的cpu 数
<os>
<type arch='x86_64' machine='pc-i440fx-3.1'>hvm</type> #hvm 表示全虚拟化
<boot dev='hd'/> #hd 表示从硬盘启动
</os>
。。。。。。。。。。
<emulator>/usr/bin/qemu-system-x86_64</emulator> #二进制模拟器设备的完整路径
<disk type='file' device='disk'> #disk 是用来描述磁盘的主要容器
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/kvm/deepin.qcow2'/> #指定磁盘上文件的绝对路径
<target dev='hda' bus='ide'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
<interface type=' direct #桥接设备
<mac address='52:54:00:0c:ae:41'/> #MAC 地址
<source dev='enp2s0' mode='bridge'/>
<model type='e1000'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<source network='br0/>

KVM 虚拟机重命名技术

生成新的UUID 字串,并复制备用
uuidgen

76d5dc2c-5eef-4e30-8b6c-e58851814f84

virsh edit deepin #编辑虚拟机配置

<domain type='kvm'>
<name>deepin2</name> #新名称
<uuid>76d5dc2c-5eef-4e30-8b6c-e58851814f84</uuid> #新UUID 值

virsh list --all #确认导入的新配置

Id Name State
-----------------------
-deepin1 shut off
- deepin2 shut off #新名称的虚拟机

virsh undefine deepin1 #删除旧名称的虚拟机
virsh list --all #确认结果

Id Name State
-----------------------
- deepin2 shut off

KVM 虚拟机的复制技术

生成新UUID,并复制备用
uuidgen

7b292992-a86e-4386-951f-a577365cc721

导出配置

virsh dumpxml deepin2>/etc/libvirt/qemu/deepin3.xml

修改导出后的配置
vim /etc/libvirt/qemu/deepin3.xml

vim /etc/libvirt/qemu/deepin3.xml
<domain type='kvm'>
<name>deepin3</name> #新名称
<uuid>3d7f2197-8dad-473c-99af-0570cd02ae5c</uuid> #新UUID 值
<memory unit='KiB'>4194304</memory> #内存大小,单位KB
<currentMemory unit='KiB'>4194304</currentMemory> #虚拟机分配的内存大
小,单位KB
<vcpu placement='static'>2</vcpu> #虚拟CPU 核数
.......
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/deepin3.qcow2'/> #新磁盘路径
<target dev='hda' bus='ide'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
.......
<interface type='network'> #虚拟机网络连接方式
<mac address='52:54:00:f5:9c:44'/> #修改MAC 地址
<source network='private1'/> #当前主机网桥的名称
<model type='e1000'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
.......

确认结果
virsh list --all

定义新虚拟机
virsh define deepin3.xml

Id Name State
-----------------------
- deepin2 shut off
- deepin3 shut off #新虚拟机

虚拟机快照建立的方式

快照(raw 格式的磁盘无法创建快照)

#qemu-img snapshot -l /kvm/img/test12.qcow2 #查看磁盘快照
virsh snapshot-list test12 #查看快照
virsh snapshot-create test12 #生成快照
virsh snapshot-create-as test12 snap1 #自定义快照名
virsh snapshot-revert test12 snap1 #快照恢复虚拟机
virsh snapshot-delete test12 snapname #删除指定快照
virsh snapshot-current test12

项目实战

1. 使用命令行工具创建虚拟机
用法: virt-install --name NAME --memory MB STORAGE INSTALL [options]
用途:从指定安装源创建新虚拟机。
示例
创建镜像文件

qemu-img create -f qcow2 -o size=20G /data/kvm/deepin-server3.qcow2

通过cdrom 镜相引导安装系统:

virt-install -n deepin-server3 --vcpus 2 -r 4096 -c
/home/yanght/ISO/uniontechos-desktop-20-professional-1021_amd64.iso --disk
/data/kvm/deepin-server3.qcow2,bus=virtio,size=20 --graphics vnc,listen=0.0.0.0 --network
bridge=virbr0,model=virtio

2. 利用已有的虚拟机配置文件创建新的虚拟机
把deepin2 当做模板机,提取deepin2 的虚拟机磁盘、xml 配置文件

qemu-img info /var/lib/libvirt/images/deepin2.qcow2

输出:

image: /var/lib/libvirt/images/deepin.qcow2
file format: qcow2
virtual size: 64G (68719476736 bytes) #虚拟机磁盘容量
disk size: 8.1G #在KVM 服务器占用容量
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: true
refcount bits: 16
corrupt: false

复用deepin2 模板机的磁盘数据

qemu-img create -f qcow2 -b /var/lib/libvirt/images/deepin2.qcow2
/var/lib/libvirt/images/deepin4.qcow2

复制配置

cd /etc/libvirt/qemu/
cp deepin2.xml deepin4.xml

修改配置文件
vim deepin4.xml

<name>deepin4</name> #新虚拟机名称
<uuid>da2478f0-abf0-11ea-a912-6f46e76df6b1</uuid> #新UUID 值
<disk type='file' device='disk'> #文件类型
<driver name='qemu' type='qcow2'/> #磁盘类型
<source file='/var/lib/libvirt/images/deepin4.qcow2'/> #新虚拟卷位置
<target dev='hda' bus='ide'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
</controller>
<interface type='network'> #虚拟机的网络接口类型
#删除MAC 地址
<source network='network1'/> #虚拟机的网卡的源网络名称
<model type='e1000'/>

根据配置文件定义虚拟机

virsh define /etc/libvirt/qemu/deepin4.xml

查看所有虚拟主机
virsh list --all

Id Name State
-----------------------
- deepin2 shut off
- deepin4 shut off

开启deepin 虚拟机

virsh start deepin4

3. 使用命令行工具完成磁盘设备的热插拔
virsh attach-disk (添加磁盘设备)
用法:

attach-disk <domain> <source> <target> [--targetbus <string>] [--driver <string>]
[--subdriver <string>] [--iothread <string>] [--cache <string>] [--io <string>] [--type <string>]
[--mode <string>] [--sourcetype <string>] [--serial <string>] [--wwn <string>] [--alias <string>]
[--rawio] [--address <string>] [--multifunction] [--print-xml] [--persistent] [--config] [--live]
[--current]

示例:
1、用qemu-img 创建一块100G 的qcow2 硬盘

SOURCEFILE=/data/kvm/deepin-server1-disk1.qcow2
qemu-img create -f qcow2 $SOURCEFILE 20G

2、附加磁盘到指定虚拟机

DOMAIN=deepin-server1
TARGET=sdb
virsh attach-disk --domain $DOMAIN --source $SOURCEFILE --target $TARGET
--subdriver qcow2 --config --live

:想要挂载数据盘文件的虚拟机名

TARGET:一般为vdb,vdc…
–subdriver:这一项是必须的,如果不加的话,虚拟机不知道镜像文件的格式,挂载
就会失败。
Virsh detach-disk (删除磁盘设备)
用法:

detach-disk <domain> <target> [--persistent] [--config] [--live] [--current] [--print-xml]

示例:

virsh detach-disk deepinserver1 sdb

输出:

Disk detached successfully

KVM 虚拟机访问:

连接方式主要分为两大类:

1. 本地连接

    1.1 适用情况:当我们在kvm hypervisor上时,可使用本地连接的方式;当然也能使用网络连接的方式(回环网络)

    1.2 连接工具:

        1.2.1 virt-manager,和windows下的vmware很是相似,图形界面友好;

        1.2.2 virt-viewer,连接命令:virt-viewer -c qemu:///system VMachinename;

        1.2.3 console,连接命令: virsh console VMachinename;

2. 网络连接

    2.1 适用情况:不能使用上面工具连接时

    2.2 连接工具:

        2.2.1 vnc,「事先配置好vnc服务」

            连接命令: 1. virsh vncdisplay/domdisplay VMachinename  2. vncviewer ip:port,其中port是由命令1获得;

                                 或把上面两条命令结合起来:vncviewer $(virsh vncdisplay VMachinename)

        2.2.2 ssh,「事先配置好ssh服务」

            连接命令: ssh user@ip

    如何为KVM guest虚拟机启用Virsh控制台访问

创建KVM guest 虚拟机后,我可以通过SSH,VNC客户端,Virt-viewer,Virt-manager和Cockpit Web控制台等访问它们。但是我无法使用“ virsh console”命令访问它们。对于那些想知道的人,“ virsh console”命令用于从主机系统连接到虚拟机机的控制台。在查看KVM文档之后,我发现我们应该在KVM guest虚拟机系统中启用串行控制台,以便为KVM guest虚拟机启用virsh控制台访问。

我的Ubuntu 20.04系统中运行的是CentOS 8虚拟机。

我尝试使用以下命令访问CentOS 8 VM的控制台:

$ virsh console centos8

我得到这个输出:

它说我连接到centos8虚拟机,但我没有看到虚拟机的控制台。我无法通过这个屏幕。它一直显示这个空白屏幕,直到我按CTRL+]键手动退出它。如果你曾经遇到过这种情况,按照下面的方法启用串行控制台服务即可。

为KVM guest虚拟机启用Virsh控制台访问

如前所述,您必须在虚拟机中添加一个串行控制台,以便从主机系统访问其virsh控制台。

为此,请通过SSH或Virt-manager或Cockpit登录到虚拟机,然后运行以下命令来启用和启动串行控制台:

# systemctl enable [email protected]

# systemctl start [email protected]

请注意,以上命令应在KVM虚拟机中运行,而不是在KVM母机中运行。

至此,我们已在虚拟机中启用了串行控制台界面。

您可以通过查看VM的配置XML文件来验证它:

$ virsh edit centos8

如果启用了串行控制台,您将看到以下几行:

关闭XML文件,然后从客户机退出。

现在,使用以下命令从主机启动虚拟机系统的virsh控制台:

$ virsh console centos8

您将收到以下消息:

再次按Enter,然后输入用户名和密码以连接到访客计算机。

您现在位于虚拟机的控制台中。开始使用它。您可以随时通过按“ CTRL +]”键切换回主机控制台。

猜你喜欢

转载自blog.csdn.net/a1058926697/article/details/131667182