Linux 桌面虚拟化技术 KVM
Posted 笨小孩@GF 知行合一
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 桌面虚拟化技术 KVM相关的知识,希望对你有一定的参考价值。
- KVM:是 Kernel-based Virtual Machine 的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM已成为学术界的主流VMM之一。
-
VM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术)。是基于硬件的完全虚拟化。而Xen早期则是基于软件模拟的Para-Virtualization,新版本则是基于硬件支持的完全虚拟化。但Xen本身有自己的进程调度器,存储管理模块等,所以代码较为庞大。广为流传的商业系统虚拟化软件VMware ESX系列是基于软件模拟的Full-Virtualization。
- KVM: 是指基于 Linux 内核的虚拟机(Kernel-based Virtual Machine)。是第一个整合到Linux 内核的虚拟化技术。在 KVM 模型中,每一个虚拟机都是一个由 Linux 调度程序管理的标准进程,你可以在用户空间启动客户机操作系统。
- 一个普通的 Linux 进程有两种运行模式:内核和用户。 KVM 增加了第三种模式:客户模式(有自己的内核和用户模式)
- XEN :需要升级内核,只能支持和物理机系统一样的操作系统。 xen 虚拟上,可以运行windows ?
- KVM: 支持 linux 以外的其它系统。比如:windows
QEMU:是一套由 Fabrice Bellard 所编写的以 GPL 许可证分发源码的模拟处理器,在GNU/Linux 平台上使用广泛。QEMU 具有高速度和跨平台的特性,QEMU 能模拟至接近真实电脑的速度。
QEMU 能模拟整个电脑系统,包括中央处理器及其他周边设备。
QEMU 和 vmware 一样,都是仿真虚拟化技术,效率比较低。QEMU 也是一种虚拟机技术。
- 实验环境:
- VM 虚拟机 CentOS 7.6 SElinux、Firewall以及iptables 均为关闭状态
- 查看 CPU 是否支持虚拟化
- egrep "vmx|svm" /proc/cpuinfo
- intel: vmx
- AMD: svm
- 如果显示为空,则表示不支持虚拟化,需要开启 主板 BIOS 虚拟化支持
- 安装 KVM 模块、管理工具和 libvirt,命令行安装:
- yum install qemu-kvm libvirt libguestfs-tools virt-install libvirt-python librbd1 -y
- 注:使用系统镜像,先配置好 yum 本地源
qemu-kvm : kvm 主程序, KVM 虚拟化模块
virt-manager: KVM 图形化管理工具,这里不安装不使用
libvirt: 虚拟化服务
libguestfs-tools : 虚拟机的系统管理工具
virt-install : 安装虚拟机的实用工具 。比如 virt-clone 克隆工具就是这个包安装的
libvirt-python : python 调用 libvirt 虚拟化服务的 api 接口库文件
librbd1:是一个属于librados的用户态接口库 - 安装完 KVM 后启动服务
- systemctl enable libvirtd --now
- 确定正确加载 kvm 模块
- lsmod |grep kvm
kvm_intel 188740 0
kvm 637515 1 kvm_intel
irqbypass 13503 1 kvm
- 如果启动报错,查看 系统日志 /var/log/messages 排查
-
解决办法:安装最新版本的 librbd1
-
配置 KVM 网络桥接功能
- 网桥介绍: 经常说的 Bridge 设备其实就是网桥设备,也就相当于现在的二层交换机,用于连接同一网段内的所有机器,目的就是将第一块网卡 ens33 添加到 br0,此时 br0 就成为了所谓的交换机设备,物理机的 ens33 也是连接在上面的。
- 添加桥接设备 br0: 相当于一个二层交换机
- 使用 virsh 命令配置网桥
- 使用 virsh 命令配置网桥很方便,但 br0 上不会自动配置 DNS,如果需要虚拟机上网需要自己添加DNS,过程如下:
# yum install libvirt-client -y #安装包括 virsh 命令的 rpm 包
# virsh iface-bridge ens33 br0 --no-stp
注:iface-bridge 网卡接口名 新建网桥名 不启用 stp 生成树协议
# echo 'DNS1=8.8.8.8' >> /etc/sysconfig/network-scripts/ifcfg-br0
# systemctl restart network.service
- 重启验证
- 扩展:virbr0 概述
virbr0 是一种虚拟网络接口,这是由于安装和启用了 libvirtd 服务后会自动生成一个桥设备名字为 virbr0。
libvirtd 这个服务,在安装系统时,已经帮你安装好并开机启动了。所以尽管我们没有安装 KVM,一样可以能看到这个 virbr0 这个桥设备。 - libvirtd 在服务器上生成一个 virtual network switch (virbr0),kvm 中所有的虚拟机(guests操作系统)通过这个 virbr0 连起来。默认情况下 KVM 中 virbr0 使用的是 NAT 网络模式。所以这种情况下 KVM 中的虚拟机需要通过物理机的网卡才能访问外部。
- 创建KVM 虚拟机,准备一个硬盘或者分区,用于存放安装好的 Linux 操作系统:
- mkfs.xfs /dev/sdc
- mount /dev/sdc /var/lib/libvirt/images/
- 写入 fstab 实现开机挂载
- virt-install 命令常用选项:
-n NAME, --name=NAME 指定 Guest 名字
-r MEMORY, --ram=MEMORY 指定内存大小
--vcpus=VCPUS 指定虚拟机的 CPU 数量
--disk 指定虚拟机磁盘存储文件的路径 , size=5 指定虚拟磁盘的大小,单位是 G;
例:--disk path=/var/lib/libvirt/images/centos-76.img,size=5
--accelerate KVM 或 KQEMU 内核加速器,这个选项默认是添加的。另外,如果系统 KVM 和KQEMU 加速器都支持,优先使用 KVM 加速器。
-c CDROM, --cdrom=CDROM 指定用于全虚拟化 Guest 的虚拟光驱, --cdrom=后指定ISO 或 CDROM 镜像。
--network #指定虚拟机的网卡模式。如:--network bridge=br0
-x EXTRA, --extra-args=EXTRA 用来给加载的 kernel 和 initrd 提供额外的内核命令行参数。比如无人值守安装系统 - 准备工作
- 基于 apache 服务器搭建本地 yum 源镜像
# yum install httpd -y
# systemctl enable httpd --now
# mkdir /var/www/html/centos7/ - 准备系统镜像:centos7.6 (不建议使用 MINI 版)
# mount /dev/cdrom /var/www/html/centos7/ - # iptables -F #关闭防火墙
-
创建 ks.cfg 自动应答文件
-
cat /var/www/html/ks.cfg
firewall --disabled
install
url --url="http://192.168.2.234/centos7"
rootpw --iscrypted $1$root$j0bp.KLPyr.u9kgQ428D10
auth --useshadow --passalgo=sha512
text
firstboot --disable
keyboard us
lang en_US.UTF-8
selinux --disabled
logging --level=info
reboot
timezone Asia/Shanghai
network --bootproto=dhcp --device=eth0 --onboot=on
bootloader --location=mbr
zerombr
clearpart --all --initlabel
part /boot --fstype="xfs" --size=500
#part swap --fstype="swap" --size=1000
#part / --fstype="ext4" --size=1 --growpart pv.156 --fstype="lvmpv" --size=1 --grow
volgroup centos --pesize=4096 pv.156
logvol swap --fstype="swap" --size=1000 --name=swap --vgname=centos
logvol / --fstype="xfs" --vgname=centos --size=1 --grow%packages
@base
@core
%end -
创建 centos-7 虚拟机:
- virt-install --name=centos7 --memory=4096,maxmemory=4096 --vcpus=4,maxvcpus=4 --os-type=linux --os-variant=rhel7 --location=http://192.168.2.234/centos7/ --network bridge=br0 -x "ks=http://192.168.2.234/ks.cfg" --disk path=/var/lib/libvirt/images/centos7.qcow2,size=10 --graphics=none --console=pty,target_type=serial --extra-args="console=tty0 console=ttyS0"
- KVM 虚拟机常用命令
# virsh list #列出在运行的虚拟机
# virsh start centos7 #启动 centos7虚拟机
# virsh shutdown centos7 #关闭 centos7 虚拟机
# virsh autostart centos7 #设置 centos7.虚拟机为物理机开机后,自动启动 - 重启验证
- shutdown 需要点时间
- 设为开机启动 kvm 中 centos7 虚拟机,但是 reboot 物理机后,没有启动。
解决:
# chkconfig --list libvirtd #开机启动了
# libvirtd 0:off 1:off 2:off 3:on4:on5:on6:off
# vim /etc/fstab #记得设置开机自动挂载 sdc,不然后开机启动不了虚拟机
-
KVM 虚拟机克隆和快照
- 克隆 kvm 虚拟机
克隆前,centos7.0 需要提前关机。
语法:virt-clone -o 原虚拟机 -n 新虚拟机 -f 新虚拟机镜像存放路径
选项:-o old -n new
虚拟机镜像: 就是整个虚拟机文件。 - virt-clone -o centos7 -n centos7-1 -f /var/lib/libvirt/images/centos7-1.qcow2
- KVM 虚拟机组成
一台 KVM 虚拟机由两部分组成:虚拟机配置文件和镜像 img
查看虚拟机的配置文件: -
ll /etc/libvirt/qemu
总用量 8
drwxr-xr-x 2 root root 25 8月 11 10:50 autostart
-rw------- 1 root root 3340 8月 13 12:34 centos7-1.xml
-rw------- 1 root root 3334 8月 11 10:31 centos7.xml
drwx------ 3 root root 42 8月 11 07:59 networks -
vim /etc/libvirt/qemu/centos7-1.xml
- 调整虚拟机配置,必须关闭该虚拟机
- viresh shutdown centos7-1
- 重新加载配置文件
- virsh define --file /etc/libvirt/qemu/centos7-1.xml
定义域 centos7-1(从 /etc/libvirt/qemu/centos7-1.xml)
- 发现内存已经调整为 1G
- 测试链接
- 修改 IP HOSTNAME
- 开启之前关闭的虚拟机
- virsh start centos7
- 原虚拟机和克隆完的虚拟机配置文件的区别:
- vimdiff /etc/libvirt/qemu/centos7.xml /etc/libvirt/qemu/centos7-1.xml
- 注:这里可以看出两者的 MAC 地址是不一样的。 所以对克隆或复制出来的虚拟机启动后,要修改网卡配置文件的 MAC 地址,因为克隆出来的虚拟机的真实 MAC 地址和操作系统中的 ifcfg-eth0 中的MAC 地址不一样。
- 虚拟机常用镜像格式对比
- 目前主要虚拟机的镜像格式:raw,cow, qcow,qcow2,vmdk 。
raw 格式镜像
raw:老牌的镜像格式,用一个字来说就是裸,也就是赤裸裸,你随便 dd 一个 file 就模拟了一个raw 格式的镜像。由于裸的彻底,性能上来说的话还是不错的。centos6 上 KVM 和 XEN 默认的格式还是这个格式。centos7 以上默认是 qcow2 。
裸的好处还有就是简单,支持转换成其它格式的虚拟机镜像对裸露的它来说还是很简单的(如果其它格式需要转换,有时候还是需要它做为中间格式),空间使用来看,这个很像磁盘,使用多少就是多少(du -h 看到的大小就是使用大小)。
例: qcow2 转为 vmdk 方法是: qcow2 转为 raw ,然后把 raw 转为 vmdk 。也可以直接 qcow2 转为 vmdk
raw 格式的缺点:不支持 snapshot 快照。 - cow、qcow、qcow2 格式
1、cow 格式:还没有成熟,就被放弃了。后来被 qcow 格式所取代。
2、qcow 格式:刚刚出现的时候有比较好的特性,但其性能和 raw 格式对比还是有很大的差距,目前已经被新版本的 qcow2 取代。
3、qcow2 格式:
现在比较主流的一种虚拟化镜像格式,经过优化,目前 qcow2 的性能上接近 raw 裸格式的性能qcow2 格式支持 snapshot,可以在镜像上做 N 多个快照,具有以下优点:
更小的存储空间
支持创建 image 镜像
支持多个 snapshot,对历史 snapshot 进行管理
支持 zlib 的磁盘压缩
支持 AES 的加密
4、 vmdk 格式:
VMware 的格式,整体性能最好,因为原本 VMware 就是做虚拟化起家。从性能和功能上来说,vmdk 应该算最出色的,由于 vmdk 结合了 VMware 的很多能力,目前来看,KVM 和 XEN 使用这种格式的情况不是太多。但就 VMware 的企业级虚拟化 Esxi 来看,它的稳定性和各方面的能力都很好
-
KVM 快照:
快照的作用:1、热备 2、灾难恢复 3、回滚到历中的某个状态 - 注:快照是存放在 kvm 的磁盘镜像中。
- kvm 快照,分两种:
方法 1:使用 lvm 快照,如果分区是 lvm,可以利用 lvm 进行 kvm 的快照备份
方法 2:使用 qcow2 格式的镜像创建快照。 - 创建 KVM 快照
- 要使用快照功能,磁盘格式必须为 qcow2。
- qemu-img info /var/lib/libvirt/images/centos7-1.qcow2
- 语法:virsh snapshot-create-as KVM 虚拟机名 快照名
- virsh snapshot-create-as centos7-1 系统初始
- 查看快照文件大小
- ll -h /var/lib/libvirt/qemu/snapshot/centos7-1/
- 查看当前 kvm 中的虚拟机,是基于哪个快照来运行
- virsh snapshot-current centos7-1 |head
- 查看快照占用的大小:
- emu-img info /var/lib/libvirt/images/centos7-1.qcow2
image: /var/lib/libvirt/images/centos7-1.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 3.3G
cluster_size: 65536
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK
1 系统初始 226M 2021-08-13 13:17:37 00:15:30.624
Format specific information:
compat: 1.1
lazy refcounts: true
- 恢复虚拟机快照必须关闭虚拟机
- 安装一些软件后创建快照
- 关闭虚拟机后执行恢复快照
- virsh snapshot-revert 虚拟机名称 快照名称
-
virsh shutdown centos7-1
域 centos7-1 被关闭virsh domstate centos7-1
关闭virsh snapshot-revert centos7-1 系统初始
virsh snapshot-current centos7-1 |head
- 删除快照
- virsh snapshot-delete centos7-1 vim_lrzsz
- virsh 常用命令
# virsh list #查看已启动的虚拟机列表
# virsh list --all #查看所有虚拟机列表
# virsh start centos7 #启动名称为 centos7 虚拟机
# virsh shutdown centos7 #关闭 名称为 centos7 虚拟机
# virsh dumpxml centos7 > /opt/centos7.xml #导出centos7 虚拟机配置文件
# virsh undefine centos7 #取消域 centos7.0 的定义。
注:virsh undefine centos7.0 会删除虚拟机 centos7.0 的配置文件,虚拟机 centos7.0 的磁盘
镜像文件还在。另外,发现“虚拟系统管理器”中管理的 kvm 虚拟机,没有 centos7.0
#
- 不能直接删除有快照的虚拟机,要先删除快照
- 列表、配置文件已经删除,但是磁盘文件依然存在
- 把虚拟机重新加入到 virt-manager 目录列表。
语法:virsh define 虚拟机.xml 的绝对路径 - # virsh destroy centos7 #强制关机,强制关闭 虚拟机。 当使用 virsh shutdown 正常关机,不行时,用这个。
# virsh autostart centos7#设置开机自启动 centos7.0
# virsh autostart --disable centos7.0 #取消虚拟机随宿主机开机自启
# virsh suspend centos7.0 #挂起虚拟机
# virsh resume centos7.0 #恢复虚拟机
-
qcow2 格式转换成 raw
- qemu-img convert -f qcow2 -O raw /var/lib/libvirt/images/centos7-1.qcow2 /var/lib/libvirt/images/centos7-1.raw
- 查看转换后的格式,已经转换成了 raw
- qemu-img info /var/lib/libvirt/images/centos7-1.raw
image: /var/lib/libvirt/images/centos7-1.raw
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 1.2G
- 修改虚拟机配置文件-使用新的磁盘格式启动虚拟机
- virsh edit centos7-1
- #注意 vim 直接编辑配置文件/etc/libvirt/qemu/xuegod63-kvm2.xml 不生效
修改后,需要重启服务
- 其他镜像格式转换方法
例 1:将 vmdk 转换为 qcow2
qemu-img convert -f vmdk -O qcow2 source-name.vmdk target-name.qcow2
例 2:将 qcow2 转换为 vmdk
]# cd /var/lib/libvirt/images/
]# qemu-img convert -f qcow2 -O vmdk centos7.img centos7.vmdk
以上是关于Linux 桌面虚拟化技术 KVM的主要内容,如果未能解决你的问题,请参考以下文章