文章目录
- 一、部署 KVM
- 删除其他虚拟化软件(假如有)
- 2 检查当前服务器 CPU 是否支持虚拟化
- 3 安装相关软件
- 4 启动服务并授权开机自启
- 5 验证 kvm 的内核模块是否加载
- 二、图形化方式创建虚拟机
- 1 安装流程
- 2 查看虚拟机默认的配置文件和虚拟磁盘文件
- 2.1 配置文件
- 1 位置
- 2 配置文件关键内容详解
- 2.2 虚拟磁盘文件
- 3 修改配置文件,创建虚拟机
- 三、利用模板快速创建虚拟机
- 1 制作配置文件模板文件
- 2 制作虚拟硬盘的模板
- 3 创建新的虚拟机
- 3.1 创建新虚拟机的配置文件
- 3.2 创建新虚拟机的虚拟磁盘
- 4 定义虚拟机
- 5 启动虚拟机
- 四、virsh 管理虚拟机
- 五、给虚拟添加硬件
- 1 图形化方式添加
- 2 命令方式添加
- 2.1 添加内存
- 2.2 添加硬盘
- 在宿主机中修改虚拟磁盘中的文件
- 2.3 添加网卡
- 六、虚拟机的存储池
- 1 存储池概念
- 本地存储池
- 网络(共享)存储池
- 2 kvm默认存储池的位置
- 3 定义存储池
- 4 启动存储池
- 5 打开自动启动(可选)
- 6 删除存储池
- 6.1 删除存储池的前提条件
- 6.2 使用virsh删除存储池
- 6.2.1 列出定义的存储池:
- 6.2.2 停止要删除的存储池。
- 6.2.3(可选)对于某些类型的存储池,您可以选择删除存储池所在的目录:
- 6.2.4 删除存储池的定义。
- 6.2.5 确认池未定义:
- 七、 虚拟机的快照
- 1 给指定虚拟机创建快照
- 2 查看指定虚拟机的快照
- 3 恢复快照
- 4 删除快照
- 八、虚拟机的网络
- 1 网络模式介绍
- NAT模式(默认模式)
- 隔离模式
- 桥接模式
- 2 设置桥接网络
- 2.1 配置文件方式配置桥接:在宿主机上
- 2.2 虚拟机使用桥接网络的方式
- 2.3 图形化方式使用桥接网络
- 2.4 命令行配合配置文件方式添加
- 3 删除网桥模式
- 九、编写 kvm 管理系统(写个 shell 脚本)
- 配置文件模块
- 迁移
- 关于网卡名称不一致
- 1 修改网卡名称使用 eth[0-9]
- 查看网卡 UUID 和名称
- 查看本机实际的网卡名称分配地址
- 添加 console
一、部署 KVM
删除其他虚拟化软件(假如有)
2 检查当前服务器 CPU 是否支持虚拟化
1
2grep -E 'svm|vmx' /proc/cpuinfo
- vmx is for Intel processors
- svm is for AMD processors
3 安装相关软件
1
2
3yum -y install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install virt-manager
4 启动服务并授权开机自启
1
2systemctl enable libvirtd && systemctl start libvirtd
5 验证 kvm 的内核模块是否加载
1
2lsmod |grep kvm
二、图形化方式创建虚拟机
1 安装流程
等待系统安装完成即可
安装完成后进入系统,可以执行一些初识化操作
2 查看虚拟机默认的配置文件和虚拟磁盘文件
2.1 配置文件
1 位置
1
2
3
4[root@kvm-server ~]# ls /etc/libvirt/qemu autostart centos7.xml networks [root@kvm-server ~]#
2 配置文件关键内容详解
虚拟机名称
1
2<name>centos7</name>
UUID 具有唯一性
1
2<uuid>9fd70bcf-1ba4-49b2-b3a9-b70b0282ec60</uuid>
内存
kvm 虚拟机的内存可以动态调整,就是可以在虚拟机运行状态下修改当前的内存大小,但是动态设置的内存容量不能大于配置文件中设置的最大可用内存。
1
2
3
4
5
6<!--虚拟机的最大可配置的内存容量--> <memory unit='KiB'>4194304</memory> <!--运行时候的实际内存--> <currentMemory unit='KiB'>4194304</currentMemory>
磁盘
1
2
3
4
5
6
7<disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/var/lib/libvirt/images/centos7.qcow2'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> </disk>
这里需要注意的是:
- 磁盘的文件路径
<source file='/var/lib/libvirt/images/centos7.qcow2'/>
- 磁盘的名称
<target dev='vda' bus='virtio'/>
- 磁盘的插槽号
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
kvm 虚拟磁盘的文件格式有两种
- raw 性能最好,设置几G,就会占用物理机磁盘的实际几G 容量,不支持虚拟机的快照
- qcow2 性能一般,优点是支持写时复制,支持虚拟机的快照
写时复制就是,设置 10G 容量的磁盘,而实际占用物理机磁盘容量是没有 10G,实际占用的容量是虚拟机内实际使用的大小。比如虚拟机内实际使用了 3G,那会占用物理机磁盘的 3G 左右的容量。
网卡
网卡需要关注 mac 地址部分,前三组是不能变的,后面三组是可以变化的。
1
2
3
4
5
6
7<interface type='network'> <mac address='52:54:00:e2:6c:c1'/> <source network='default'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface>
2.2 虚拟磁盘文件
1
2
3
4
5[root@kvm-server ~]# ls /var/lib/libvirt/images/ centos7.qcow2 [root@kvm-server ~]#
3 修改配置文件,创建虚拟机
三、利用模板快速创建虚拟机
我们可以利用已有的虚拟机配置文件和含有操作系统的虚拟磁盘快速创建一台虚拟机。
1 制作配置文件模板文件
首先我们需要准备一个虚拟机配置文件的模板。
下面我们拷贝原来虚拟机的配置文件 centos7.xml
到当前用户的家目录下,并命名为 centos7-mod.xml
。
1
2cp /etc/libvirt/qemu/centos7.xml centos7-mod.xml
接下来修改模板文件 centos7-mod.xml
中的如下内容:
- 虚拟机的名称、UUID、内存部分、mac 部分
设置虚拟机的名称部分为关键字: vm-name
设置虚拟机的 UUID 部分为关键字: vm-uuid
设置虚拟机的最大可用内存和当前使用内存部分为关键字: vm-mem
设置虚拟机的 mac 部分为关键子: vm-mac
1
2
3
4
5<name>vm-name</name> <!--这里修改了--> <uuid>vm-uuid</uuid> <!--这里修改了--> <memory unit='KiB'>vm-mem</memory> <currentMemory unit='KiB'>vm-mem</currentMemory>
- 虚拟机的磁盘部分
设置虚拟磁盘的路径部分为关键字: vm-disk-path
1
2
3
4
5
6
7<disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='vm-disk-path'/> <!--这里修改了--> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> </disk>
- 虚拟机 mac 部分
1
2
3
4
5
6
7<interface type='network'> <mac address='52:54:00:vm-mac'/> <!--这里修改了--> <source network='default'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface>
修改后的模板文件完整代码
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121[root@kvm-server ~]# cat centos7-mod.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 edit centos7 or other application using the libvirt API. --> <domain type='kvm'> <name>vm-name</name> <!--这里修改了--> <uuid>vm-uuid</uuid> <!--这里修改了--> <memory unit='KiB'>vm-mem</memory> <!--这里修改了--> <currentMemory unit='KiB'>vm-mem</currentMemory> <!--这里修改了--> <vcpu placement='static'>2</vcpu> <os> <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type> <boot dev='hd'/> </os> <features> <acpi/> <apic/> </features> <cpu mode='custom' match='exact' check='partial'> <model fallback='allow'>SandyBridge-IBRS</model> <feature policy='require' name='md-clear'/> <feature policy='require' name='spec-ctrl'/> <feature policy='require' name='ssbd'/> </cpu> <clock offset='utc'> <timer name='rtc' tickpolicy='catchup'/> <timer name='pit' tickpolicy='delay'/> <timer name='hpet' present='no'/> </clock> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>destroy</on_crash> <pm> <suspend-to-mem enabled='no'/> <suspend-to-disk enabled='no'/> </pm> <devices> <emulator>/usr/libexec/qemu-kvm</emulator> <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='vm-disk-path'/> <!--这里修改了--> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> </disk> <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <target dev='hda' bus='ide'/> <readonly/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='usb' index='0' model='ich9-ehci1'> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/> </controller> <controller type='usb' index='0' model='ich9-uhci1'> <master startport='0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/> </controller> <controller type='usb' index='0' model='ich9-uhci2'> <master startport='2'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/> </controller> <controller type='usb' index='0' model='ich9-uhci3'> <master startport='4'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/> </controller> <controller type='pci' index='0' model='pci-root'/> <controller type='ide' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> </controller> <controller type='virtio-serial' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </controller> <interface type='network'> <mac address='52:54:00:vm-mac'/> <!--这里修改了--> <source network='default'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface> <serial type='pty'> <target type='isa-serial' port='0'> <model name='isa-serial'/> </target> </serial> <console type='pty'> <target type='serial' port='0'/> </console> <channel type='unix'> <target type='virtio' name='org.qemu.guest_agent.0'/> <address type='virtio-serial' controller='0' bus='0' port='1'/> </channel> <channel type='spicevmc'> <target type='virtio' name='com.redhat.spice.0'/> <address type='virtio-serial' controller='0' bus='0' port='2'/> </channel> <input type='tablet' bus='usb'> <address type='usb' bus='0' port='1'/> </input> <input type='mouse' bus='ps2'/> <input type='keyboard' bus='ps2'/> <graphics type='spice' autoport='yes'> <listen type='address'/> <image compression='off'/> </graphics> <video> <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> </video> <memballoon model='virtio'> <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/> </memballoon> <rng model='virtio'> <backend model='random'>/dev/urandom</backend> <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/> </rng> </devices> </domain>
2 制作虚拟硬盘的模板
虚拟硬盘只需要把原有虚拟机含有操作系统的磁盘拷贝一份即可。
提示:最好是把计划作为模板的这个虚拟机实现做一下系统初始化操作,比如关闭 SELINUX 和防火墙,安装一下常用的软件等。
进行常规设置和安装常用软件
1
2
3
4
5setenforce 0 sed -ri '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config systemctl stop firewalld && systemctl disable firewalld yum -y install wget bash-completion vim-enhanced
至此,现有的虚拟机的硬盘中已经包含了我们需要的环境,下面我们以此虚拟机的硬盘作为一个模板文件。
这样的话,以后以此模板硬盘文件作为新的虚拟机的硬盘文件,新的虚拟机也会有同样的环境了。
1
2
3
4[root@kvm-server ~]# cp /var/lib/libvirt/images/centos7.qcow2 centos7-mod.qcow2
3 创建新的虚拟机
3.1 创建新虚拟机的配置文件
首先定义和新虚拟机相关的变量
1
2
3
4
5
6vm_name=centos7-1 vm_uuid=`uuidgen` vm_mem=1048576 vm_disk_path=/home/centos7-1.qcow2 vm_mac=`openssl rand -hex 3 | sed -r 's/..B/&:/g'`
B
匹配非单词边界的意思&
表示前面正则匹配到的所有内容
接下来,把配置文件中的特殊字符替换变量的值,并产生一个新虚拟机的配置文件
1
2
3
4
5
6
7
8
9[root@kvm-server ~]# sed -r > -e s%vm-name%$vm_name% > -e s%vm-uuid%$vm_uuid% > -e s%vm-mem%$vm_mem% > -e s%vm-disk-path%$vm_disk_path% > -e s%vm-mac%$vm_mac% > centos7-mod.xml > centos7-1.xml
3.2 创建新虚拟机的虚拟磁盘
1
2[root@kvm-server ~]# cp centos7-mod.qcow2 /home/centos7-1.qcow2
4 定义虚拟机
1
2
3
4[root@kvm-server ~]# virsh define centos7-1.xml 定义域 centos7-1(从 centos7-1.xml)
5 启动虚拟机
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20[root@kvm-server ~]# virsh list --all # 列出所有的虚拟机 Id 名称 状态 ---------------------------------------------------- - centos7 关闭 - centos7-1 关闭 [root@kvm-server ~]# virsh start centos7-1 # 启动指定的虚拟机 域 centos7-1 已开始 [root@kvm-server ~]# virsh list Id 名称 状态 ---------------------------------------------------- 1 centos7-1 running [root@kvm-server ~]# virsh domifaddr 1 名称 MAC 地址 Protocol Address ------------------------------------------------------------------------------- vnet0 52:54:00:e2:6c:c1 ipv4 192.168.122.3/24
注意:
virsh domifaddr 虚拟机名称
可以查看虚拟机的 IP 地址,前提条件是虚拟主机需要是自动获取的 IP
四、virsh 管理虚拟机
下文中 vm-name
表示一个虚拟机的名称
1 列出当前宿主机中正在运行的虚拟机
1
2virsh list
2 列出所有的虚拟机
1
2virsh list --all
3 查看指定虚拟机的元数据信息
1
2virsh dominfo vm-name
4 查看指定虚拟机的 IP 地址
1
2virsh domifaddr vm-name
5 启动虚拟机
1
2virsh start vm-name
6 正常关闭虚拟机
1
2virsh shutdown vm-name
7 强制关闭虚拟机,相当于拔掉电源
1
2virsh destroy vm-name
8 重启虚拟机
1
2virsh reboot vm-name
9 从一个 xml 文件定义一个虚拟机
1
2virsh define vmn.xml
vmn.xml
是一个 xml 文件路径名称
10 取消定义一个虚拟机
就是删除一台虚拟机,但是虚拟机的磁盘文件会保留
1
2virsh undefine vm-name
五、给虚拟添加硬件
1 图形化方式添加
自己练习
2 命令方式添加
2.1 添加内存
首先确认虚拟机已经处于关闭状态
1
2virsh shutdown centos7-1
之后设置最大可分配内存
1
2virsh setmaxmem centos7-1 6G
查看虚拟机信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16[root@kvm ~]# virsh dominfo centos7-1 Id: - 名称: centos7-1 UUID: 87f6c2ff-811d-4685-8b61-6494f6ae17e9 OS 类型: hvm 状态: 关闭 CPU: 2 最大内存: 6291456 KiB 使用的内存: 4194304 KiB 持久: 是 自动启动: 禁用 管理的保存: 否 安全性模式: none 安全性 DOI: 0
之后就可以在虚拟机启动的情况下,给其动态的调整内存的大小(范围在最大内存容量内)
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[root@kvm ~]# virsh setmem centos7-1 4G [root@kvm ~]# virsh dominfo centos7-1 Id: 2 名称: centos7-1 UUID: 87f6c2ff-811d-4685-8b61-6494f6ae17e9 OS 类型: hvm 状态: running CPU: 2 CPU 时间: 12.0s 最大内存: 6291456 KiB 使用的内存: 4194304 KiB 持久: 是 自动启动: 禁用 管理的保存: 否 安全性模式: none 安全性 DOI: 0 [root@kvm ~]# virsh setmem centos7-1 5G [root@kvm ~]# virsh dominfo centos7-1 Id: 2 名称: centos7-1 UUID: 87f6c2ff-811d-4685-8b61-6494f6ae17e9 OS 类型: hvm 状态: running CPU: 2 CPU 时间: 12.4s 最大内存: 6291456 KiB 使用的内存: 5242880 KiB 持久: 是 自动启动: 禁用 管理的保存: 否 安全性模式: none 安全性 DOI: 0
2.2 添加硬盘
创建一个虚拟硬盘
1
2
3mkdir -p /centos7/ qemu-img create -f qcow2 /centos7/centos7-1-2.qcow2 2G
编辑一个虚拟硬盘的 xml 文件模板
1
2
3
4
5
6<disk type='file' device='disk'> <driver name='qemu' type='qcow2' cache='writeback' io='threads'/> <source file='/centos7/centos7-1-2.qcow2'/> <target dev='vdb' bus='virtio'/> </disk>
然后使用 attach-device
命令从XML文件添加
1
2virsh attach-device centos7-1 disk.xml --persistent
- –persistent 让实时更改并且持久生效。
最后查看虚拟机的所有磁盘
1
2virsh domblklist centos7-1
在宿主机中修改虚拟磁盘中的文件
1 挂载磁盘
适用于磁盘没有损坏的情况
1
2
3
4guestmount -a /opt/kvm/imgs/tpl-dbcache.qcow2 -m /dev/sda1 /mnt guestmount -a /opt/kvm/imgs/xgqd-dbcache02.qcow2 -m /dev/centos-root /mnt
- 磁盘损坏了或者不损坏均可
virt-copy-out 复制出来
virt-copy-in 复制进去
1
2virt-copy-out -a tpl-nginx-gz.qcow2 /etc/default/grub .
2.3 添加网卡
生产 mac 地址的后 3 位
1
2
3[root@kvm ~]# openssl rand -hex 3 | sed -r 's/..B/&:/g' 12:47:d4
参考当前需要添加网卡的这台虚拟机的xml配置文件中的网络部分,创建一个新网卡的 xml 配置文件
注意修改 mac 地址
1
2
3
4
5
6<interface type='network'> <mac address='52:54:00:12:47:d4'/> <source network='default'/> <model type='virtio'/> </interface>
然后使用 attach-device
命令从XML文件添加
1
2
3
4[root@kvm ~]# virsh attach-device centos7-1 network.xml --persistent 成功附加设备
最后查看确认是否添加
1
2
3
4
5
6
7[root@kvm ~]# virsh domiflist centos7-1 接口 类型 源 型号 MAC ------------------------------------------------------- vnet0 network default virtio 52:54:00:ba:ac:be vnet1 network default virtio 52:54:00:12:47:d4
六、虚拟机的存储池
1 存储池概念
存储池是由libvirt管理的文件,目录或存储设备,用于为虚拟机提供存储。
存储池分为存储虚拟机映像的存储卷或作为附加存储附加到虚拟机的存储卷。
多个被管理的虚拟机可以共享同一个存储池,从而可以更好地分配存储资源。
存储池可以是本地的,也可以是基于网络的(共享的):
本地存储池
本地存储池直接连接到主机服务器。它们包括本地设备上的本地目录,直接连接的磁盘,物理分区和逻辑卷管理(LVM)卷组。
本地存储池对于不需要迁移或大量虚拟机的开发,测试和小型部署很有用。
本地存储池可能不适用于许多生产环境,因为它们不能用于实时迁移。
网络(共享)存储池
联网存储池包括使用标准协议在网络上共享的存储设备。
2 kvm默认存储池的位置
1
2/var/lib/libvirt/images/
3 定义存储池
使用 virsh pool-define-as
命令创建持久性存储池。
1
2
3
4[root@kvm ~]# mkdir /vm-pool/centos7 [root@kvm ~]# virsh pool-define-a --name centos7-pool --type dir --target "/vm-pool/centos7" 创建池 centos7-pool
使用 virsh pool-list --all
命令列出所有现有的存储池。
1
2
3
4
5
6[root@kvm ~]# virsh pool-list 名称 状态 自动开始 ------------------------------------------- centos7-pool 非活动 否 default 活动 是
4 启动存储池
1
2
3
4
5
6
7
8
9
10
11
12[root@kvm ~]# virsh pool-start centos7-pool 池 centos7-pool 已启动 [root@kvm ~]# virsh pool-list --all 名称 状态 自动开始 ------------------------------------------- centos7-pool 活动 否 default 活动 是 opt 活动 是
5 打开自动启动(可选)
默认情况下,virsh 使用自定义的存储池未设置为每次 libvirtd 启动时自动启动。
可以使用 virsh pool-autostart
命令将存储池配置为自动启动。
1
2virsh pool-autostart centos7-pool
6 删除存储池
6.1 删除存储池的前提条件
为避免对使用要删除的存储池的其他来宾虚拟机产生负面影响,建议您停止存储池并释放其使用的所有资源。
6.2 使用virsh删除存储池
6.2.1 列出定义的存储池:
1
2
3
4
5
6# virsh pool-list --all Name State Autostart ----------------------------------------- default active yes guest_images_pool active yes
6.2.2 停止要删除的存储池。
1
2# virsh pool-destroy guest_images_disk
6.2.3(可选)对于某些类型的存储池,您可以选择删除存储池所在的目录:
1
2# virsh pool-delete guest_images_disk
6.2.4 删除存储池的定义。
1
2# virsh pool-undefine guest_images_disk
6.2.5 确认池未定义:
1
2
3
4
5
6# virsh pool-list --all Name State Autostart ----------------------------------------- default active yes
七、 虚拟机的快照
这里以为虚拟机 centos7-1 创建一个快照(磁盘格式必须为qcow2)为例说明对一个虚拟机快照的创建、查询、删除操作。
1
2
3
4
5
6
7
8
9
10[root@kvm ~]# qemu-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: 10G cluster_size: 65536 Format specific information: compat: 1.1 lazy refcounts: true
1 给指定虚拟机创建快照
1
2
3[root@kvm ~]# virsh snapshot-create-as centos7-1 centos7-1.snap1 已生成域快照 centos7-1.snap1
2 查看指定虚拟机的快照
1
2
3
4
5[root@kvm ~]# virsh snapshot-list centos7-1 名称 生成时间 状态 ------------------------------------------------------------ centos7-1.snap1 2020-10-18 16:01:07 +0800 shutoff
3 恢复快照
1
2[root@kvm ~]# virsh snapshot-revert centos7-1 --snapshotname centos7-1.snap1
4 删除快照
1
2
3
4
5[root@kvm ~]# virsh snapshot-delete centos7-1 --snapshotname centos7-1.snap1 已删除域快照 centos7-1.snap1
八、虚拟机的网络
1 网络模式介绍
Libvirt虚拟网络使用虚拟网络交换机的概念。虚拟网络交换机是一种在主机物理机服务器上运行的软件结构。
虚拟机通过这个虚拟的网络交换机和物理宿主机进行通信,从而数据通过物理机和外部网络进行通信。
Linux主机物理机服务器将虚拟网络交换机表示为网络接口。
首次安装并启动libvirtd守护程序(libvirtd)时,表示虚拟网络交换机的默认网络接口是virbr0。
可以使用一下命令查明虚拟网桥
1
2
3
4
5[root@kvm ~]# brctl show bridge name bridge id STP enabled interfaces virbr0 8000.525400831963 yes virbr0-nic
libvirt 会依赖 ip_forward
参数, 并添加响应的 iptables(防火墙)规则,允许去往和来自虚拟机的数据。有些程序可能会关闭 ip_forward
参数,因此最好的选择是将以下内容添加到 /etc/sysctl.conf。
1
2net.ipv4.ip_forward = 1
可以使用如下命令查看此网络接口的信息
1
2
3
4
5$ ip addr show virbr0 3: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN link/ether 1b:c4:94:cf:fd:17 brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
NAT模式(默认模式)
默认网络的配置文件是:/etc/libvirt/qemu/networks/default.xml
默认情况下,虚拟网络交换机以NAT模式运行。如下图所示:
隔离模式
使用隔离模式时,连接到虚拟交换机的所有虚拟机可以彼此之间通信,也可以与宿主机通信,但是它们不会通过宿主机和外部进行互相通信。但是,即使此网络与任何物理网络隔离开,DNS名称仍然可以解析。因此,当DNS名称解析但ICMP(ping)回显请求命令失败时,可能会出现这种情况。
桥接模式
桥接网络(也称为网络桥接或虚拟网络交换)用于将虚拟机网络接口放置在与物理接口相同的网络上。
使用桥接模式时,所有虚拟机都与主机物理机出现在同一子网内。同一物理网络上的所有其他物理机都知道这些虚拟机,并且可以访问这些虚拟机。桥接在OSI网络模型的第2层上运行。
2 设置桥接网络
网桥是一种链路层设备,可根据MAC地址在网络之间转发流量。
它通过侦听网络流量并由此了解哪些主机连接到每个网络来构建基于MAC地址表的转发决策。
可以在Linux主机内使用软件桥,以模拟硬件桥,例如在虚拟化应用程序中,用于与一个或多个虚拟NIC共享NIC。
2.1 配置文件方式配置桥接:在宿主机上
1
2[root@kvm-server ~]# ip a #先找出宿主机用的哪个网卡设备,我的是enp0s25
1.定义虚拟网卡配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14[root@kvm-server ~]# cd /etc/sysconfig/network-scripts/ [root@kvm-server network-scripts]# vim ifcfg-br0 #创建该桥接网卡,默认没有此文件需要新建 [root@kvm-server network-scripts]# cat ifcfg-br0 TYPE=Bridge NAME=br0 DEVICE=br0 ONBOOT="yes" BOOTPROTO=static IPADDR=10.0.111.182 #要和宿主机在一个网络,这里我用的是宿主机的ip GATEWAY=10.0.111.1 #宿主的网关,nat的是.2,桥接是.1 NETMASK=255.255.255.0 DNS1=114.114.114.114 DNS2=8.8.8.8
2 然后看清楚宿主机正在使用的网卡,修改其配置文件(将物理机网卡桥到桥接网卡)
1
2
3
4
5
6
7[root@kvm-server network-scripts]# cp ifcfg-enp0s25 ifcfg-enp0s25.back [root@kvm-server network-scripts]# vim ifcfg-enp0s25 NAME=enp0s25 #定义网卡设备名称 DEVICE=enp0s25 #宿主机正在使用的网卡设备 ONBOOT=yes BRIDGE=br0 #和ifcfg-br0文件里面的设备对应,新添加
3 重启 libvirtd 服务
1
2[root@kvm-server network-scripts]# systemctl restart libvirtd
4 重启 network 服务
1
2[root@kvm-server network-scripts]# systemctl restart network
2.2 虚拟机使用桥接网络的方式
虚拟机使用桥接网络有三种可选方式:
- 新建虚拟机时候使用桥接网络
- 给现有的虚拟机添加一块新的网卡使用桥接网络
- 修改现有虚拟机的网卡为桥接网络
2.3 图形化方式使用桥接网络
下面的实例是给现有的虚拟机添加新的网卡,并使用桥接网络
2.4 命令行配合配置文件方式添加
network.mod
1
2
3
4
5
6
7echo "<interface type='bridge'> <mac address='52:54:00:${vm_mac}'/> <source bridge='br0'/> <model type='rtl8139'/> </interface>"
1
2
3
4
5vm_mac="34:5a:6d" source network.mod > network.xml virsh attach-device centos7-1 tmp/network.xml --persistent
3 删除网桥模式
删除桥接网卡步骤:
1.删除br0的配置文件
2.修改正常网卡的配置文件
3.重启系统
1
2
3
4
5
6
7
8
9[root@kvm-server network-scripts]# mv ifcfg-br0 ifcfg-br0.bak [root@kvm-server network-scripts]# mv ifcfg-enp0s25 ifcfg-enp0s25.bak [root@kvm-server network-scripts]# mv ifcfg-enp0s25.back ifcfg-enp0s25 [root@kvm-server network-scripts]# systemctl restart libvirtd [root@kvm-server network-scripts]# systemctl restart network [root@kvm-server network-scripts]# ping www.baidu.com PING www.a.shifen.com (39.156.66.14) 56(84) bytes of data. 64 bytes from 39.156.66.14 (39.156.66.14): icmp_seq=1 ttl=52 time=13.3 ms
九、编写 kvm 管理系统(写个 shell 脚本)
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86#!/bin/bash #kvm batch create vm tool #version:0.1 #author:name #需要事先准备模板镜像和配置文件模板 echo "1.创建自定义配置单个虚拟机 2.批量创建自定义配置虚拟机 3.批量创建默认配置虚拟机 4.删除虚拟机" read -p "选取你的操作(1/2/3):" op batch_self_define() { kvmname=`openssl rand -hex 5` sourceimage=/var/lib/libvirt/images/vmmodel.img sourcexml=/etc/libvirt/qemu/vmmodel.xml newimg=/var/lib/libvirt/images/${kvmname}.img newxml=/etc/libvirt/qemu/${kvmname}.xml cp $sourceimage $newimg cp $sourcexml $newxml kvmuuid=`uuidgen` kvmmem=${1}000000 kvmcpu=$2 kvmimg=$newimg kvmmac=`openssl rand -hex 3 | sed -r 's/..B/&:/g'` sed -i "s@kvmname@$kvmname@;s@kvmuuid@$kvmuuid@;s@kvmmem@$kvmmem@;s@kvmcpu@$kvmcpu@;s@kvmimg@$kvmimg@;s@kvmmac@$kvmmac@" $newxml virsh define $newxml virsh list --all } self_define() { read -p "请输入新虚机名称:" newname read -p "请输入新虚机内存大小(G):" newmem read -p "请输入新虚机cpu个数:" newcpu sourceimage=/var/lib/libvirt/images/vmmodel.img sourcexml=/etc/libvirt/qemu/vmmodel.xml newimg=/var/lib/libvirt/images/${newname}.img newxml=/etc/libvirt/qemu/${newname}.xml cp $sourceimage $newimg cp $sourcexml $newxml kvmname=$newname kvmuuid=`uuidgen` kvmmem=${newmem}000000 kvmcpu=$newcpu kvmimg=$newimg kvmmac=`openssl rand -hex 3 | sed -r 's/..B/&:/g'` sed -i "s@kvmname@$kvmname@;s@kvmuuid@$kvmuuid@;s@kvmmem@$kvmmem@;s@kvmcpu@$kvmcpu@;s@kvmimg@$kvmimg@;s@kvmmac@$kvmmac@" $newxml virsh define $newxml virsh list --all } case $op in 1)self_define;; 2) read -p "请输入要创建的虚拟机的个数:" num read -p "请输入新虚机内存大小(G):" newmem read -p "请输入新虚机cpu个数:" newcpu for((i=1;i<=$num;i++)) do batch_self_define $newmem $newcpu done;; 3) read -p "请输入要创建的虚拟机的个数:" num for((i=1;i<=$num;i++)) do batch_self_define 1 1 done;; *)echo "输入错误,请重新执行脚本" exit;; esac
配置文件模块
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83# vim /etc/libvirt/qemu/vmmodel.xml <domain type='kvm'> <name>kvmname</name> <uuid>kvmuuid</uuid> <memory unit='KiB'>kvmmem</memory> <currentMemory unit='KiB'>kvmmem</currentMemory> <vcpu placement='static'>kvmcpu</vcpu> <os> <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type> <boot dev='hd'/> </os> <features> <acpi/> <apic/> </features> <cpu mode='custom' match='exact' check='partial'> <model fallback='allow'>Haswell-noTSX</model> </cpu> <clock offset='utc'> <timer name='rtc' tickpolicy='catchup'/> <timer name='pit' tickpolicy='delay'/> <timer name='hpet' present='no'/> </clock> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>destroy</on_crash> <pm> <suspend-to-mem enabled='no'/> <suspend-to-disk enabled='no'/> </pm> <devices> <emulator>/usr/libexec/qemu-kvm</emulator> <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='kvmimg'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> </disk> <controller type='usb' index='0' model='ich9-ehci1'> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/> </controller> <controller type='usb' index='0' model='ich9-uhci1'> <master startport='0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/> </controller> <controller type='usb' index='0' model='ich9-uhci2'> <master startport='2'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/> </controller> <controller type='usb' index='0' model='ich9-uhci3'> <master startport='4'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/> </controller> <controller type='pci' index='0' model='pci-root'/> <controller type='virtio-serial' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </controller> <interface type='network'> <mac address='52:54:00:kvmmac'/> <source network='default'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface> <serial type='pty'> <target type='isa-serial' port='0'> <model name='isa-serial'/> </target> </serial> <console type='pty'> <target type='serial' port='0'/> </console> <channel type='unix'> <target type='virtio' name='org.qemu.guest_agent.0'/> <address type='virtio-serial' controller='0' bus='0' port='1'/> </channel> <input type='mouse' bus='ps2'/> <input type='keyboard' bus='ps2'/> <memballoon model='virtio'> <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/> </memballoon> </devices> </domain>
迁移
压缩办法:
qcow2是稀疏格式的文件,直接传会填充0到创建时声明的大小,
转换方式(推荐方法)
1
2qemu-img convert -c -O qcow2 tpl-nginx.qcow2 tpl-nginx-gz.qcow2
转换后的 tpl-nginx-gz.qcow2 可进行 cp 或者 scp 进行传输,
之后可以进行直接使用。
关于网卡名称不一致
1 修改网卡名称使用 eth[0-9]
修改 /etc/default/grub 的内容 添加 net.ifnames=0 biosdevname=0
执行命令
1
2grub2-mkconfig -o /boot/grub2/grub.cfg
重启机器
查看网卡 UUID 和名称
查看本机实际的网卡名称分配地址
nmcli device
nmcli device show
添加 console
/boot/grub2/grub.cfg
1
2console=ttyS0,115200n8
最后
以上就是无限汉堡最近收集整理的关于kvm虚拟化一、部署 KVM二、图形化方式创建虚拟机三、利用模板快速创建虚拟机四、virsh 管理虚拟机五、给虚拟添加硬件六、虚拟机的存储池七、 虚拟机的快照八、虚拟机的网络九、编写 kvm 管理系统(写个 shell 脚本)迁移关于网卡名称不一致添加 console的全部内容,更多相关kvm虚拟化一、部署内容请搜索靠谱客的其他文章。
发表评论 取消回复