虚拟化技术-KVM安装
# KVM软件安装
# 环境准备
安装一台带有界面的centos 7 虚拟机在软件界面选择安装gnome 或者安装后在安装gnome桌面,确保可以上网。
如果没有安装界面可以通过以下步骤安装图形化界面
开始安装图形界面,先安装X Window System
yum groupinstall "X Window System"
安装gnome
yum groupinstall -y "GNOME"
然后输入进入图形界面指令
init 5
或
startx
2
3
至此,Centos7命令和图形界面安装及下载完成。
# 常用命令
关闭虚拟机
# virsh shutdown <虚拟机名称>
# KVM安装
1. 关闭防火墙和selinux
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
#永久生效,但是必须要重启系统。
2
3
4
5
2. 查看CPU是否支持VT技术
egrep -c '(vmx|svm)' /proc/cpuinfo
如果输出的数字大于 0,则表示CPU 支持虚拟化。
2
3
或
cat /proc/cpuinfo | grep -E 'vmx|svm'
包含vmx或svm 则支持虚拟化
2
3
如果是物理机,需要在bios中开启Inter VT-x或AMD-V/RVI。如果是使用vmware workstation等虚拟化软件,需要打开虚拟机的嵌套虚拟化:
3. 安装kvm软件包
Centos7:
sudo yum install -y qemu-kvm libvirt libvirt-client virt-install bridge-utils libguestfs-tools virt-manager virt-viewer
说明:
- qemu-kvm:即qemu+kvm,kvm负责cpu和内存的虚拟化,而qemu负责IO设备,如网卡和磁盘等的虚拟化。
- libvirt:KVM管理工具,为不同的虚拟机监视器提供了统一的接口
- libvirt-client:包含了一组用于与 libvirt 库交互的命令行工具
- virt-install:用于guestos安装,包括virsh,virt-clone等工具
- bridge-utils:配置网桥
- libguestfs-tools:虚拟机镜像管理工具,包括virt-cat、virt-edit、virt-ls、virt-rescue
- virt-manager:图形界面管理KVM虚拟化
- virt-viewer:用于虚拟机控制台
- libvirt-python:libvirt库的Python 绑定,在Python中使用 libvirt 的功能,包括对虚拟机、存储池、网络等资源的管理,以及对虚拟化宿主机的监控和控制
4. 启用和启动 libvirtd 服务
sudo systemctl enable libvirtd
sudo systemctl start libvirtd
sudo systemctl status libvirtd
2
3
4
5、查看KVM模块加载
# 检查kvm内核模块
$ lsmod | grep kvm
kvm_intel 188740 0
kvm 637515 1 kvm_intel
irqbypass 13503 1 kvm
2
3
4
5
6. 添加用户到 libvirt 组
切换成root用户然后执行下面命令,把root用户添加到libvirt组
$ sudo -s
$ sudo usermod -aG libvirt $(whoami)
$ sudo usermod -aG kvm $USER
$ id
uid=1000(test) gid=1000(test) groups=1000(test),10(wheel),36(kvm),992(libvirt)
2
3
4
5
7. 创建网桥(br0)
如果你打算从本机(Centos7.9)之外访问 KVM 虚拟机,你必须将虚拟机宿主机的网卡映射至网桥。virbr0 网桥是 KVM 安装完成后自动创建的。
$ brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.525400ff2f20 yes virbr0-nic
# 关闭系统防火墙
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld
# 桥接设备关联宿主机网卡
$ sudo virsh iface-bridge ens33 br0
Created bridge br0 with attached device ens33
Bridge interface br0 started
$ brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c2937ae01 yes ens33
virbr0 8000.525400ff2f20 yes virbr0-nic
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建和管理虚拟机
可以使用virt-manager命令行,XML文件等方法创建。
使用的宿主机环境为VMware虚拟机,需要在宿主机CentOS中开启嵌套虚拟化:
# 默认没有开启
$ cat /sys/module/kvm_intel/parameters/nested
N
# 重新加载kvm内核
$ sudo modprobe -r kvm_intel
$ sudo modprobe kvm_intel nested=1
# 再次查看
$ cat /sys/module/kvm_intel/parameters/nested
Y
2
3
4
5
6
7
8
9
# 使用virt-manager创建虚拟机
使用命令行virt-manager启动:
或
[root@localhost ~]# virt-manager
创建虚拟机:
将系统iso上传到宿主机的/var/lib/libvirt/images,光驱文件选择iso:
设置cpu和内存:
设置存储,磁盘放置在default存储池中:
设置网络为br0网桥:
- 图形⽅式(⾮常重要 ⾮常简单)
- 完全⽂本模式(现场配置虚拟机的规格)
- 命令⾏模式(重中之重 最常⽤ 模板镜像+配置⽂件 ⽅式配置规格)
# 使用命令⾏模式创建虚拟机(重中之重 最常⽤ 模板镜像+配置⽂件 ⽅式配置规格)
# 虚拟机配置⽂件
# ls /etc/libvirt/qemu
networks vm1.xml
2
3
# 虚拟机的存储文件
# ls /var/lib/libvirt/images/
vm1.qcow2
2
3
# 操作步骤
- 需要有磁盘镜像⽂件:
[root@localhost ~]# sudo cp /var/lib/libvirt/images/vm1.qcow2 /var/lib/libvirt/images/vm2.qcow2
- 需要有配置⽂件
[root@localhost ~]# sudo cp /etc/libvirt/qemu/vm1.xml /etc/libvirt/qemu/vm2.xml
- 配置⽂件需要修改必要的内容
[root@localhost ~]# sudo vim /etc/libvirt/qemu/vm2.xml
修改为如下内容,主要修改了
vm2 修改名称
0f6069e0-652e-4107-8675-1bf8548449b9 随便可以修改一位
<!--
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 vm1
or other application using the libvirt API.
-->
<domain type='kvm'>
<name>vm2</name>
<uuid>0f6069e0-652e-4107-8675-1bf8548449b9</uuid>
<memory unit='KiB'>1048576</memory>
<currentMemory unit='KiB'>1048576</currentMemory>
<vcpu placement='static'>1</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'>Broadwell-noTSX-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='/var/lib/libvirt/images/vm2.qcow2'/>
<target dev='hda' bus='ide'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<target dev='hdb' bus='ide'/>
<readonly/>
<address type='drive' controller='0' bus='0' target='0' unit='1'/>
</disk>
<controller type='usb' index='0' model='ich9-ehci1'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x7'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci1'>
<master startport='0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci2'>
<master startport='2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci3'>
<master startport='4'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' 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='0x06' function='0x0'/>
</controller>
<interface type='direct'>
<mac address='52:54:00:1f:c1:d1'/>
<source dev='ens33' mode='bridge'/>
<model type='rtl8139'/>
<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='spicevmc'>
<target type='virtio' name='com.redhat.spice.0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<graphics type='spice' autoport='yes'>
<listen type='address'/>
<image compression='off'/>
</graphics>
<sound model='ich6'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</sound>
<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>
<redirdev bus='usb' type='spicevmc'>
<address type='usb' bus='0' port='1'/>
</redirdev>
<redirdev bus='usb' type='spicevmc'>
<address type='usb' bus='0' port='2'/>
</redirdev>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</memballoon>
</devices>
</domain>
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
创建虚拟机: [root@localhost ~]# virsh define /etc/libvirt/qemu/vm2.xml
使用virt-manager进入到虚拟机管理界面,启动虚拟机
# 清理环境:卸载KVM
[root@qfedu.com \~]# yum remove `rpm -qa | egrep 'qemu|virt|KVM'` -y
[root@qfedu.com \~]# rm -rf /var/lib/libvirt /etc/libvirt/
2
3
# 网桥
桥接工作在 OSI 网络参考模型的第二层数据链路层,是一种以 MAC 地址来作为判断依据 来将网络划分成两个不同物理段的技术,其被广泛应用于早期的计算机网络当中。以太网是 一种共享网络传输介质的技术,在这种技术下,如果一台计算机发送数据的时候,在同一物 理网络介质上的计算机都需要接收,在接收后分析目的 MAC 地址,如果是属于目的 MAC 地址 和自己的 MAC 地址相同便进行封装提供给网络层,如果目的 MAC 地址不是自己的 MAC 地址, 那么就丢弃数据包。
现有一台能上网的物理服务器,服务器只有 1 张网卡能上外网,服务中虚拟化出很多太 kvm 虚拟机,现在需要配置 kvm 能够访问外网。 在服务器 linux 系统中添加 brctl 网桥 br0,将服务器网卡 2、所有 kvm 网卡全部添加到 br0 网桥中,实现共享网络。原来服务器网卡的 ip 地址,配置到 br0 网桥上面,实现远程管 理。