在 CentOS 8 服务器上安装和配置 KVM

本分步指南解释了什么是 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
使用 ip 命令查看 KVM 默认虚拟接口 IP 地址

可以看到,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
在 CentOS 中使用 ip 命令查看 KVM 默认网络接口

正如您在上面的输出中看到的,条目 virbr0virbr0-nic 是 KVM 网络。

让我们使用以下命令删除默认的 KVM 网络:

# virsh net-destroy default

样本输出:

Network default destroyed

使用命令取消定义默认网络:

# virsh net-undefine default

样本输出:

Network default has been undefined
使用 virsh 命令删除默认 KVM 网络接口使用 virsh 命令删除默认 KVM 网络接口

如果上述命令由于任何原因不起作用,您可以使用这些命令禁用和取消定义 KVM 默认网络:

# ip link delete virbr0 type bridge
# ip link delete virbr0-nic

现在运行 ip link 再次验证是否 virbr0virbr0-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
在 Linux 中从命令行检查 KVM 网桥 IP 地址在 Linux 中从命令行检查 KVM 网桥 IP 地址

正如您在上面的输出中看到的,桥接网络接口 br0 分配有 IP 地址 192.168.225.53enp0s8 条目现在有 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
将 KVM 配置为使用桥接接口作为所有 VM 的默认接口将 KVM 配置为使用桥接接口作为所有 VM 的默认接口

验证网桥是否处于活动状态并使用命令启动:

# virsh net-list --all

样本输出:

Name          State    Autostart   Persistent
------------------------------------------------
 host-bridge   active   yes         yes
使用 virsh 命令验证 KVM 主机桥状态使用 virsh 命令验证 KVM 主机桥状态

恭喜! 我们已经在 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 服务器中拥有完全工作的虚拟化环境。

资源: