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

[ad_1]

本分步指南解释了什么是 KVM,以及如何在 CentOS 8 Linux 操作系统中安装和配置 KVM。

本指南已在 CentOS 8 最小服务器版中正式测试。 但是,它也应该适用于 RHEL 8 及其克隆版本,如 AlmaLinux 8 和 Rocky Linux 8。

内容

  1. 什么是KVM?
  2. 先决条件
  3. 一、在CentOS 8服务器中安装和配置KVM
    1. 1.1. 在 CentOS 8 中安装 KVM
    2. 1.2. 在 CentOS 中使用 KVM 设置桥接网络
  4. 2. 创建和管理 KVM 来宾机器
  5. 3. 为虚拟机启用 Virsh 控制台访问
    1. 此博客上的其他 KVM 相关指南
      1. 结论

什么是KVM?

KVM, 短缺 基于内核的 虚拟的 achine 是一个 FreeBSD 和 Linux 内核模块,它允许内核充当管理程序。

从内核版本 2.6.20 开始,KVM 被合并到 Linux 内核主线中。

使用 KVM,您可以轻松地在 Linux 机器中设置虚拟化环境,并部署广泛的客户操作系统,包括 Linux、Windows、BSD、Mac OS 等。

现在让我们看看如何在 CentOS 8 Linux 中安装和配置 KVM。

先决条件

在安装 KVM 之前,首先要确保您的系统支持硬件虚拟化。 我们在以下指南中记录了几种不同的方法来确定 Linux 系统是否支持虚拟化。

  • 如何查找 CPU 是否支持虚拟化技术 (VT)

如果您的系统支持硬件虚拟化,请继续以下步骤。

一、在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 库的程序,
  • 虚拟安装 – 创建和克隆虚拟机的程序。

安装 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 都可以直接绑定到任何可用的 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 来回复制文件。

如果您只从主机本身访问内部的 VM,那也没关系。 但是,您无法从网络中的其他远程系统访问 VM。

因为他们使用不同的 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

接下来,我们需要移除您的一张网络接口卡并将其作为从属设备添加到网桥。

请注意,如果您的服务器只有一个 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
在 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>

运行以下命令以启动新创建的网桥并使其成为虚拟机的默认网桥:

# 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 控制台访问
  • 在 Ubuntu 20.04 Headless Server 中安装和配置 KVM
  • 在 OpenSUSE Tumbleweed 中安装和配置 KVM
  • 在 Linux 中使用 Qcow2 镜像创建 KVM 虚拟机
  • 如何在 Linux 中将 Virtualbox VM 迁移到 KVM VM
  • 在 Linux 中为 KVM 虚拟机启用 UEFI 支持
  • 如何在 Linux 中的 KVM 中启用嵌套虚拟化
  • 在 Linux 中使用 Virt-top 显示虚拟化系统统计信息
  • 如何查找 KVM 虚拟机的 IP 地址
  • 如何重命名 KVM 来宾虚拟机
  • 使用 Libguestfs 访问和修改虚拟机磁盘映像
  • 使用 Virt-builder 快速构建虚拟机镜像
  • 如何使用 Virt-rescue 来拯救虚拟机
  • 如何在 Linux 中扩展 KVM 虚拟机磁盘大小
  • 在 KVM 主机和来宾之间设置共享文件夹
  • 如何更改 KVM Libvirt 默认存储池位置
  • [Solved] 无法访问存储文件,KVM Libvirt 中的权限被拒绝错误

结论

在本指南中,我们讨论了如何在 CentOS 8 服务器版中安装和配置 KVM。

我们还研究了如何使用命令行创建和管理 KVM 虚拟机 virsh 工具并使用名为 Cockpit 和 Virt-manager 的 GUI 工具。

最后,我们看到了如何为 KVM 虚拟机启用 virsh 控制台访问。

在这个阶段,您的 CentOS 8 服务器中应该有完全工作的虚拟化环境。

资源:

  • KVM网站

CentOSCentOS 8配置KVM安装基于KVM内核的虚拟机KVMLinuxLinux管理管理KVM虚拟机RHELRHEL 8虚拟化

[ad_2]

Related Posts