云计算指通过计算机网络(多指因特网)形成的计算能力极强的系统,可存储、集合相关资源并可按需配置,向用户提供个性化服务。
云计算模式
- IaaS
- PaaS
- SaaS
虚拟化技术分类:
-
全虚拟化
虚拟化层(Hypervisor)模拟了完整的硬件环境,并将虚拟机的操作系统误导为在真实的物理硬件上运行。全虚拟化代表产品:VMware ESXi、Microsoft Hyper-V、KVM、XEN
-
半虚拟化
客户机 OS在虚拟机上运行,以全虚拟化为基础,新添一个能够优化客户端0S指令的API系统 ,极大地减轻了Hypervisor的工作量,快速实现底层硬件的访问。KVM、XEN等都支持半虚拟化模式。
KVM 介绍
KVM(Kernel-based Virtual Machine)是一种开源的虚拟化解决方案,它是Linux内核中的一个模块,为虚拟化提供了硬件辅助支持。 KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案。 KVM结合了全虚拟化和半虚拟化的技术,可以在虚拟机中同时运行未修改的操作系统,并提供接近本地硬件性能的虚拟化体验。 KVM 本身不执行任何硬件模拟,需要通过QEMU这个用户空间程序来实现。
KVM的工作原理如下:
- KVM模块加载:KVM作为Linux内核的一个模块(RHEL6开始),需要在主机的Linux内核中加载。
- 虚拟机创建:通过用户空间工具(如QEMU)创建和管理虚拟机。用户空间工具与KVM模块进行交互,向KVM发送虚拟机的配置和管理请求。
- 硬件辅助虚拟化:KVM利用处理器的硬件虚拟化扩展(如Intel的VT-x和AMD的AMD-V)来提供硬件辅助的虚拟化支持。 这些扩展允许KVM模块在虚拟机和物理硬件之间建立直接的通信通道,提高了虚拟化性能和效率。
- 虚拟机运行:在虚拟机中运行未修改的操作系统。KVM模块模拟了完整的硬件环境,并将虚拟机的操作系统误导为在真实的物理硬件上运行。
KVM的特点:
- 开源:KVM是开源的,可以免费使用,并且有一个活跃的开发和社区支持。
- 高性能:通过利用处理器的硬件虚拟化扩展,KVM可以提供接近本地硬件性能的虚拟化体验。
- 多操作系统支持:KVM可以运行多种操作系统,包括Linux、Windows和其他主流操作系统。
- 安全性:KVM提供了严格的虚拟机隔离,虚拟机之间相互隔离,并且与宿主机有良好的安全隔离。
- 可扩展性:KVM支持在单个主机上同时运行多个虚拟机,提供了良好的可扩展性和资源利用率。
KVM 安装
查看CPU是否支持虚拟化:
Linux 发行版本必须在64bit环境中才能使用KVM。
|
|
安装软件:
|
|
跟虚拟机相关的目录:
|
|
启动服务:
|
|
安装虚拟机
-
图形安装
略
-
命令安装
-
适合于宿主机有桌面的情况,在本机安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
[root@kvm ~]# virt-install --name mini \ --memory 1024 \ --vcpus 1 \ --cdrom /iso/CentOS-7.3-x86_64-DVD-1611.iso \ --disk /var/lib/libvirt/images/mini.qcow2,size=10,format=qcow2,bus=scsi \ --network network=default # --name 虚拟机名称 # --memory 分配内存大小,MB # --vcpus 配置虚拟机cpu数目,注意不能超过物理cpu数目 # --cdrom 指定安装方式为光盘镜像 --pxe 安装方式为pxe(自动安装) # --disk 指定虚拟机存储卷 # --network 指定网络,如: # --network bridge=br0 桥接方式 # --network network=default NAT方式, 将虚拟机连接到default网络
以下均为文本安装,适合宿主机没有桌面的情况
-
使用console安装 - 文本方式,适用于宿主机没有桌面的情况
1 2 3 4 5 6 7 8 9 10
[root@kvm ~]# virt-install --name test2 \ --memory 2048 \ --vcpus 2 \ --location /iso/CentOS-7.9-x86_64-DVD-2009.iso \ -x "console=ttyS0" \ --disk /var/lib/libvirt/images/test2.qcow2,size=10 \ --graphics none # 不要图形 # --location 指定安装源,可以是本地iso文件,也可以是一个网络地址(挂载有镜像的目录) # -x 传递给 --location 的参数
-
使用远程镜像安装 - 文本安装,手动配置安装选项,比较烦琐
1 2 3 4 5 6 7
[root@kvm ~]# virt-install --name test2 \ --memory 2048 \ --vcpus 2 \ --location ftp://192.168.10.100/cdrom/ \ -x "console=ttyS0" \ --disk /var/lib/libvirt/images/test2.qcow2,size=10 \ --graphics none
-
使用远程镜像自动安装(提前制作好ks.cfg文件)
1 2 3 4 5 6
[root@kvm ~]# virt-install -n test \ --memory 1500 \ -l ftp://192.168.10.100/cdrom \ -x "ks=ftp://192.168.10.100/ks.cfg console=ttyS0" \ --disk /var/lib/libvirt/images/test.qcow2,size=10,format=qcow2 \ --graphics none
-
网络
KVM虚拟机网络配置的两种方式:NAT方式和Bridge方式。
- NAT - NAT网络: 让虚拟机访问主机、互联网或本地网络上的资源的简单方法,但是不能从网络或其他的客户机访问客户机。
- Bridge - 虚拟网桥(Virtual Bridge): 这种方式要比用户网络复杂一些,但是设置好后客户机与互联网,客户机与主机之间的通信都很容易。
NAT 网络
NAT模式是kvm安装后的默认方式
它支持主机与虚拟机的互访,同时也支持虚拟机访问互联网,但不支持外界访问虚拟机。
查看 NAT 网络配置
|
|
Bridge 网络
Bridge方式即虚拟网桥的网络连接方式,是客户机和子网里面的机器能够互相通信。可以使虚拟机成为网络中具有独立IP的主机。
管理虚拟机
虚拟机的组成部分
|
|
虚拟磁盘文件
|
|
🙈 virsh常用命令
|
|
连接虚拟机
-
通过 console 连接,这里分几种情况
情况 1、如果在安装时有配置 console(-x “console=ttyS0”),可通过console连接虚拟机
1 2 3 4 5 6
❯ virsh console test2 Connected to domain 'test2' Escape character is ^] (Ctrl + ]) [root@localhost ~]# uname Linux
情况 2、如果安装时没有配置console,也可以手动配置:
如果能够进入虚拟机,在虚拟机的grub文件中配置console, 添加一个内核参数 console=ttyS0
1 2
[root@kvm ~]# vim /boot/grub2/grub.cfg linux16 /vmlinuz-3.10.0-514.el7.x86_64 root=/dev/mapper/cl-root ro rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet LANG=en_US.UTF-8 console=ttyS0
如果不能进入到虚拟机,可以直接修改虚拟磁盘文件
-
安装工具
1
[root@kvm ~]# yum -y install libguestfs-tools
-
查看虚拟机磁盘文件
1 2 3 4 5
❯ virsh domblklist test2 目标 源 --------------------------------------------- vda /var/lib/libvirt/images/test2.qcow2 sda -
-
修改虚拟机磁盘文件中的grub.cfg, 在对应的内核参数后面加上console=ttyS0
1 2
[root@kvm ~]# virt-edit /var/lib/libvirt/images/test2.qcow2 /boot/grub2/grub.cfg linux16 /vmlinuz-3.10.0-514.el7.x86_64 root=/dev/mapper/cl-root ro rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet LANG=en_US.UTF-8 console=ttyS0
-
修改完成后重新启动虚拟机,就可以console连接了
-
-
通过ssh连接
- 直接修改客户机的磁盘文件配置好网卡配置文件,再启动客户机,就可以通过ssh连接虚拟机了
- console 连上客户机,配置好 IP
添加、修改硬件
-
冷添加修改
修改配置文件,下一次开机生效
virsh edit test2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
<domain type='kvm' id='4'> <name>mini</name> <uuid>9f4e4fc1-65db-493c-94a6-1cff42799716</uuid> <!-- 内存信息 --> <memory unit='KiB'>4048896</memory> <currentMemory unit='KiB'>2097152</currentMemory> <!-- CPU信息 --> <vcpu placement='auto' current='1'>4</vcpu> ... <devices> <emulator>/usr/libexec/qemu-kvm</emulator> <!-- 磁盘信息 --> <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/var/lib/libvirt/images/mini.qcow2'/> <backingStore/> <target dev='hda' bus='ide'/> <alias name='ide0-0-0'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='file' device='cdrom'> # 光驱 <driver name='qemu'/> <target dev='hdb' bus='ide'/> <readonly/> <alias name='ide0-0-1'/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> ... <!-- 网卡信息 --> <interface type='network'> <mac address='52:54:00:47:c1:6a'/> <source network='default' bridge='virbr0'/> <target dev='vnet1'/> <model type='virtio'/> <alias name='net1'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/> </interface> ... </devices> ... </domain>
-
热添加硬盘、网卡,热移除设备
热添加磁盘
语法:
attach-device <domain> <file> [--persistent] [--config] [--live] [--current]
-
新创建一块磁盘
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
❯ cd /var/lib/libvirt/images ❯ ls test2.qcow2 ❯ qemu-img create -f qcow2 test2-1.qcow2 2G Formatting 'test2-1.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=2147483648 lazy_refcounts=off refcount_bits=16 ❯ ls test2-1.qcow2 test2.qcow2 ❯ qemu-img info test2-1.qcow2 image: test2-1.qcow2 file format: qcow2 virtual size: 2 GiB (2147483648 bytes) disk size: 196 KiB cluster_size: 65536 Format specific information: compat: 1.1 compression type: zlib lazy refcounts: false refcount bits: 16 corrupt: false extended l2: false
-
编写配置文件
1 2 3 4 5 6
❯ vim /tmp/add_disk.xml <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/var/lib/libvirt/images/test2-1.qcow2'/> <target dev='vdb' bus='virtio'/> </disk>
-
热添加磁盘
1 2
❯ virsh attach-device test2 /tmp/add_disk.xml --persistent 成功附加设备
1 2 3 4 5 6 7 8 9
[root@localhost ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 1024M 0 rom vda 252:0 0 5G 0 disk ├─vda1 252:1 0 1G 0 part /boot └─vda2 252:2 0 4G 0 part ├─centos-root 253:0 0 3.5G 0 lvm / └─centos-swap 253:1 0 512M 0 lvm [SWAP] vdb 252:16 0 2G 0 disk
热移除设备
磁盘:
detach-disk <domain> <target> [--persistent]
# target: 磁盘名称, 如 sdc, vdb等,移除前一定要卸载所挂载的磁盘1 2
❯ virsh detach-disk test2 vdb --persistent 成功分离磁盘
网卡:
detach-interface <domain> <type> <--mac mac> [--persistent]
# type: network 或 bridge关于网卡信息的查看
1 2 3 4 5 6 7 8 9
❯ virsh domiflist test2 接口 类型 源 型号 MAC --------------------------------------------------------- vnet1 network default virtio 52:54:00:80:4b:b3 ❯ virsh domifaddr test2 名称 MAC 地址 Protocol Address ------------------------------------------------------------------------------- vnet1 52:54:00:80:4b:b3 ipv4 192.168.122.230/24
热添加网卡
-
编写配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
[root@kvm ~]# vim /tmp/add_if.xml <!-- NAT连接的配置 --> <interface type='network'> <source network='default' bridge='virbr0'/> <model type='virtio'/> </interface> <!-- 以下是桥接的配置 --> <!-- <interface type='bridge'> <source bridge='br0'/> <model type='rtl8139'/> </interface> --> <!-- 关于网卡 type 网卡 type 网卡名称 virtio eth0,eth1,... e1000 ens10... rtl8139 ens10... -->
-
热添加网卡
1
[root@kvm ~]# virsh attach-device mini /tmp/add_if.xml --persistent
-
-
热添加 CPU
只支持热添加,不支持热删除
个数不能超过在xml文件里面设置的最大个数, 最大个数不能超过物理CPU个数
热添加的条件:当前CPU数量小于配置的最大CPU数量
-
查看虚拟机配置,是否支持热添加CPU
1 2 3
<!-- 配置CPU数目 --> <!-- current中的数量为当前cpu数量, 后面的4是最大cpu数量 --> <vcpu placement='auto' current="1">4</vcpu>
-
热添加 cpu:
1 2 3 4
语法: setvcpus <domain> <count> --live --config 选项: --live 修改运行中的guest --config 将修改写入配置文件,以便下一次启动生效
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
❯ virsh setvcpus test2 2 --live --config ❯ virsh dominfo test2 Id: 4 名称: test2 UUID: bf9ba17d-2d93-4bd7-85ad-1a33ac59021f OS 类型: hvm 状态: running CPU: 2 CPU 时间: 69.2s 最大内存: 1048576 KiB 使用的内存: 1048576 KiB 持久: 是 自动启动: 禁用 管理的保存: 否 安全性模式: none 安全性 DOI: 0
-
-
热添加内存
内存支持热添加/减少
热添加内存的条件:当前内存小于最大内存
1
语法: setmem <domain> <size> [--config] [--live]
虚拟机快照
KVM快照(可在开机或关机的状态下创建)
-
创建快照
1 2
❯ virsh snapshot-create-as test2 --name test2.snap1 --description "创世状态" 已生成域快照 test2.snap1
-
查看虚拟机已有快照
1 2 3 4
❯ virsh snapshot-list test2 名称 生成时间 状态 ---------------------------------------------------- test2.snap1 2024-07-10 22:06:20 +0800 running
-
查看指定快照信息
1 2 3 4 5 6 7 8 9 10
❯ virsh snapshot-info test2 test2.snap1 名称: test2.snap1 域: test2 当前: 是 状态: running 位置: 内部 上级: - 下级: 0 降序: 0 元数据: 是
-
查看指定快照的详细信息
1
❯ virsh snapshot-dumpxml test2 test2.snap1
-
使用快照还原虚拟机
1
❯ virsh snapshot-revert test2 test2.snap1
-
删除指定快照
1 2
❯ virsh snapshot-delete test2 test2.snap1 已删除域快照 test2.snap1
虚拟机克隆
关机状态下创建
完整克隆
优点:源机和克隆机互不影响
缺点:克隆速度慢,资源占用大
-
关闭要克隆的虚拟机,右键点击虚拟机选择Clone
-
字符终端,命令克隆
1
virt-clone -o mini -n vm2 -f /var/lib/libvirt/vm2.img
手动克隆
- 将源机的虚拟磁盘文件复制一份作为克隆机的虚拟磁盘文件
- 将源机的配置文件复制一份并修改作为克隆机的配置文件(名称,UUID,虚拟磁盘文件,网卡的MAC地址…)
- 利用克隆机的配置文件定义出克隆机
⭐ 链接克隆
增量镜像(qcow2)
首先要有一个基础镜像,里面把各个虚拟机都需要的环境都配置好。
再基于这个基础镜像创建增量镜像,每个增量镜像对应一个虚拟机,虚拟机对镜像中所有的改变都记录在增量镜像里面,基础镜像始终保持不变。
优点:节省磁盘空间,快速克隆虚拟机。
例:基于mini克隆一台虚拟机nginx
-
查看mini的虚拟磁盘文件
1 2 3 4 5
[root@kvm ~]# virsh domblklist mini 目标 源 ------------------------------------------------ hda /var/lib/libvirt/images/mini.qcow2 hdb -
-
基于基础镜像创建增量镜像文件
1 2
[root@kvm ~]# cd /var/lib/libvirt/images/ [root@kvm images]# qemu-img create -f qcow2 -b mini.qcow2 nginx.qcow2
-
创建并修改配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
[root@kvm images]# cd /etc/libvirt/qemu/ [root@kvm qemu]# cp mini.xml nginx.xml [root@kvm qemu]# vim nginx.xml <domain type='kvm' id='4'> <name>nginx</name> # 修改虚拟机名称 <uuid>9f4e4fc1-65db-493c-94a6-1cff42799716</uuid> # 删除此行 <memory unit='KiB'>4048896</memory> <currentMemory unit='KiB'>2097152</currentMemory> <vcpu placement='auto' current='1'>4</vcpu> ... <devices> <emulator>/usr/libexec/qemu-kvm</emulator> <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/var/lib/libvirt/images/nginx.qcow2'/> # 修改虚拟磁盘文件 <backingStore/> <target dev='hda' bus='ide'/> <alias name='ide0-0-0'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='file' device='cdrom'> <driver name='qemu'/> <target dev='hdb' bus='ide'/> <readonly/> <alias name='ide0-0-1'/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> ... <interface type='network'> <mac address='52:54:00:df:47:d0'/> # 删除此行 <source network='default' bridge='virbr0'/> <target dev='vnet0'/> <model type='rtl8139'/> <alias name='net0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface> ... </devices> ... </domain>
-
根据配置文件创建虚拟机
1 2
root@kvm qemu]# virsh define nginx.xml 定义域 nginx(从 nginx.xml)