系统运维丨如何在AlmaLinux 9上安装KVM

539 阅读7分钟

KVM 是 内核虚拟机Kernel Virtualization Machine 的简称,是一个为 Linux 内核设计的开源虚拟化平台。它是一种 1 类管理程序,或通常称为裸机管理程序。它允许用户创建和管理多台客户机,这些可以在 Linux 或 Windows 操作系统中创建。
与大多数虚拟化平台一样,它将硬件资源(如 CPU、内存、存储、网络、图形等)抽象化,并将它们分配给独立于宿主机运行的客户机。

前置条件

  • 预装 Rocky Linux 9 / AlmaLinux 9
  • 具有管理员权限的 sudo 用户
  • 互联网连接

验证是否启用硬件虚拟化

首先,你需要验证你的系统是否启用了虚拟化功能。在大多数现代系统上,此功能已在 BIOS 中启用。
cat /proc/cpuinfo | egrep "vmx|svm"

该命令探测是否存在 VMX(虚拟机扩展Virtual Machine Extension),它是英特尔硬件虚拟化的 CPU 标志,或 SVM,它是 AMD 硬件虚拟化的标志。

从以下输出中可以看到我们的系统启用了英特尔硬件虚拟化:

image.png

安装KVM和管理工具

确保启用虚拟化后,下一步就是安装 KVM 和管理工具。为此,请运行以下 dnf 命令。

sudo dnf install qemu-kvm virt-manager libvirt virt-install virt-viewer virt-top bridge-utils  bridge-utils virt-top libguestfs-tools -y

安装完成后,运行以下命令检查是否已加载所需的 KVM 模块。

lsmod | grep kvm

以下输出以确认已加载必要的模块

image.png

启动并启用 libvirtd 守护进程

在下一步中,一定要启动 libvirtd 守护进程。这是一个服务器端守护程序组件,可在虚拟化的客户机上运行和管理任务。它用于管理虚拟化技术,例如 Xen、KVM 和 ESXi 等等。

要启动 libvirtd 守护进程,请运行以下命令:

sudo systemctl start libvirtd

请务必启用该服务以在引导时启动:

sudo systemctl enable --now libvirtd

验证 libvirtd 守护进程是否正在运行,如下所示:

sudo systemctl status libvirtd

image.png

设置桥接接口

到目前为止,我们已经安装了 KVM 和所有管理工具,事实上,我们可以继续启动虚拟机。但是,如果我们可以从管理程序网络外部访问虚拟机,那就太好了。为此,我们需要创建一个桥接接口。

确定系统上的网络接口:

sudo nmcli connection show

image.png
从输出来看,eno1 是活动的网络接口,请务必确认输出内容中的接口。

确定之后,参考一下步骤创建网桥

1. 使用以下语法用其 UUID 删除连接

sudo nmcli connection delete UUID

在我们的例子中,命令将是:

sudo nmcli connection delete 2f5a3848-b5ae-401f-9085-f48640b342fa

执行删除时候,确认提示删除成功

2. 创建桥接接口

