前言
大家好,这里是开源技术实验室,我是TopJohn,互联网码农,开源爱好者。
今天主要介绍下KVM虚拟机,一种将物理机虚拟化的技术,简单来说就是可以把一台高性能的服务器虚拟化成多台普通服务器。例如一台64C-128G-8TB的Dell PowerEdge R740xd,可以利用虚拟化技术虚拟化为16台4C-8G-512GB的小型服务器。想想阿里云一台4C-8G的服务器卖咱们多少钱来着,按5兆带宽来算的话也得大几千吧,一台Dell PowerEdge R740xd搞下来3万多,虚拟化一下是不是贼香~!
果说你和我一样是在中小型互联网公司,那请一定要收藏这篇文章,因为它可以为公司节省不少云服务费,也能加深你对各种云服务器的简易原理。
简介
KVM(Kernel-based Virtual Machine)是一种开源的虚拟化技术,能够将物理服务器进行虚拟化,实现服务器资源灵活的分配利用。KVM 允许在 Linux 操作系统上创建和管理虚拟机,它利用 Linux 内核中的虚拟化扩展来提供硬件虚拟化的功能。它是一种裸机内核管理程序,可以将物理资源进行切分。
KVM 的主要特点包括:
- 高性能:KVM 利用硬件虚拟化来实现高性能的虚拟机,使虚拟机能够接近原生性能。
- 安全性:由于 KVM 利用了硬件虚拟化扩展,因此虚拟机之间和虚拟机与宿主机之间的隔离性非常好,有助于提高安全性。
- 开源:KVM 是开源项目,广泛受到社区支持和开发,可以自由使用和定制。
- 灵活性:KVM 支持多种操作系统作为虚拟机的客户机操作系统,包括不仅限于 Linux,还包括 Windows 和其他操作系统。
安装教程
前置条件
在安装之前,我们需要在物理服务器上安装好操作系统,这里以Ubuntu 22.04为例进行介绍,找了一台物理机来copy下信息:
css
➜ ~ neofetch
.-/+oossssoo+/-. op-lab@lab
`:+ssssssssssssssssss+:` ---------------
-+ssssssssssssssssssyyssss+- OS: Ubuntu 22.04.3 LTS x86_64
.ossssssssssssssssssdMMMNysssso. Host: PowerEdge R630
/ssssssssssshdmmNNmmyNMMMMhssssss/ Kernel: 5.15.0-73-generic
+ssssssssshmydMMMMMMMNddddyssssssss+ Uptime: 125 days, 4 hours, 46 mins
/sssssssshNMMMyhhyyyyhmNMMMNhssssssss/ Packages: 1011 (dpkg), 4 (snap)
.ssssssssdMMMNhsssssssssshNMMMdssssssss. Shell: zsh 5.8.1
+sssshhhyNMMNyssssssssssssyNMMMysssssss+ Resolution: 1024x768
ossyNMMMNyMMhsssssssssssssshmmmhssssssso Terminal: /dev/pts/0
ossyNMMMNyMMhsssssssssssssshmmmhssssssso CPU: Intel Xeon E5-2683 v4 (64) @ 3.000GHz
+sssshhhyNMMNyssssssssssssyNMMMysssssss+ GPU: 0a:00.0 Matrox Electronics Systems Ltd. G200eR2
.ssssssssdMMMNhsssssssssshNMMMdssssssss. Memory: 127727MiB / 193320MiB
/sssssssshNMMMyhhyyyyhdNMMMNhssssssss/
+sssssssssdmydMMMMMMMMddddyssssssss+
/ssssssssssshdmNNNNmyNMMMMhssssss/
.ossssssssssssssssssdMMMNysssso.
-+sssssssssssssssssyyyssss+-
`:+ssssssssssssssssss+:`
.-/+oossssoo+/-.
检查是否具备安装条件,看了不少博客,总结了几种方式,如下:
- 第一种,如果出现
VT-x
,大致意思应该是支持Virtualization虚拟化指令集。
ini
➜ ~ LC_ALL=C lscpu | grep Virtualization
Virtualization: VT-x
- 如果输出值大于0,那么虚拟化被启用。否则需要再BIOS设置中启用虚拟化。
bash
➜ ~ grep -Eoc '(vmx|svm)' /proc/cpuinfo
128
- 然后检查下你的服务器是否支持硬件加速。
javascript
➜ ~ sudo apt install cpu-checker
➜ ~ kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used
安装KVM套件
需要通过apt命令安装一些列虚拟化相关的安装包:
perl
sudo apt install -y qemu-kvm virt-manager libvirt-daemon-system virtinst libvirt-clients bridge-utils
- qemu-kvm:这是用于为KVM管理程序提供硬件仿真的软件,可以提供硬件底层的虚拟化,KVM的核心组件,用于虚拟机的管理和运行。
- virt-manager:是基于libvirt的GUI工具,一个图形化的虚拟机管理工具,可以帮助我们更轻松地创建、配置和管理虚拟机。
- libvirt:是管理虚拟机和其他虚拟化功能的软件集合,包含了守护进程
libvirtd
和一个命令行工具。它的主要目标是为各种虚拟化工具提供一套统一可靠的API。 - libvirt-daemon-system:为libvirt作为系统服务的守护进程运行。
- libvirt-clients:为虚拟机提供客户端工具和API,用于从命令行管理和控制虚拟机和管理程序。
- bridge-utils:用于配置以太网桥的命令行工具。
检查libvirtd
csharp
➜ ~ systemctl is-active libvirtd
#输出active表示已启动,没启动的话需要启动下
active
添加用户
将当前用户添加到libvirt
和kvm
用户组
bash
➜ ~ sudo usermod -aG libvirt $USER
➜ ~ sudo usermod -aG kvm $USER
创建网桥
一般我们创建虚拟机都希望能够在内网中直接访问即这个虚拟机拥有独立的内网ip,不需要通过物理机间接地去访问虚拟机,因此这里我们需要用到网桥,做一个桥接网络。
每个Linux操作系统网络管理方式都不太一样,在Ubuntu22.04中是用netplan来进行管理,配置文件位于/etc/netplan
中。
我们通过ifconfig
命令可以看到,KVM虚拟机安装完成后会自动创建一个virbr0网卡:
yaml
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:64:2c:aa txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
我们对其进行修改,创建一个虚拟网桥网卡,编辑/etc/netplan/00-installer-config.yaml
,修改为如下内容:
yaml
# This is the network config written by 'subiquity'
network:
ethernets:
eno1:
dhcp4: false
dhcp6: false
# addresses:
#- 10.162.11.242/24
#gateway4: 10.162.11.1
#nameservers:
# addresses:
# - 223.5.5.5
# - 8.8.8.8
# search:
# - lab
eno2:
dhcp4: true
eno3:
dhcp4: true
eno4:
dhcp4: true
bridges:
br0:
interfaces: [ eno1 ]
addresses: [10.162.11.242/24]
routes:
- to: default
via: 10.162.11.1
mtu: 1500
nameservers:
addresses: [223.5.5.5,8.8.8.8]
search:
- lab.op-lab.top
parameters:
stp: true
forward-delay: 4
dhcp4: no
dhcp6: no
version: 2
注意,这里我们把服务器宿主机设置的是静态IP,更新后地址变化,会断连,需要重新ssh
然后执行命令更新配置:
➜ ~ sudo netplan apply
我们再次通过ifconfig
可以看到多了一个br0网卡:
yaml
➜ netplan ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.162.11.242 netmask 255.255.255.0 broadcast 10.162.11.255
inet6 fe80::6861:9dff:fea6:738 prefixlen 64 scopeid 0x20<link>
ether 6a:61:9d:a6:07:38 txqueuelen 1000 (Ethernet)
RX packets 27909728 bytes 33508298348 (33.5 GB)
RX errors 0 dropped 2126451 overruns 0 frame 0
TX packets 10606139 bytes 1545099972 (1.5 GB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
说明配置已经生效。
配置KVM网桥
我有一个强迫症就是文件夹整洁,因此我在物理机home
目录下会先创建一个kvm
文件夹,然后创建host-bridge.xml
,如下:
xml
<network>
<name>host-bridge</name>
<forward mode="bridge"/>
<bridge name="br0"/>
</network>
执行下述命令:
sql
➜ ~ sudo virsh net-define host-bridge.xml
➜ ~ sudo virsh net-start host-bridge
➜ ~ sudo virsh net-autostart host-bridge
翻译一下就是在kvm中定义一个网桥,然后启用它,然后再设置成开机自启动,完毕。
查看是否启动成功:
bash
➜ ~ sudo virsh net-list
Name State Autostart Persistent
------------------------------------------------
default active yes yes
host-bridge active yes yes
可以看到我这里有2个,第一个default就是上面说的kvm创建的时候自动生成的,其实是可以删掉的,这样后续添加虚拟机的时候就只有host-bridge
这个选项。
执行下述命令即可:
arduino
➜ ~ sudo virsh net-destroy default
➜ ~ sudo virsh net-undefine default
执行完了之后再看就会少一条了。
创建虚拟机
命令行创建
命令如下:
css
➜ ~ sudo virt-install --name=vm1 --ram=8192 --vcpus=4 --virt-type=kvm --os-type=linux --os-variant=ubuntu22.04 --network host-bridge,model=virtio --graphics=vnc,password=opensource888,port=5911,listen=0.0.0.0 --noautoconsole --accelerate --cdrom=/home/lab/ubuntu-22.04.1-live-server-amd64.iso --disk path=/home/lab/images/lab.qcow2,device=disk,format=qcow2,bus=virtio,cache=writeback,size=512
- name:虚拟机名字
- ram:虚拟机内存
- vcpus:cpu核心数
- password:密码
- cdrom:需要安装的镜像
- disk:虚拟机磁盘文件
- size:虚拟机磁盘大小
安装完毕后,检查下是否运行成功:
markdown
➜ ~ virsh list
Id Name State
--------------------------------
1 lab running
进入虚拟机配置虚拟机静态IP,必须是静态IP,没有静态IP的虚拟机没有灵魂der~
因为我清一色安装的都是Ubuntu22.04,因此所有操作都一个样~
进入/etc/netplan
,vim00-installer-config.yaml
,进行修改:
yaml
# This is the network config written by 'subiquity'
network:
ethernets:
enp1s0:
addresses:
- 10.162.11.100/24
gateway4: 10.162.11.1
nameservers:
addresses:
- 223.5.5.5
- 8.8.8.8
search:
- vm1
version: 2
修改后执行下述命令,让静态IP生效:
➜ ~ sudo netplan apply
这样一台虚拟机就创建完毕了。
当然创建虚拟机的命令组合有很多,前面讲的是一口气创建完毕,也有先创建磁盘的,使用qemu-img
命令创建,一般我都创建qcow2
格式的磁盘文件(节省磁盘空间):
arduino
qemu-img create -f qcow2 /home/lab/images/lab.qcow2 512G
GUI创建
一般我都是通过GUI来创建KVM虚拟机,要问为什么?因为记不住,命令太长了,学的东西越多,忘得越快。题外话,插一句,这也是我为什么写博客的原因,因为之前都是找各种博客文档,然后折腾成功了,等过一阵子有问题了,要解决问题了,好家伙,有些文档链接失效了,没失效也得花点时间回顾一下。所以嘛,写好博客,写全了,写透彻了,方便自己,方便他人!
看到这里了插播一条广告,我整了一个公众号 《开源技术实验室》 ,可以搜索关注一下,我会不定期分享开源技术和项目,有兴趣的朋友就当扩充知识面啦!
咱们继续:
不得不说virt-manager
确实好用,简单,操作性强。
不一定要在物理机上跑,可以在Linux笔记本、台式机或者Mac上都行,Mac上略微有点区别,请参照github.com/jeffreywild...中的方法安装。
Linux上跑virt-manager
的话,确保你装好了它!
csharp
➜ ~ sudo apt install virt-manager
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
virt-manager is already the newest version (1:4.0.0-1).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
bash
#执行命令启动virt-manager
➜ ~ virt-manager -c 'qemu+ssh://induschain@10.162.11.242/system?socket=/var/run/libvirt/libvirt-DDDsock'
下图是我找了个服务器截的图,大致长这样:
- 点击左上角的新建按钮,选择一个镜像文件,这里我选择的是Ubuntu22.04:
- 选好了之后继续下一步:
- 然后设置下虚拟机需要的内存和cpu核心数:
- 然后创建一个
qcow2
格式的磁盘文件,给它绑上:
- 点击完成即可,一台虚拟机就创建完成了:
后续操作就和命令行一样了,进入虚拟机改个静态IP即可。
备份恢复
接下来再讲讲备份和恢复,毕竟有时候物理机升配,或者故障维修之类的还是要预防一下。
一般常见的方式有三种:
- 克隆
- 复制
- 快照
克隆
首先需要暂停或者关闭虚拟机,然后进行克隆:
php
#暂停
➜ ~ virsh suspend lab
#关闭
➜ ~ virsh shutdown lab
#克隆: -o 被克隆的虚拟机 -n 新克隆的虚拟机 -f 克隆后新虚拟机的磁盘文件路径 --auto-clone 会存储到默认路径 强迫症用户可强制指定参数
➜ ~ virt-clone --auto-clone -o lab -n lab-new
备份镜像文件和xml配置文件:
bash
➜ ~ cp /home/lab/images/lab-new.qcow2 /backups/lab
➜ ~ cp /home/lab/xml/lab-new.xml /backups/lab
克隆完了之后模拟挂了的情况:
bash
#关闭虚拟机
➜ ~ virsh shutdown lab
#删除虚拟机
➜ ~ virsh undefine lab
#删除镜像文件
➜ ~ rm -rf /home/lab/images/lab.qcow2
然后再尝试恢复一下:
bash
#将镜像文件和配置文件放回对应目录
➜ ~ mv /backups/lab/lab-new.qcow2 /kvm/img/
➜ ~ mv /backups/lab/lab-new.xml /home/lab/xml/
#在kvm中重新定义下这个虚拟机
➜ ~ virsh define /home/lab/xml/lab-new.xml
然后启动虚拟机:
csharp
#查看下虚拟机是否已在列表中
➜ ~ virsh list --all
#启动虚拟机
➜ ~ virsh start lab-new
#进入虚拟机命令行
➜ ~ virsh console lab-new
复制
也可以直接复制虚拟机磁盘文件和配置文件进行备份,我一般都使用这种方法,简单快速:
bash
#先关闭虚拟机
➜ ~ virsh shutdown lab
#查看是否已关闭
➜ ~ virsh list --all
#如果没有xml配置文件,比如是可视化生成的虚拟机,则导出一下配置文件
➜ ~ virsh dumpxml lab >/home/lab/xml/lab.xml
#备份xml配置文件以及镜像文件
➜ ~ cp /home/lab/xml/lab.xml /backups/lab/
➜ ~ cp /home/lab/images/lab.qcow2 /backups/lab/
#关闭虚拟机
➜ ~ virsh shutdown lab
#删除虚拟机
➜ ~ virsh undefine lab
#删除镜像文件
➜ ~ rm -rf /home/lab/images/lab.qcow2
#重新从备份目录恢复
➜ ~ cp /backups/lab/lab.xml /home/lab/xml/
➜ ~ cp /backups/lab/lab.qcow2 /home/lab/images
#在kvm中重新定义下这个虚拟机
➜ ~ virsh define /home/lab/xml/lab.xml
#启动虚拟机
➜ ~ virsh start lab
快照
通过快照的方式进行备份恢复,这种一般用于把虚拟机系统还原到某一个时间点:
perl
#创建快照
➜ ~ virsh snapshot-create lab
#查看是否创建成功
➜ ~ virsh snapshot-list lab
#恢复快照
➜ ~ virsh snapshot-revert lab xxx
#快照如果过多可能会引起虚拟机性能或者故障建议定期清理
➜ ~ virsh snapshot-delete lab xxx
虚拟机扩容磁盘
目前网上常见的2种虚拟机扩容方法,反正都挺麻烦的,最好一开始就规划好,避免瞎折腾,下面我就贴一下执行的步骤,因为我没有扩容需求,所以就暂时不演示了,大家可以自己尝试下:
- 通过
resize
扩容原有磁盘文件,然后进去扩展分区 - 创建一个新的磁盘文件,添加到配置文件中,然后进去扩展分区
通过resize方式
bash
#首先关闭虚拟机,查看磁盘原有大小
➜ ~ virsh shutdown lab
➜ ~ qemu-img info lab.qcow2
#扩容磁盘,磁盘增加100G
➜ ~ qemu-img resize lab.qcow2 +100G
#再次查看是否扩容成功
➜ ~ qemu-img info lab.qcow2
#启动虚拟机,进去操作
➜ ~ virsh start lab
#此处开始是在虚拟机里头
#查看分区
➜ ~ fdisk -l
#然后需要对新增加的空间分区
➜ ~ fdisk /dev/vda
#进入后输入 p 查看分区
#输入 n 创建一个分区
#输入 p 选择主分区
#分区号、起始扇区、结尾扇区都默认回车即可
#输入 w 保存
#然后重载分区表
➜ ~ partprobe
#再查看一下分区
➜ ~ fdisk -l
#创建物理卷,加入卷组,扩展逻辑卷
➜ ~ pvcreate /dev/vda3
➜ ~ pvs
#把vda3加入卷组
➜ ~ vgextend cl /dev/vda3
#查看卷组大小
➜ ~ vgs
➜ ~ lvextend -l +100%FREE /dev/mapper/cl-root
➜ ~ resize2fs /dev/mapper/cl-root
➜ ~ xfs_growfs /dev/mmapper/cl-root
#最后查看下是否成功扩容
➜ ~ df -h
说实话,不是专业运维,无法熟练巧出来,不得百度个2-3个博客打开着按步骤粘贴么,哈哈哈~
添加一个磁盘文件
这种方式前面搞完了,后面就和上面一模一样的,都是进入虚拟机,然后开始搞:
ini
#老样子,先关闭虚拟机
➜ ~ virsh shutdown lab
#编辑虚拟机配置文件
➜ ~ virsh edit lab
#添加一段磁盘配置文件
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/home/lab/images/lab_add.qcow2'/>
<target dev='vdb' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' function='0x0'/>
</disk>
后续继续进行分区,创建物理卷,加入卷组,扩展逻辑卷的步骤。
总结
前面讲了这么多,总之,kvm虚拟化这项技术很好地把强悍的物理机资源进行了虚拟化,使我们可以分割出更小的资源按需分配,非常适合中小型互联网公司的运维童鞋玩,能够给公司降本增效!本文讲的较为详细,可以收藏以备不时之需。
大家有兴趣的话可以关注一下我,给我点点赞,增加一点写文章的动力,我一般闲着没事就会写点新东西分享分享,一般都是比较实用的教程文章。(PS:目前粉丝91,哈哈哈)