本分步指南解释了什么是 KVM,以及如何在 CentOS 8 Linux 操作系统中安装和配置 KVM。
本指南在 CentOS 8 最小服务器版中正式测试。 但是,它也应该在 RHEL 8 及其克隆版本(如 AlmaLinux 8 和 Rocky Linux 8)中工作。
什么是 KVM?
虚拟机, 短缺 ķ基于内核的 五虚拟的 米achine,是一个 FreeBSD 和 Linux 内核模块,它允许内核充当管理程序。
从内核版本 2.6.20 开始,KVM 并入 Linux 内核主线。
使用 KVM,您可以轻松地在 Linux 机器中设置虚拟化环境并部署广泛的客户操作系统,包括 Linux、Windows、BSD、Mac OS 等等。
现在让我们看看如何在 CentOS 8 Linux 中安装和配置 KVM。
先决条件
在安装 KVM 之前,首先要确保您的系统支持硬件虚拟化。 我们在以下指南中记录了几种不同的方法来确定 Linux 系统是否支持虚拟化。
- 如何确定 CPU 是否支持虚拟化技术 (VT)
如果您的系统支持硬件虚拟化,请继续以下步骤。
1.在CentOS 8服务器上安装和配置KVM
出于本指南的目的,我将使用以下系统:
KVM虚拟化服务器:
- 操作系统 – CentOS 8 最小服务器(无 GUI)
- IP地址 : 192.168.225.53/24
即使它在 CentOS 8 上进行了测试,本指南也应该在 RHEL 8 上运行良好。
1.1。 在 CentOS 8 中安装 KVM
笔记: 本教程中给出的所有命令都应运行为 root
用户。 如果您以普通用户身份登录,请添加 sudo
在所有命令的前面给出下面。
使用以下命令安装 Kvm 和所有必需的依赖项以在 CentOS 8 服务器上设置虚拟化环境 root
用户:
# dnf install qemu-kvm libvirt virt-install
这里,
- emu-kvm – 用于 KVM 支持的 QEMU 元数据包(即 x86 硬件上的 QEMU 完全虚拟化),
- libvirt – libvirt 库的程序,
- 虚拟安装 – 创建和克隆虚拟机的程序。
安装 KVM 后,启用并启动 libvertd
服务(如果尚未启动):
# systemctl enable libvirtd
# systemctl start libvirtd
您还可以组合这两个命令并将它们作为单行运行,如下所示:
# systemctl enable --now libvirtd
使用命令检查 libvirtd 服务的状态:
# systemctl status libvirtd
样本输出:
● libvirtd.service - Virtualization daemon Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enable> Active: active (running) since Wed 2020-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 Jul 15 14:27:28 centos8.ostechnix.lan systemd[1]: Starting Virtualization daemon... Jul 15 14:27:32 centos8.ostechnix.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 模块已加载。 现在让我们创建一个网桥。
1.2. 在 CentOS 中使用 KVM 设置桥接网络
一种 桥接网络 与其他VM共享主机的真实网络接口以连接到外部网络。 因此,每个 VM 都可以直接绑定到任何可用的 IPv4
或者 IPv6
地址,就像物理计算机一样。
默认情况下,KVM 设置了一个私有虚拟网桥,以便所有 VM 都可以在主机内相互通信。
它提供自己的子网和 DHCP 来配置来宾网络,并使用 NAT 访问主机网络。
查看 KVM 默认虚拟接口的 IP 地址,使用 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地址。 所有虚拟机都将使用一个 IP 地址 192.168.122.0/24
IP 范围和主机操作系统将在 192.168.122.1
.
您应该能够 ssh 进入主机操作系统(在 192.168.122.1
) 从来宾操作系统内部并使用 scp
来回复制文件。
如果您只从主机本身访问内部的虚拟机,那是可以的。 但是,您无法从网络中的其他远程系统访问虚拟机。
因为他们使用不同的IP范围,即 192.168.225.0/24
就我而言。 为了从其他远程主机访问虚拟机,我们必须设置一个在主机网络上运行的公共网桥,并使用主机网络上的任何外部 DHCP 服务器。
通俗地说,我们将让所有 VM 使用主机系统使用的相同 IP 系列。
在设置公共桥接网络之前,我们应该禁用 网络过滤器 为了 性能和安全原因. 默认情况下,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
Save 和 close 文件。
然后创建另一个名为 /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。 Save 和 close 文件。 重新启动系统 使这些更改生效。
接下来,我们应该禁用 KVM 为自己安装的默认网络。
使用“ip link”命令查找 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
使用命令取消定义默认网络:
# virsh net-undefine default
样本输出:
Network default has been undefined

如果上述命令由于任何原因不起作用,您可以使用这些命令禁用和取消定义 KVM 默认网络:
# ip link delete virbr0 type bridge
# ip link delete virbr0-nic
现在运行 ip link
再次验证是否 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 默认网络已经不存在了。
现在,让我们设置 KVM 公共桥以在创建新 VM 时使用。
创建一个名为的新桥接接口 br0
使用 nmcli
命令:
# 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
接下来,我们需要移除您的一个网络接口卡并将其作为从属添加到网桥。
请注意,如果您的服务器只有一个网卡,并且您通过 SSH 访问服务器,则您的连接将在移除网卡后终止。 我建议您在服务器的控制台中执行以下步骤。
为了 example我要补充 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
显示网桥状态的命令:
# bridge link show br0 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 100
我们已经成功创建了一个桥接接口,并且它处于活动状态。 我们需要做最后一件事。
我们应该配置 KVM 使用这个桥接接口作为默认接口。 为此,创建一个 XML
文件名为 host-bridge.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。
2. 创建和管理 KVM 来宾机器
我们可以从命令行或使用任何 KVM 管理工具(如 Cockpit 和 Virt-manager)创建和管理 VM。 有关详细信息,请参阅以下指南。
- 如何使用 Virsh 程序管理 KVM 虚拟机
- 使用 Cockpit Web 控制台管理 KVM 虚拟机
- 如何使用 Virt-Manager 管理 KVM 虚拟机
3. 为虚拟机启用 Virsh 控制台访问
创建 KVM 来宾后,我可以通过 SSH、VNC 客户端、Virt-viewer、Virt-manager 和 Cockpit Web 控制台等访问它们。但我无法使用 virsh console
命令。 要使用“virsh 控制台”访问 KVM 来宾,请参阅以下指南:
- 如何为 KVM 来宾启用 Virsh 控制台访问
结论
在本指南中,我们讨论了如何在 CentOS 8 服务器版中安装和配置 KVM。
我们还研究了如何使用命令行从命令行创建和管理 KVM 虚拟机 virsh
工具并使用名为 Cockpit 和 Virt-manager 的 GUI 工具。
最后,我们看到了如何为 KVM 虚拟机启用 virsh 控制台访问。
在这个阶段,您应该在您的 CentOS 8 服务器中拥有完全工作的虚拟化环境。
资源: