目录
一.kvm架构
KVM 是一个基于 Linux 内核的虚拟化解决方案,由 Avi Kivity 开发并归 Red Hat 拥有。它在 Linux 内核 2.6.20 版本中首次成为主流 hypervisor 的一部分。KVM 支持 x86 架构以及 PowerPC 和 IA64。它最近还添加了对 SMP 主机和来宾的支持,以及企业级功能,如活动迁移。KVM 作为内核模块实现,因此只需加载该模块即可成为 hypervisor。它提供完整的虚拟化,包括对硬件虚拟化指令集的支持,如 Intel VT 和 AMD-V。KVM 还支持准虚拟化来宾操作系统,包括 Linux 和 Windows。KVM 通过两个组件实现,一个是可加载的内核模块,另一个是修改版的 QEMU,用于 PC 平台模拟。来宾操作系统通过 /dev/KVM 设备进行映射,并具有自己的虚拟地址空间,映射到主机内核的物理地址空间。KVM 在 Linux 环境中以主机的方式运行,并且可以支持大量的来宾操作系统,只要底层硬件虚拟化支持。
二.虚拟机环境准备
将虚拟机的内存大小调整为四分之三的主机内存大小12G:
调整处理器参数:
三.kvm软件安装
基于CentOS7的安装:
1.关闭防火墙和selinux
setenforce 0
systemctl stop firewalld
2.查看CPU是否支持VT
cat /proc/cpuinfo | grep -E 'vmx|svm'
3.卸载存在的kvm环境
yum remove `rpm -qa | egrep 'qemu|virt|kvm'` -y
rm -rf /var/lib/libvirt /etc/libvirt
4.安装kvm环境
yum install *qemu* *virt* librbd1-devel -y
CentOS8安装:
yum install *qemu* *virt* librbd1.x86_64 -y
5.启动服务
systemctl start libvirtd
6.查看KVM模块加载
[root@bogon ~]# lsmod | grep kvm
kvm_intel 348160 0
kvm 970752 1 kvm_intel
irqbypass 16384 1 kvm
错误1:查看KVM模块加载,没有模块显示
[root@bogon ~]# lsmod | grep kvm
解决:
重新加载模块:
[root@bogon ~]#modprobe kvm
重启服务生效:
[root@bogon ~]#systemctl restart libvirtd
错误2: libvirtd服务器起不来
解决:
#查看系统日志:
[root@bogon yum.repos.d]# tail -f /var/log/messages
5月 08 10:52:17 bogon libvirtd[70586]: 操作失败: 网络 'default' 已有 uuid fdf8ed3d-65f7-4965-9124-e78d4dc0ad03
删除网络 default:
[root@bogon yum.repos.d]# virsh net-destroy default
重启服务:
[root@bogon ~]# sudo systemctl start libvirtd
[root@bogon ~]# systemctl enable libvirtd
[root@bogon yum.repos.d]# systemctl status libvirtd
● libvirtd.service - Virtualization daemon
Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2024-05-08 11:06:43 CST; 6s ago
Docs: man:libvirtd(8)
https://libvirt.org
Main PID: 70892 (libvirtd)
Tasks: 17 (limit: 32768)
Memory: 12.3M
CGroup: /system.slice/libvirtd.service
└─70892 /usr/sbin/libvirtd --timeout 120
5月 08 11:06:43 bogon systemd[1]: Starting Virtualization daemon...
5月 08 11:06:43 bogon systemd[1]: Started Virtualization daemon.
四.GuestOS安装
4.1图形模式安装
将iso镜像上传到linux环境中:
注意:这里应该手动输入指令,否则会提示
[root@bogon ~]# virt-manager
bash: virt-manager : command not found...
[root@bogon ~]# virt-manager
其余步骤跟安装虚拟机一样
错误1:
解决:
这里的参数调大,最好3G以上
4.2命令模式安装
1.虚拟机配置文件
[root@bogon ~]# ls /etc/libvirt/qemu
generic.xml networks
2.存储虚拟机的介质
[root@bogon ~]# ls /var/lib/libvirt/images/
generic.qcow2
根据配置文件创建虚拟机:
1.添加配置文件:
[root@bogon ~]# cd /etc/libvirt/qemu/
[root@bogon qemu]# ls
generic.xml networks
[root@bogon qemu]# cp generic.xml generic1.xml
2.添加磁盘镜像文件:
[root@bogon qemu]# cd /var/lib/libvirt/images/
[root@bogon images]# ls
generic.qcow2
[root@bogon images]# cp generic.qcow2 generic1.qcow2
3.修改配置文件的内容
[root@bogon ~]# vim /etc/libvirt/qemu/generic1.xml
<name>generic1</name>
<uuid>5f2db9ba-4216-4e58-982a-7dec7be688ae</uuid>
<memory unit='KiB'>1024000</memory>
<currentMemory unit='KiB'>1024000</currentMemory>
<vcpu placement='static'>2</vcpu>
<source file='/var/lib/libvirt/images/generic1.qcow2'/>
<mac address='52:54:00:e0:7d:6f'/>
4.创建虚拟机
[root@bogon ~]# virsh define /etc/libvirt/qemu/generic1.xml
Domain generic1 defined from /etc/libvirt/qemu/generic1.xml
5.重启服务
[root@bogon ~]# systemctl restart libvirtd
6宿主机开启路由转发
[root@bogon ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
7.测试
[root@bogon ~]# virt-manager
开启新创建的虚拟机:
错误1:
[root@bogon images]# cp generic.qcow2 generic1.qcow2
cp: error writing ‘generic1.qcow2’: No space left on device
cp: failed to extend ‘generic1.qcow2’: No space left on device
解决:
这是由于内存空间不足导致的,我们除去一些内存过大的文件即可
[root@bogon ~]# rm -rf CentOS-7-x86_64-DVD-2009.iso
4.3通过飞机驾驶舱安装和管理虚拟机
[root@bogon ~]# yum install cockpit -y
[root@bogon ~]# systemctl start cockpit
浏览器访问:
服务器地址:9090
五.KVM存储
概念
存储池:KVM中用来存储磁盘镜像的目录
默认存储池:
/var/lib/libvirt/images/
1.存储池管理
1.创建基于文件夹的存储池
[root@localhost ~]# mkdir -p /data/vmfs
2.定义存储池与其目录
[root@localhost ~]# virsh pool-define-as vmdisk --type dir --target /data/vmfs/
Pool vmdisk defined
3.创建已定义的存储池
(1)创建已定义的存储池
[root@localhost ~]# virsh pool-build vmdisk
Pool vmdisk built
(2)查看已定义的存储池
[root@localhost ~]# virsh pool-list --all
Name State Autostart
-------------------------------------------
default active yes
root active yes
vmdisk inactive no
4.激活并自动启动已定义的存储池
[root@localhost ~]# virsh pool-start vmdisk
Pool vmdisk started
[root@localhost ~]# virsh pool-autostart vmdisk
Pool vmdisk marked as autostarted
5.在存储池中创建虚拟机存储卷(虚拟磁盘文件)
[root@localhost ~]# virsh vol-create-as vmdisk oe01.qcow2 2G --format qcow2
Vol oe01.qcow2 created
6.存储池的相关管理命令
(1)在存储池中删除虚拟机存储卷
[root@localhost ~]# virsh vol-delete --pool vmdisk oe01.qcow2
Vol oe01.qcow2 deleted
(2)取消激活存储池
[root@localhost ~]# virsh pool-destroy vmdisk
Pool vmdisk destroyed
(3)删除存储池定义的目录
[root@localhost ~]# virsh pool-delete vmdisk
Pool vmdisk deleted
(4)取消定义存储池
[root@localhost ~]# virsh pool-undefine vmdisk
Pool vmdisk has been undefined
7.KVM中的磁盘格式
raw:
原始格式,性能最好
qcow2:
性能不如raw,raw不支持快照,qcow2支持快照
什么叫写时拷贝:
raw立刻分配空间
qcow2只在用的时候,才会分配空间
使用场景:
需要快照用qcow2,不需要则使用raw
8.创建磁盘文件
#qcow2格式:
[root@localhost ~]# qemu-img create -f qcow2 test.qcow2 1G
#raw格式:
[root@localhost ~]# qemu-img create -f raw test1.raw 1G
#查看创建的虚拟磁盘文件:
[root@localhost ~]# qemu-img info test.qcow2
9.挂载磁盘
目的:当虚拟机无法启动时,通过挂载虚拟机内部的文件系统到宿主机以便恢复启动
查看磁盘镜像的分区信息:
[root@localhost qemu]# virt-df -h -d generic
Filesystem Size Used Available Use%
generic:/dev/sda1 1014M 105M 909M 11%
generic:/dev/centos_bogon/root 2.6G 1.2G 1.4G 47%
挂载磁盘镜像分区:
[root@localhost qemu]# guestmount -d generic -m /dev/centos_bogon/root --rw /mnt
取消挂载:
[root@localhost qemu]# guestunmount /mnt
查看挂载到/mnt下的文件:
[root@bogon ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 5.9G 0 5.9G 0% /dev
tmpfs tmpfs 5.9G 0 5.9G 0% /dev/shm
tmpfs tmpfs 5.9G 13M 5.9G 1% /run
tmpfs tmpfs 5.9G 0 5.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 14G 3.1G 82% /
/dev/sda1 xfs 1014M 186M 829M 19% /boot
tmpfs tmpfs 1.2G 48K 1.2G 1% /run/user/0
/dev/sr0 iso9660 4.4G 4.4G 0 100% /run/media/root/CentOS 7 x86_64
/dev/fuse fuse 2.6G 1.3G 1.4G 48% /mnt
六.KVM的基本管理
查看虚拟机:
[root@bogon ~]# virsh list #查看正在运行的虚拟机
Id Name State
----------------------------------------------------
5 guestfs-szq3g067krjy17b6 running
[root@bogon ~]# virsh list --all #查看所有虚拟机
Id Name State
----------------------------------------------------
5 guestfs-szq3g067krjy17b6 running
- generic shut off
- generic1 shut off
查看虚拟机的配置文件(了解):
[root@bogon ~]# virsh dumpxml generic
将generic的配置文件保存到generic1中(了解):
[root@bogon ~]# virsh dumpxml generic > /etc/libvirt/qemu/generic1.xml
修改generic的配置文件(了解):
[root@bogon ~]# virsh edit generic
启动虚拟机:
[root@bogon ~]# virsh start generic
Domain generic started
暂停虚拟机:
[root@bogon ~]# virsh suspend generic
Domain generic suspended
恢复虚拟机:
[root@bogon ~]# virsh resume generic
Domain generic resumed
关闭虚拟机:
[root@bogon ~]# virsh shutdown generic
Domain generic is being shutdown
重启虚拟机:
[root@bogon ~]# virsh reboot generic
Domain generic is being rebooted
重置虚拟机(速度上高于reboot):
[root@bogon ~]# virsh reset generic
Domain generic was reset
删除虚拟机:
[root@bogon ~]# virsh undefine generic
Domain generic has been undefined
注意:必须在关机状态下才能删除
虚拟机开机自动启动:
[root@bogon ~]# virsh autostart generic1
Domain generic1 marked as autostarted
取消开机自动启动:
[root@bogon ~]# virsh autostart --disable generic1
Domain generic1 unmarked as autostarted
查看开机启动的虚拟机:
[root@bogon ~]# virsh list --all --autostart
Id Name State
----------------------------------------------------
七.虚拟机克隆(虚拟机处于关机状态)
7.1图形界面实现
7.2通过字符终端实现
[root@bogon ~]# virt-clone -o generic1 --auto-clone
-o:指定要克隆的对象
[root@bogon ~]# virt-clone -o generic1 -n generic2 --auto-clone
-n:指定克隆后的虚拟机名称
八.快照
8.1图形界面实现
8.2通过命令实现
创建快照:
[root@bogon ~]# virsh snapshot-create-as generic generic.snap
Domain snapshot generic.snap created
查看虚拟机创建的快照:
[root@bogon ~]# virsh snapshot-list generic
Name Creation Time State
------------------------------------------------------------
generic.snap 2024-05-16 12:43:58 +0800 running
snapshot1 2024-05-15 21:59:12 +0800 shutoff
删除虚拟机快照:
[root@bogon ~]# virsh snapshot-delete --snapshotname generic.snap generic
Domain snapshot generic.snap deleted
九.KVM网络管理
网络分类:
nat:支持主机和虚拟机互访,虚拟机可以访问外网,但外网访问不了虚拟机
isolated:隔离网络模式,与VMware中的仅主机模式类似,与外界网络隔离
桥接口:虚拟交换机上规划的一个接口,将其与物理网卡绑定在一起
NAT网络拓扑:
isolated隔开拓扑:
桥接网络拓扑:
显示接口:
[root@bogon ~]# brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.525400970e01 yes virbr0-nic
vnet0
从交换机上把vnet网卡删除:
[root@bogon ~]# brctl delif virbr0 vnet0
添加vnet网卡到交换机上:
[root@bogon ~]# brctl addif virbr0 vnet0