虚拟化学习
0. 建议
- 学习的时候注意实操(在磁盘空间足够的情况下,多打几个快照,对照实验);
- 学的时候把关键单词学会了,KVM 难度会减少很多(graphics,destroy,snapshot……);
- 了解一点概念性的东西,可以学的更扎实。
P.S. 此文档全是基于命令行 (CLI) 的,图形化管理界面 (virt-manager) 请自行学习。
1. 环境准备
Projects | Configuration |
---|---|
YUM | local-repo:(Centos7-1511) |
HostName | KVM |
NIC | eno16777736 |
IP | 172.129.10.100/24 |
Environment | *qemu* 、*virt* 、 *gnome-desktop* |
virtualization | UP |
libvirtd | active |
Firewalld/SELINUX/iptables | down |
2. 磁盘管理
2.1 稀疏文件
2.1.1 什么是文件的稀疏性
稀疏文件(英语:sparse file)是一种计算机文件,它能尝试在文件内容大多为空时更有效率地使用文件系统的空间。它的原理是以简短的信息(元数据)表示空数据块,而不是在在磁盘上占用实际空间来存储空数据块。只有真实(非空)的数据块会按原样写入磁盘。
———— 维基百科
qemu-img create
创建的 qcow2 格式的磁盘镜像文件就是稀疏文件。- VMware 的快照文件也是稀疏文件——VMDK、VHD、VDI。
2.1.2 检查文件的稀疏性
- 使用
ls -s
命令查看文件的稀疏性;
[root@KVM ~]# ls -s sparse.file
0 sparse.file
- 实际占用空间大小为 0
- 使用
du -h
命令查看文件的稀疏性。
[root@KVM ~]# du -h sparse.file
0 sparse.file
- 实际占用空间大小为 0
- 使用
qemu-img info
命令查看文件的稀疏性。
[root@KVM ~]# qemu-img info sparse.file
image: sparse.file
file format: raw
virtual size: 1.0G (1073741824 bytes)
disk size: 0
- 逻辑空间大小为 1.0G
- 实际空间大小为 0
2.1.3 创建稀疏文件
- 使用
dd
命令创建稀疏性文件;
[root@KVM ~]# dd if=/dev/zero of=test1 bs=1MB count=0 seek=1024
0+0 records in
0+0 records out
0 bytes (0 B) copied, 7.6865e-05 s, 0.0 kB/s
- if=/dev/null :从 /dev/null 中输入数据
- of=test1 :输出文件为 test1
- bs=1MB :设置块大小为 1MB
- count=0 :块数设置为 0,表示不复制任何数据
- seek=1024 :从输出文件起始位置向后跳转 1024 块,即 1GB
P.S.
- 此处的
if
参数是可选参数,可以不用写,因为我们指定了count=0
参数,表示不复制任何数据,所以要不要输入文件都无所谓了。- /dev/zero 和 /dev/null 都是提供特殊空数据源的设备文件:
- /dev/zero 读取空字符
- /dev/null 读取空数据(包含空字符)
- 使用
qemu-img
命令创建稀疏性文件;
[root@KVM ~]# qemu-img create -f qcow2 test1.qcow2 1g
Formatting 'test1.qcow2', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536 lazy_refcounts=off
- 单位不区分大小写
- 补充:使用
dd
命令创建非稀疏文件。
[root@KVM ~]# dd if=/dev/zero of=test2 bs=1MB count=1024
1024+0 records in
1024+0 records out
1024000000 bytes (1.0 GB) copied, 11.5197 s, 89.9 MB/s
- 补充:改变文件稀疏性:非稀疏文件 ——> 稀疏文件
[root@KVM ~]# cp test2 --sparse=always test2.1
[root@KVM ~]# qemu-img info test2
image: test2
file format: raw
virtual size: 977M (1024000000 bytes)
disk size: 977M
[root@KVM ~]# qemu-img info test2.1
image: test2.1
file format: raw
virtual size: 977M (1024000000 bytes)
disk size: 0
P.S.
cp
命令如果不加上任何参数,则不会改变文件稀疏性。
2.4 预分配方式
2.4.1 元数据(MetaData)
元数据主要是描述资料属性(property)的信息,用来支持如指示存储位置、历史资料、资源查找、文件记录等功能。元数据算是一种电子式目录,为了达到编制目录的目的,必须在描述并收藏资料的内容或特色,进而达成协助资料检索的目的。
———— 维基百科
2.4.2 稀疏文件的预分配模式
常见的预分配模式:
- off :不进行任何预分配,后面所有数据都是动态写入的,初始大小为 0%。
- metadata :(默认预分配模式)仅预分配元数据空间,先分配必要的元数据空间,剩下的数据采用动态实际数据写入。
- full :尽量预分配文件指示的完整空间,直接分配实际大小,初始大小为 100%。
--preallocation=off:
[root@KVM ~]# qemu-img create -f qcow2 -o preallocation=off test1 1G
Formatting 'test1', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536 preallocation='off' lazy_refcounts=off
--preallocation=metadata:
[root@KVM ~]# qemu-img create -f qcow2 -o preallocation=metadata test2 1G
Formatting 'test2', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536 preallocation='metadata' lazy_refcounts=off
--preallocation=full:
[root@KVM ~]# qemu-img create -f qcow2 -o preallocation=off test3 1G
Formatting 'test3', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536 preallocation='off' lazy_refcounts=off
2.5 QEMU 基础
2.5.1 镜像格式
常见的镜像格式:
- RAW : (默认格式)最简单格式,直接拷贝扇区,速度快但不支持增量备份。
- QCOW : QEMU老格式,已被QCOW2取代,很少使用。
- QCOW2 : QEMU/KVM常用格式,支持增量备份,较好兼容性。
- VMDK : VMware虚拟机格式,功能与QCOW2类似,主要用于VMware虚拟化。
2.5.2 创建镜像
-f
参数指定输出的镜像格式:
[root@KVM ~]# qemu-img create test.raw 1m
Formatting 'test.raw', fmt=raw size=1048576
[root@KVM ~]# qemu-img create -f qcow2 test.qcow2 1m
Formatting 'test.qcow2', fmt=qcow2 size=1048576 encryption=off cluster_size=65536 lazy_refcounts=off
2.5.3 镜像格式转换
[root@KVM ~]# qemu-img convert -f qcow2 -O raw test.qcow2 test.1.raw
P.S. 使用
qemu-img convert
命令转换镜像格式后,源镜像文件默认不会被删除。
2.5.4 调整镜像大小
[root@KVM ~]# qemu-img resize test.raw +1G
Image resized.
[root@KVM ~]# qemu-img resize test.raw -1G
Image resized.
P.S. qcow2 镜像不支持减少磁盘大小,但 raw 格式可以.
2.5.5 检查镜像完整性
[root@KVM ~]# qemu-img check test.qcow2
No errors were found on the image.
Image end offset: 262144
P.S.
qemu-img cheack
不能检查 raw 格式的镜像。这个命令可以检查镜像文件有没有损坏。
3. 安装虚拟机
[root@KVM ~]# systemctl enable --now libvirtd
[root@KVM ~]# nice -20 cp /dev/cdrom /vm/centos7.5.iso
[root@KVM ~]# qemu-img create -f qcow2 /vm/demo1.qcow2 20G
[root@KVM ~]# virt-install \
> -n demo1 \
> -r 1024 \
> --vcpus=2 \
> -c /vm/centos7.5.iso \
> --os-type=linux \
> --disk /vm/demo1.qcow2 \
> --graphics vnc \
> --network network=default
4. 虚拟机管理
4.1 虚拟机状态
-
运行状态:running、idle
-
暂停状态:paused、pmsuspended
-
关闭状态:shutdown、shut off、save
-
异常状态:crashed、dying
状态 | 说明 | |
---|---|---|
running | 运行状态 | 虚拟机正在运行 |
idle | 空闲状态 | 虚拟机当前是运行的,但当前无任务在执行 |
paused | 暂停状态 | 虚拟机运行已暂停,当前状态被保存。可以resume恢复运行 |
shutdown | 关闭状态 | 虚拟机已正常关闭或用户发出关闭命令。磁盘已保存运行状态 |
crashed | 崩溃状态 | 虚拟机由于错误崩溃。磁盘上数据可能丢失或损坏 |
dying | 关机状态 | 虚拟机接收到关闭命令,正在执行关闭过程。磁盘数据还未保存 |
shut off | 已关闭状态 | 虚拟机已完全关闭,但磁盘上数据正常保留。可以重新启动 |
pmsuspend | ACPI S3睡眠状态 | 运行状态已保存到内存,虚拟机等待唤醒。属于暂停状态 |
save | 保存状态 | 运行状态已保存到磁盘,虚拟机已关闭。属于已关闭状态,可以恢复运行 |
4.2 虚拟机管理
- 创建虚拟机
# virsh define vm0.xml
// 根据配置文件定义/更新一台 KVM 虚拟机,不启动
# virsh create vm0.xml
// 根据配置文件定义一台 KVM 虚拟机,启动
- 管理虚拟机
# virsh start vm0
// 开启虚拟机
# virsh shutdown vm0
// 正常关闭虚拟机
# virsh destroy vm0
// 强制关闭虚拟机
# virsh reboot vm0
// 重启虚拟机
# virsh reset vm0
// 断电重启虚拟机
# virsh suspend vm0
// 挂起虚拟机
# virsh resume vm0
// 恢复挂起
# virsh save vm0
// 保存虚拟机状态
# virsh undefine vm0
// 删除虚拟机定义(需要先关闭虚拟机)
# virsh console vm0
// 连接虚拟机的串行终端
P.S. 如何正确使用
virsh console
命令?
- 在要连接串行端口的虚拟机中修改:
# vi /etc/default/grub GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet console=ttyS0,115200" // 尾部添加 console=ttyS0,115200 # systemctl enable --now serial-getty@ttyS0@
- 在宿主机中编辑虚拟机配置文件
<serial type='pty'> <target port='0'/> </serial> <console type='pty'> <target type='serial' port='0'/> </console> // 在 <device></device> 字段中
- 查看虚拟机
[root@KVM ~]# virsh dominfo demo1
Id: 12
Name: demo1
UUID: ddd941ed-2f57-42d1-81ed-3190eeb684a6
OS Type: hvm
State: running
CPU(s): 2
CPU time: 35.0s
Max memory: 1048576 KiB
Used memory: 1048576 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: selinux
Security DOI: 0
Security label: system_u:system_r:svirt_t:s0:c13,c707 (permissive)
// 显示vm0虚拟机的基本信息,如状态、CPU和内存使用量等。
[root@KVM ~]# virsh list --all
Id Name State
----------------------------------------------------
11 demo1a running
13 demo1 running
// 显示正在运行的虚拟机列表, --all 显示所有的虚拟机
- 设置虚拟机
# virsh autostart vm0
// 设置虚拟机开机自启
# virsh autostart --disable vm0
// 关闭虚拟机的开机自启
5. 增量镜像
5.1 增量镜像
-
基础镜像是一个包含了完整操作系统环境的镜像文件,直接在官网下载的 ISO 镜像就是一个基础镜像
-
增量镜像只包含了对基础镜像的修改后的数据和映射基础镜像的元数据。
5.2 创建增量镜像
一个增量镜像需要先指定一个基础镜像,此处也可以说是后备镜像,用 -b
参数指定即可。
[root@KVM ~]# qemu-img create -b /vm/demo1.qcow2 -f qcow2 /vm/demo1a.qcow2
Formatting '/vm/demo1.a.acow2', fmt=qcow2 size=21474836480 backing_file='/vm/demo1.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off
5.3 合并增量镜像
合并增量镜像的好处:
- 可以释放大量磁盘空间
- 提高磁盘 I/O 性能
- 方便备份
- 方便管理
- 提供一致性的虚拟机热备份
合并增量镜像的过程中读取了基础镜像和增量镜像的数据,将他们写入新的镜像,同时建立正确的映射关系。
[root@KVM ~]# virsh destroy demo1
Domain demo1 destroyed
[root@KVM ~]# cp /etc/libvirt/qemu/demo1.xml /etc/libvirt/qemu/demo1a.xml
[root@KVM ~]# vi /etc/libvirt/qemu/demo1a.xml
--demo1a.xml:>
- :%s/demo1/demo1a/g
<uuid></uuid>
# 修改 uuid,只要与原 uuid 不一样就行
- :wq
<:--
[root@KVM ~]# virsh define /etc/libvirt/qemu/demo1a.xml
Domain demo1a defined from /etc/libvirt/qemu/demo1a.xml
此处我们还是拿 demo1 虚拟机模板,它包含了基础镜像的映射信息(元数据),所以我们新改的元数据,也不过是在此基础上独立了一个新的虚拟机,这个虚拟机使用的是基础镜像罢了。
因为是映射,所以我们的新虚拟机不能和原虚拟机冲突,特别是:
- 虚拟机域名:name
- 设备标识符:uuid
- 网络地址:MAC 地址(如果使用网络的话)
P.S. 建议提前关闭虚拟机:
- 关闭虚拟机可以避免磁盘写入,否则可能导致合并后的镜像文件数据不一致。
- 不关闭虚拟机可能会导致在合并过程中删除某些数据块导致虚拟机运行时磁盘错误。
- 合并增量镜像需要一定磁盘空间,关闭虚拟机确保有更多空间。
- 在线合并也是可以的,但要承担相应的风险。
6. 加密镜像
6.1 密钥文件
secret.xml
文件是用于 libvirt 中管理机密信息的文件,其中包含了密钥信息、密码、证书等安全相关的数据。
secret.xml
文件结构:
<secret ephemeral='no' private='no'>
<uuid>...</uuid>
<usage>...</usage>
<data>
...
</data>
</secret>
ephemeral
属性指示机密信息是否是临时的private
属性指示机密信息是否可以被其他用户访问uuid
元素包含了这个机密信息的 UUIDusage
元素指定了这个机密信息的类型,如密码、证书等data
元素包含了加密后的机密信息内容
6.2 镜像加密
[root@KVM ~]# qemu-img convert -f qcow2 -O qcow2 -o encryption /vm/demo1.qcow2 /vm/demo1.a.qcow2
Disk image '/vm/demo1.a.qcow2' is encrypted.
password:
[root@KVM ~]# qemu-img info /vm/demo1.a.qcow2
image: /vm/demo1.a.qcow2
file format: qcow2
virtual size: 20G (21474836480 bytes)
disk size: 1.2G
encrypted: yes # 成功加密
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
6.3 使用加密的镜像
[root@KVM ~]# virsh destroy demo1
Domain demo1 destroyed
[root@KVM ~]# echo "<secret></secret>" > /vm/secret.xml
[root@KVM ~]# virsh secret-define /vm/secret.xml
Secret 7d6e39b5-8a00-482c-8243-ae1422e8edf0 created
[root@KVM ~]# virsh secret-set-value 7d6e39b5-8a00-482c-8243-ae1422e8edf0 $(printf %s '000000' | base64)
[root@KVM ~]# virsh edit demo1
Secret value set
--demo1a.xml:>
- /source
<source file='/vm/demo1.a.qcow2'/>
# 将镜像改为加密的镜像
<encryption format='qcow'>
<secret type='passphrase' uuid='7d6e39b5-8a00-482c-8243-ae1422e8edf0'/>
</encryption>
# 在 <source/> 下紧跟加密配置
- wq
<:--
Domain demo1 XML configuration edited.
[root@KVM ~]# virsh start demo1
Domain demo1 started
7. 快照
7.1 什么快照
在电脑系统中,快照(英语:snapshot)是整个系统在某个时间点上的状态。这个名词是由摄影中借用而来。它储存了系统映象(System image),让电脑系统在出现问题时,可以快速恢复到未出问题前的状况。
快照功能通常是以写入时复制(copy-on-write)技术来实作。Linux通过逻辑卷轴管理员实作快照功能。
———— 维基百科
分类:
- 热快照(联机快照):运行时创建,实现热备份与不间断服务
- 冷快照(离线快照):关闭时创建,无法热备份,用于备份关机状态
7.2 管理快照
7.2.1 创建快照
[root@KVM ~]# virsh snapshot-create-as demo1 demo1.snap01 "The First Snapshort of VM-demo1"
Domain snapshot demo1.snap01 created
- demo1 : 要创建快照的虚拟机名称
- demo1.snap01 : demo1 的第一个快照的名字
- “The First Snapshort of VM-demo1” : 快照demo1.snap01 的描述
7.2.2 查看快照
[root@KVM ~]# virsh snapshot-list demo1
Name Creation Time State
------------------------------------------------------------
demo1.snap01 2023-06-06 00:27:45 -0400 running
- State 显示创建快照时虚拟机的状态,
running
显示这是一个热快照,shutoff
显示这是一个冷快照。
7.2.3 恢复快照/回滚
[root@KVM ~]# virsh snapshot-revert demo1 demo1.snap01
7.2.4 删除快照
[root@KVM ~]# virsh snapshot-delete demo1 demo1.snap01
Domain snapshot demo1.snap01 deleted
[root@KVM ~]# virsh snapshot-list demo1
Name Creation Time State
------------------------------------------------------------
8. 克隆
8.1 什么是克隆(clone)
KVM 克隆是基于 KVM 虚拟化技术实现的虚拟机克隆。它通过复制虚拟机磁盘来创建与源虚拟机完全相同的新虚拟机。
8.2 管理克隆
[root@KVM ~]# virsh destroy demo1
[root@KVM ~]# nice -20 virt-clone -o demo1a -n demo1a-clone -f /vm/demo1a-clone.qcow2 --auto-clone
Clone 'demo1a-clone' created successfully.
- -o :指定需要被 clone 的虚拟机
- -n :命名 clone 后的虚拟机名称
- -f :指定新 clone 的虚拟机的位置
- –auto-clone : 实现自动克隆,避免域资源冲突
P.S. 我们在做合并增量镜像的时候,就算属于克隆了。(详见 5.3)
9. 存储
9.1 存储卷与存储池
在 kvm 中,libvirt
将存储管理分为:存储卷(volume)、存储池(pool)。
- 存储卷是存储池中的一个逻辑单元,它代表着一个磁盘镜像文件、一个 LVM 卷、一个 iSCSI 卷等。存储卷管理包括创建、删除、调整存储卷的大小、克隆存储卷等操作。
- 存储池是一个逻辑概念,它代表着一个或多个物理存储设备(例如硬盘、网络存储等)的集合,可以用来存储虚拟机的磁盘镜像和其他数据文件。存储池管理包括创建、删除、修改、扩容、缩容等操作。
9.2 存储卷
9.2.1 虚拟机添加卷
- 通过
xml
文件添加
[root@KVM ~]# du -ah /vm/disk1.qcow2
196K /vm/disk1.qcow2
// 新建一个镜像文件
[root@KVM ~]# virsh edit demo1
Domain demo1 XML configuration edited.
// 编辑虚拟机配置文件
--demo1.xml:>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/vm/disk1.qcow2'/>
<target dev='hdb' bus='ide'/>
</disk>
- :wq
<:--
// 复制原有 <disk></disk> 字段
// 修改 <source/> 字段中的 file
// 修改 <target/> 字段中的 dev
// 删除 <address/> 行
- 通过
attach-device
命令附加
- 先新建一个磁盘的配置文件
[root@KVM ~]# cat <<EOF>> /vm/disk2.xml
> <disk type='file' device='disk'>
> <driver name='qemu' type='qcow2'/>
> <source file='/vm/disk2.qcow2'/>
> <target dev='hdc' bus='ide'/>
> </disk>
> EOF
- 添加磁盘
[root@KVM ~]# virsh attach-device demo1 /vm/disk2.xml --config
Device attached successfully
- 重启虚拟机
[root@KVM ~]# virsh destroy demo1
Domain demo1 destroyed
[root@KVM ~]# virsh start demo1
Domain demo1 started
- 检查
[root@KVM ~]# virsh domblklist demo1
Target Source
------------------------------------------------
hda /vm/demo1.qcow2
hdb /vm/disk1.qcow2
hdc /vm/disk2.qcow2
9.2.2 虚拟机删除卷
[root@KVM ~]# virsh detach-device demo1 /vm/disk2.xml --config
[root@KVM ~]# virsh domblklist demo1
Target Source
------------------------------------------------
hda /vm/demo1.qcow2
hdb /vm/disk1.qcow2
9.3 存储池
9.3.1 目录类型的存储池
[root@KVM ~]# mkdir -p /vm/pool
[root@KVM ~]# virsh pool-define-as dirpool dir - - - - /vm/pool/
[root@KVM ~]# virsh pool-start dirpool
pool-define-as
: 定义存储池dirpool
: 存储池的名称dir
: 存储池的类型- - - -
: 不定义任何源蚕食/vm/pool/
: 存储池的位置
9.3.2 分区类型的存储池
[root@KVM ~]# parted -s /dev/sdc mklabel gpt mkpart primary 0 20G
[root@KVM ~]# mkfs.ext4 /dev/sdc1
[root@KVM ~]# virsh pool-define-as fspool fs --source-dev /dev/sdc1 --target /mnt
[root@KVM ~]# virsh pool-start fspool
--source-dev
: 原设备路径--target
: 存储池的位置
9.3.3 磁盘类型的存储池
[root@KVM ~]# virsh pool-define-as diskpool disk --source-dev /dev/sdb --target /mnt
[root@KVM ~]# virsh pool-build diskpool
[root@KVM ~]# virsh pool-start diskpool
virsh pool-build
: 格式化存储池(定义)
9.3.4 管理存储池
# virsh pool-autostart dirpool
// 设置存储池开机自启
# virsh pool-info dirpool
// 查看存储池的详细信息
# virsh pool-destroy dirpool
// 关闭存储池
# virsh pool-delete dirpool
// 删除存储池
# virsh pool-undefine dirpool
// 取消定义存储池
10. 网络
10.1 KVM 中的网络
KVM 中的四大网络模式
网络模式 | 作用 |
---|---|
桥接模式 | 虚拟机直接接入外部物理网络 |
NAT 模式 | 通过NAT访问外部网络,提供安全隔离 |
路由模式 | 手动路由和DNS配置,满足特定网络需求 |
隔离模式 | 虚拟机与宿主机隔离网络,不与外部通信(HOST-ONLY) |
[ kvm ] 四种简单的网络模型 - hukey - 博客园 (cnblogs.com)
P.S. hukey 是泛 Linux 技术领域的大佬,可以关注以学更多。
-
桥接模式
桥接网络模式使用网桥设备将虚拟机直接连接到宿主机的物理网络上,使虚拟机就像物理机一样可以直接访问网络。虚拟机拥有的MAC地址在网络中可见,可以像物理机一样直接与其他设备通信。适用于需要虚拟机直接接入网络的生产环境。
使虚拟网络可以在真实网络中通讯。
类似 VMware 的桥接模式。
-
NAT 模式
NAT 网络模式使用 iptables NAT 规则将虚拟机的网络数据转发到宿主机,并通过宿主机与外部网络通信。这种模式提供了网络隔离与地址转换的功能,虚拟机的 MAC 地址在外部网络不可见。适用于管理网络或安全需要隔离的场景。
虚拟网络通过 iptables NAT 地址转换,用物理网络访问真实网络。
类似 VMware 的 NAT 模式。
-
路由模式
路由网络模式需要手动配置静态路由和 DNS 等设置来满足虚拟机特定的网络连接需求。虚拟机的网络能够像物理机一样发送与接收数据包,但是需要正确的路由设置来确保数据包能到达目的地并返回。适用于有特殊网络配置需求的虚拟机。
虚拟机通过路由规则和 DNS 在实际网络中转发路径。
VMware 中没有相对应的模式。
-
隔离模式
隔离网络模式使用虚拟网络设备在虚拟机与宿主机之间创建隔离网络,实现虚拟机与宿主机通信,不与外部网络通信。适用于管理网络或测试用途,有效隔离虚拟机网络。
虚拟机不会在真实网络上通讯,但可以在物理网络中通讯。
类似 VMware 的仅主机模式。
10.2 桥接网络
10.2.1 创建桥接网卡
[root@KVM ~]# cd /etc/sysconfig/network-scripts/
[root@KVM network-scripts]# cp ifcfg-eno16777736 ifcfg-eno16777736.bak
[root@KVM network-scripts]# virsh destroy demo1
[root@KVM network-scripts]# virsh iface-bridge eno16777736 br0
Created bridge br0 with attached device eno16777736
[root@KVM network-scripts]# ls /sys/class/net/
br0 eno16777736 lo virbr0 virbr0-nic
[root@KVM network-scripts]# cat ifcfg-eno16777736
DEVICE=eno16777736
ONBOOT=yes
BRIDGE="br0"
[root@KVM network-scripts]# cat ifcfg-br0
DEVICE="br0"
ONBOOT="yes"
TYPE="Bridge"
BOOTPROTO="none"
IPADDR="192.168.100.200"
NETMASK="255.255.255.0"
GATEWAY="192.168.100.2"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
DHCPV6C="no"
STP="on"
DELAY="0"
[root@KVM network-scripts]# virsh edit demo1
--demo1.xml:>
<interface type='bridge'>
# 将 network 改为 bridge
<mac address='52:54:00:42:d1:36'/>
<source bridge='br0'/>
# 将 network='default' 改为 bridge='br0'
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<:--
Domain demo1 XML configuration edited.
10.2.2 配置虚拟机网络
进入虚拟机 demo1 编辑其网络
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
[root@localhost ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:42:d1:36 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.12/24 brd 192.168.100.255 scope global dynamic eth0
valid_lft 1542sec preferred_lft 1542sec
inet6 fe80::5054:ff:fe42:d136/64 scope link
valid_lft forever preferred_lft forever
P.S. 可以使用远程连接工具连接虚拟机 demo1 检验。
10.3 NAT 网络
创建 NAT 网络
[root@KVM ~]# cd /etc/libvirt/qemu/networks/
[root@KVM networks]# cp default.xml net1.xml
[root@KVM networks]# vi net1.xml
[root@KVM networks]# cat net1.xml
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
virsh net-edit default
or other application using the libvirt API.
-->
<network>
<name>net1</name>
<uuid>03d45040-7cdb-40cd-b371-1048ed00f265</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:ee:4f:a2'/>
<ip address='192.168.100.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.100.2' end='192.168.100.254'/>
</dhcp>
</ip>
</network>
# 为防止冲突,需要修改:
# 1. 网卡名,将 default 修改为 net1
# 2. 网卡 UUID
# 3. 桥接网卡设备名,将 virbr0 修改为 virbr1
@ 3. MAC
# 5. 网卡 IP
# 6. 网卡 DHCP 地址池
[root@KVM networks]# virsh net-define net1.xml
Network net1 defined from net1.xml
[root@KVM networks]# virsh net-list --all
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes
net1 inactive no yes
[root@KVM networks]# virsh net-autostart net1
Network net1 marked as autostarted
[root@KVM networks]# virsh net-start net1
Network net1 started
[root@KVM networks]# virsh net-list --all
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes
net1 active yes yes
11. 迁移
11.1 什么是迁移
11.1.1 迁移初窥
虚拟机(kvm)的迁移(Migration)分为冷迁移(Cold Migration)和热迁移(Live Migration)。
虚拟机的迁移就是将虚拟机从源服务器(Source)迁移到目标服务器(Destination)的过程,它可以使物理服务器之间移动虚拟机而不造成长时间停机。
冷迁移需要先关闭虚拟机,然后将虚拟机的磁盘文件、配置文件等迁移到目标服务器。
热迁移可以直接迁移正在运行的虚拟机,他能同步虚拟机的状态实施迁移到目标服务器。
P.S. 迁移、复制、移动这三个概念相差很大:
- 迁移
- 源服务器虚拟机状态全部被迁移了;
- 有冷迁移、热迁移,可以更好的实现业务连续性。
- 复制
- 源服务器和目标服务器上是分别的两台虚拟机;
- 通常作为灾备。
- 移动
- 源服务器的虚拟机依然存在,但是其文件为空。
- 通常是转移磁盘文件至源服务器的不同位置上。
11.2 迁移的注意事项
对于源服务器与目的服务器来说,要注意以下因素:
- 确保目的物理服务器的硬件和软件环境与源物理服务器兼容。
- 确保目的物理服务器的计算资源和存储空间足够。
- 确保数据迁移的完整性和一致性。在进行数据迁移时,需要考虑数据的完整性和一致性,以避免数据丢失或不一致。
- 确保操作系统和应用程序的依赖关系正确。
- 确保操作系统和应用程序的配置信息正确。在迁移操作系统和应用程序时,可能需要重新配置配置文件,如网络配置、存储配置、防火墙配置、数据库连接信息等,以确保操作系统和应用程序能够正常运行。
在热迁移中,需要使用共享存储技术,因为在热迁移过程中为了不停止虚拟机,需要实时传输。
11.2 冷迁移
做法:拷贝虚拟机的所有磁盘文件、配置文件至目标服务器中。
11.3 热迁移(实时迁移)
11.3.1 环境准备
需要两台虚拟机,一台源服务器,也用来做 NFS 共享服务,一台目标服务器。
-
用 VMware 将 KVM 克隆。
-
为了防止冲突,进行修改:
Source | Destination | |
---|---|---|
HostName | kvm-server1 | kvm-server2 |
IP | 192.168.100.11/24 | 192.168.100.12/24 |
UUID | a* | b* |
-
写好
hosts
域名映射文件、关闭防火墙策略与SELINUX
。 -
NFS 设置
--kvm-server1:
[root@kvm-server1 ~]# systemctl start rpcbind
[root@kvm-server1 ~]# systemctl start nfs
[root@kvm-server1 ~]# mkdir /nfsdir
[root@kvm-server1 ~]# echo "/nfsdir *(rw,sync,no_root_squash)" >> /etc/exports
[root@kvm-server1 ~]# systemctl restart rpcbind
[root@kvm-server1 ~]# exportfs -r
--kvm-server2:
[root@kvm-server2 ~]# systemctl start rpcbind
[root@kvm-server2 ~]# systemctl start nfs
[root@kvm-server2 ~]# showmount -e 192.168.100.11
Export list for 192.168.100.11:
/nfsdir *
- 存储池设置
--kvm-server1:
[root@kvm-server1 ~]# systemctl enable --now libvirtd
[root@kvm-server1 ~]# virsh pool-define-as dirpool dir - - - - /nfsdir/
Pool dirpool defined
[root@kvm-server1 ~]# virsh pool-start dirpool
Pool dirpool started
[root@kvm-server1 ~]# cd /nfsdir/
[root@kvm-server1 nfsdir]# qemu-img create -f qcow2 demo1.qcow2 20G
--kvm-server2:
[root@kvm-server2 ~]# systemctl enable --now libvirtd
[root@kvm-server2 ~]# virsh pool-define-as --name nfspool --type=netfs --source-host 192.168.100.11 --source-path /nfsdir --target /nfsdir
Pool nfspool defined
[root@kvm-server2 ~]# mkdir /nfsdir
[root@kvm-server2 ~]# virsh pool-start nfspool
- 创建虚拟机
--kvm-server1:
[root@kvm-server1 nfsdir]# nice -20 cp /dev/cdrom centos7.iso
[root@kvm-server1 nfsdir]# virt-install \
> -n demo1 -r 1024 \
> --vcpus=2 \
> -c /nfsdir/centos7.iso \
> --os-type=linux \
> --disk /nfsdir/demo1.qcow2 \
> --graphics vnc \
> --network network=default
- 迁移虚拟机
--kvm-server1:
[root@kvm-server1 nfsdir]# virsh migrate demo1 --live --unsafe qemu+ssh://kvm-server2/system
The authenticity of host 'kvm-server2 (192.168.100.12)' can't be established.
ECDSA key fingerprint is 32:3d:61:7b:06:6d:16:e8:4d:ae:30:60:32:5f:bf:03.
Are you sure you want to continue connecting (yes/no)? yes
root@kvm-server2's password:
[root@kvm-server2 ~]# virsh list --all
Id Name State
----------------------------------------------------
3 demo1 running