在继续进行之前,准备好以下详细信息:

  • 网桥名称 – 新网桥的首选名称(例如 br1
  • 设备名称 – 这是你的网络接口的名称。它将作为网桥的从属设备(例如,eno1
    IP地址/子网 – 桥接网络的 IP 地址和子网(例如 192.168.0.168/24)。请注意,这应该与你的网络子网和 IP 地址相对应。
  • 网关 – 你网络的默认网关地址(例如 192.168.0.1
  • DNS1 和 DNS2 – 首选 DNS 地址(例如 8.8.8.8 和 8.8.4.4

使用以下语法创建一个新的桥接接口

sudo nmcli connection add type bridge autoconnect yes con-name BRIDGE NAME ifname BRIDGE NAME

在我们的例子中,br1 是首选的网桥接口名称。因此,命令如下所示:

sudo nmcli connection add type bridge autoconnect yes con-name br1 ifname br1

指定 IP 子网、网关和 DNS 值来修改网桥
首先使用以下语法指定 IP 子网:

sudo nmcli connection modify BRIDGE NAME ipv4.addresses IP ADDRESS/SUBNET ipv4.method manual

根据我们的设置,命令将是:

sudo nmcli connection modify br1 ipv4.addresses 192.168.0.168/24 ipv4.method manual

接下来,使用以下语法指定网关地址:

sudo nmcli connection modify BRIDGE NAME ipv4.gateway GATEWAY

根据我们的网络,该命令采用以下格式:

sudo nmcli connection modify br1 ipv4.gateway 192.168.0.1

DNS 地址的语法如下:

sudo nmcli connection modify BRIDGE NAME ipv4.dns DNS1 +ipv4.dns DNS2

该命令采用以下格式:

sudo nmcli connection modify br1 ipv4.dns 8.8.8.8 +ipv4.dns 8.8.4.4  +ipv4.dns 223.5.5.5  +ipv4.dns 223.6.6.6

此后,使用以下命令添加网桥从属设备:

sudo nmcli connection add type bridge-slave autoconnect yes con-name DEVICE NAME ifname DEVICE NAME master BRIDGE NAME

使用我们的值,命令如图所示:

sudo nmcli connection add type bridge-slave autoconnect yes con-name eno1 ifname eno1 master br1

你将收到确认信息,表明已成功添加网桥从属设备。请记住,桥接从属设备是你的网络接口或适配器。
经验证,在第一步不删除网络的情况下,可执行下面的命令进行修改:
sudo nmcli connection modify eno1 type bridge-slave autoconnect yes master br1

要确认网桥已创建,请运行以下命令:

sudo nmcli connection show

image.png
从输出中,你可以看到列出了网桥接口。激要活它,请运行以下命令:

sudo nmcli connection up br1

你将收到确认信息,此外,你可以使用 ip addr 命令验证:

ip addr | grep br1

image.png 最后,编辑网桥配置文件:

sudo vi /etc/qemu-kvm/bridge.conf

添加以下行:
allow all
然后重新启动虚拟化守护进程以应用更改
sudo systemctl restart libvirtd

配置运行KVM

本人本地环境使用阿里云的alinux作为kvm,官方教程请参考:help.aliyun.com/zh/alinux/g…

下载系统镜像和引导镜像

本教程使用的系统镜像是aliyun_3.qcow2 准备好后,开始创建虚拟机配置文件,参考如下:

<domain type='kvm'>
    <name>master</name>
    <memory>4096576</memory><!-- 1 GB内存。 -->
    <vcpu>1</vcpu>
    <cpu mode='host-passthrough'><!-- 需要在对应架构的服务器上启动实例。 -->
    </cpu>
    <os>
        <type arch='x86_64'>hvm</type><!-- 如果是ARM64架构的服务器,则需设置为arch='aarch64'。 -->
        <boot dev='hd'/>
    </os>
    <clock sync="localtime"/>
    <on_poweroff>destroy</on_poweroff>
    <on_reboot>restart</on_reboot>
    <on_crash>restart</on_crash>
    <devices>
        <emulator>/usr/local/bin/qemu-kvm</emulator><!-- 请根据不同的操作系统设置对应的kvm路径。例如:Ubuntu对应的kvm路径是/usr/bin/kvm。 -->
        <disk type='file' device='disk'><!-- 请根据镜像格式设置下面的type参数:qcow2对应type='qcow2'、vhd对应type='vpc'。 -->
            <driver name='qemu' type='qcow2' cache='none' dataplane='off' io='native'/> <!-- 如果要创建qcow2快照,需要关闭dataplane。 -->
            <source file='/mnt/b/kvm/aliyun_3.qcow2'/> <!-- 填写Alibaba Cloud Linux 3镜像的绝对路径。 -->
            <target dev='vda' bus='virtio'/>
        </disk>
        <!-- 加入seed.img的信息。 -->
        <disk type='file' device='disk'>
            <driver name='qemu' type='raw'/>
            <source file='/mnt/b/kvm/seed.img'/> <!-- 填写seed镜像的绝对路径。 -->
            <target dev='vdb' bus='virtio'/>
        </disk>
        <interface type='bridge'>
            <source bridge='br1'/>
            <model type='virtio'/>
        </interface>
        <console type='pty'>
            <target type='virtio' port='0'/>
        </console>
        <video>
            <model type='cirrus' vram='9216' heads='1'/>
            <alias name='video0'/>
        </video>
        <input type='tablet' bus='usb'/>
        <input type='mouse' bus='ps2'/>
        <graphics type='vnc' port='5901' autoport='no' listen='0.0.0.0'/>
    </devices>
</domain>

这里我文件命名为:master.xml
<graphics type='vnc' port='5901' autoport='no' listen='0.0.0.0'/> 这段配置一定要指定vnc端口号以及listen的地址,否则没有办法ssh连接

使用virsh定义配置

virsh define master.xml

启动虚拟机

virsh start rancher

通过下面的命令验证是否可以正常连接到kvm:
virsh list --all
输出以下信息表示可以正常连接:

image.png

连接虚拟机控制台

执行下面的命令连接到kvm控制台:
virsh console master
输出下面的信息后,按回车进行登录操作:

image.png

alinux系统默认的账号 > 用户名:alinux,密码:aliyun
进入系统后,可查看虚拟机的ip,使用此ip可以进行ssh连接,端口号映射到宿主机的22

至此,成功在AlmaLinux 9上安装KVM,当然还需要做其他系统配置优化,后面有时间再补充。


常见操作问题:

  1. 如何查看虚拟机地址?

virsh domifaddr master 这个命令需要网络配置才能生效,后续研究,通过下面的方法也可以获取:
1.virsh dumpxml master | grep mac 或者 virsh domiflist master 获取当前域的mac地址
2.arp -a | grep 'xx:xx:xx:xx:xx:xx' 获取当前域的IP地址

  1. 虚拟机无法通过ssh连接,报错:kvm No supported authentication methods available (server sent: publickey,gssapi-keyex,gssapi-with-mic)

通过virsh console master进入虚拟机
使用sudo cat /etc/ssh/sshd_config查看内容,确认PubkeyAuthentication yes未被注释,PasswordAuthentication yes配置正确。
如果你修改了目标服务器的 SSH 配置,请重启 SSH 服务以使更改生效。sudo systemctl restart sshd