在CentOS 8服务器中安装和配置KVM
基于内核虚拟机的KVM,是一个FreeBSD和Linux内核模块,允许内核充当虚拟机管理程序。
从内核版本2.6.20开始,KVM合并为Linux内核主线。
使用KVM,我们可以轻松地在Linux机器中设置虚拟化环境,并部署各种客户操作系统,包括Linux,Windows,BSD,Mac OS和许多。
在本教程中,我们将研究如何在CentOS 8 Server Edition中安装和配置KVM。
准备工作
在安装KVM之前,请首先确保系统支持硬件虚拟化。
如果系统支持硬件虚拟化,请继续执行以下步骤。
在CentOS 8服务器中安装和配置KVM
出于本教程的目的,我将使用以下系统:
KVM Virtualization Server:
- OS - CentOS 8最小服务器(无GUI)
- IP地址:192.168.225.53/24
即使它在CentOS 8上测试,本教程也应该在RHEL 8上罚款。
在CentOS 8中安装KVM
注意:通过外出本教程给出的所有命令都应作为"root"用户运行。
如果我们以普通用户身份登录,请在以下所有命令的所有命令的前面添加"sudo"。
安装KVM和所有必需的依赖项,使用命令作为"root"用户在CentOS 8 SECT上设置虚拟化环境:
# dnf install qemu-kvm libvirt virt-install
其中
- EMU-KVM - QEMU Metapackage用于KVM支持(即QEMU在X86硬件上完全虚拟化),
- libvirt - LibVirt库的程序,
- right-install - 创建和克隆虚拟机的程序。
安装KVM后,启用和启动LibvertD服务(如果尚未启动):
# systemctl enable libvirtd
# systemctl start libvirtd
我们还可以组合两个命令并将它们运行为如下面的单线:
# systemctl enable --now libvirtd
使用命令检查libvirtd service的状态:
# systemctl status libvirtd
示例输出:
● libvirtd.service - Virtualization daemon Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enable> Active: active (running) since Wed 2017-07-15 14:27:32 IST; 5s ago Docs: man:libvirtd(8) https://libvirt.org Main PID: 1097 (libvirtd) Tasks: 17 (limit: 32768) Memory: 57.0M CGroup: /system.slice/libvirtd.service └─1097 /usr/sbin/libvirtd May 15 14:27:28 centos8.theitroad.lan systemd[1]: Starting Virtualization daemon... May 15 14:27:32 centos8.theitroad.lan systemd[1]: Started Virtualization daemon.
libvertd服务已启动并运行!
验证是否已加载KVM模块:
# lsmod | grep kvm
示例输出:
kvm_intel 294912 0 kvm 786432 1 kvm_intel irqbypass 16384 1 kvm
伟大的!加载KVM模块。
让我们现在创建一个网络桥梁。
设置桥联网与kvm在centos
桥接网络与其他VM共享主计算机的真实网络接口以连接到外部网络。
因此,每个VM都可以直接绑定到任何可用的IPv4或者IPv6地址,就像物理计算机一样。
默认情况下,kvm设置私有虚拟桥,使所有VM可以在主机中彼此通信。
它提供了自己的子网和DHCP来配置Guest网络,并使用NAT访问主机网络。
使用"IP"命令查看KVM默认虚拟接口的IP地址:
# ip a
示例输出:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:b7:3a:84 brd ff:ff:ff:ff:ff:ff inet 192.168.225.52/24 brd 192.168.225.255 scope global dynamic noprefixroute enp0s3 valid_lft 42217sec preferred_lft 42217sec inet6 2409:4072:918:98cf:ad3b:b969:8ec8:f9c7/64 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::b404:4d52:8bee:18bf/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff 4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:41:91:4d brd ff:ff:ff:ff:ff:ff 5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 52:54:00:5b:a4:cd brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 6: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN group default qlen 1000 link/ether 52:54:00:5b:a4:cd brd ff:ff:ff:ff:ff:ff
如我们所见,KVM默认网络Virbr0使用192.168.122.1/24 IP地址。
所有VM都将在192.168.122.0/24 IP范围内使用IP地址,并且在192.168.122.1中将可以访问主机操作系统。
我们应该能够从客户机操作系统内部(192.168.122.1)中的主机操作系统(在192.168.122.1)中,并使用SCP来回复制文件。
如果我们只访问主机本身内部的VMS,则可以。
但是,我们无法从网络中的其他远程系统访问VM。
因为他们在我的情况下使用不同的IP范围:192.168.225.0/24.
要从其他远程主机访问VM,必须设置在主机网络上运行的公用桥,并使用主机网络上的外部DHCP服务器。
要将其放在Layman条款中,我们将使所有VMS使用主机系统使用的相同IP系列。
在设置公共桥接网络之前,我们应该禁用NetFilter以获得性能和安全原因。
默认情况下,目前在桥梁上启用NetFilter。
要禁用NetFilter,请创建一个名为/etc/sysctl.d/bridge.conf的文件:
# vi /etc/sysctl.d/bridge.conf
添加以下行:
net.bridge.bridge-nf-call-ip6tables=0 net.bridge.bridge-nf-call-iptables=0 net.bridge.bridge-nf-call-arptables=0
保存并关闭文件。
然后创建一个名为/etc/udev/rules.d/99-bridge.rules的文件:
# vi /etc/udev/rules.d/99-bridge.rules
添加以下行:
ACTION=="add", SUBSYSTEM=="module", KERNEL=="br_netfilter", RUN+="/sbin/sysctl -p /etc/sysctl.d/bridge.conf"
这将设置必要的标志,以在系统启动中适当的位置禁用网桥上的NetFilter。
保存并关闭文件。
重新启动系统以生效这些更改。
接下来,我们应该禁用KVM为其安装的默认网络。
使用"IP链接"命令查找KVM默认网络接口的名称:
# ip link
示例输出:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:b7:3a:84 brd ff:ff:ff:ff:ff:ff 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff 4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:41:91:4d brd ff:ff:ff:ff:ff:ff 5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000 link/ether 52:54:00:5b:a4:cd brd ff:ff:ff:ff:ff:ff 6: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN mode DEFAULT group default qlen 1000 link/ether 52:54:00:5b:a4:cd brd ff:ff:ff:ff:ff:ff
正如我们在上面的输出中看到的,条目"Virbr0"和"Virbr0-NIC"是KVM网络。
让我们使用命令删除默认的KVM网络:
# virsh net-destroy default
示例输出:
Network default destroyed
unefine使用命令的默认网络:
# virsh net-undefine default
示例输出:
Network default has been undefined
如果上面的命令没有任何原因工作,则可以使用这些命令禁用和拒绝kvm默认网络:
# ip link delete virbr0 type bridge
# ip link delete virbr0-nic
现在再次运行"IP链接"以验证virbr0和virbr0-nic接口是否实际删除:
# ip link
示例输出:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:b7:3a:84 brd ff:ff:ff:ff:ff:ff 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff 4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:41:91:4d brd ff:ff:ff:ff:ff:ff
嗯,KVM默认网络已经消失。
现在,让我们在创建新VM时设置KVM公共桥使用。
使用"nmcli"命令创建名为"br0"的新桥接界面:
# nmcli connection add type bridge autoconnect yes con-name br0 ifname br0
设置桥接界面的IP地址:
# nmcli connection modify br0 ipv4.addresses 192.168.225.53/24 ipv4.method manual
设置桥接界面的网关:
# nmcli connection modify br0 ipv4.gateway 192.168.225.1
为桥接接口设置DNS:
# nmcli connection modify br0 ipv4.dns 192.168.225.1
接下来,我们需要删除一个网络接口卡并将其添加为桥接器。
请注意,如果服务器只有一个NIC并且我们正在通过SSH访问服务器,则在删除NIC后将终止连接。
我建议我们在服务器的控制台中执行以下步骤。
例如,我将添加"ENP0S8"接口作为从站到桥接接口BR0。
要删除网络接口"ENP0S8",请运行:
# nmcli connection del enp0s8
用自己的网卡替换"ENP0S8"。
说明:
不要为桥使用无线网络接口卡。
大多数无线互通都不支持桥接。
始终使用有线网络接口进行无缝连接!
接下来,使用命令将"enp0s8"添加到桥梁:
# nmcli connection add type bridge-slave autoconnect yes con-name enp0s8 ifname enp0s8 master br0
其中桥接网络接口"BR0"添加到主机的网络接口"ENP0S8"。
替换与网络匹配的上述网络接口名称。
重新启动网络管理器以生效更改:
# systemctl restart NetworkManager
如果可能,最好重新启动系统:
# reboot
登录服务器并检查IP地址是否已分配给桥接界面:
$ip a
示例输出:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s3: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000 link/ether 08:00:27:b7:3a:84 brd ff:ff:ff:ff:ff:ff 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000 link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff 4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:41:91:4d brd ff:ff:ff:ff:ff:ff 5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff inet 192.168.225.53/24 brd 192.168.225.255 scope global noprefixroute br0 valid_lft forever preferred_lft forever inet6 2409:4072:6084:198:df03:d9ed:62eb:df34/64 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::e8c8:e98b:7fef:5874/64 scope link noprefixroute valid_lft forever preferred_lft forever
如上所述,桥接网络接口BR0分配了IP地址192.168.225.53,ENP0S8目前现在具有"Master BR0"条目。
这意味着ENP0S8属于桥梁。
我们还可以使用"桥接"命令来显示桥接状态:
# bridge link show br0 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 100
我们已成功创建了桥接界面,它处于活动状态。
我们需要做最后一件事。
我们应该将KVM配置为使用此桥接接口作为默认接口。
为此,创建一个名为host-bridge.xml的XML文件:
# vi host-bridge.xml
添加以下行:
<network> <name>host-bridge</name> <forward mode="bridge" <bridge name="br0" </network>
运行以下命令以启动新创建的桥梁,并使它作为VM的默认网桥:
# virsh net-define host-bridge.xml
# virsh net-start host-bridge
# virsh net-autostart host-bridge
验证桥是否处于活动状态并使用命令启动:
# virsh net-list --all
示例输出:
Name State Autostart Persistent ----------------------------------------------- host-bridge active yes yes
恭喜!我们在CentOS 8无鼠键显示器服务器中安装和配置了KVM。