arch linux ARM KVM虚拟化

我尝试在 ARM Atlas 架构的 Asahi Linux 上构建ARM虚拟化:

备注

arch linux: QEMUarch linux: KVM 的资料都是围绕 X86_64 架构的,需要整理和汇总ARM架构信息。

Asahi Linux 安装虚拟化(挫折)

  • 使用 Pacman 搜索QEMU软件工具:

    pacman -Ss qemu
    

可以看到:

extra/qemu-base 7.0.0-12
    A basic QEMU setup for headless environments

备注

直接执行 pacman -S qemu 会提示你选择3种安装之一:

1) qemu-base  2) qemu-desktop  3) qemu-full
  • 安装 qemu-base

    pacman -S qemu-base
    

对于ARM架构,会有一些提示错误:

resolving dependencies...
warning: cannot resolve "libbpf.so=0-64", a dependency of "qemu-system-x86"
warning: cannot resolve "edk2-ovmf", a dependency of "qemu-system-x86"
warning: cannot resolve "seabios", a dependency of "qemu-system-x86"
warning: cannot resolve "qemu-system-x86", a dependency of "qemu-base"
:: The following package cannot be upgraded due to unresolvable dependencies:
      qemu-base
  • 安装 qemu-system-aarch64

    pacman -S qemu-system-aarch64
    

报错:

resolving dependencies...
warning: cannot resolve "libbpf.so=0-64", a dependency of "qemu-system-aarch64"
warning: cannot resolve "edk2-armvirt", a dependency of "qemu-system-aarch64"
:: The following package cannot be upgraded due to unresolvable dependencies:
      qemu-system-aarch64
  • 安装 qemu-system-aarch64

    pacman -S ovmf-aarch64
    

报错:

error: target not found: ovmf-aarch64

参考 QEMU for Apple Silicon: Roadmap? edk2-armvirt? 目前社区还没有解决,原因是上游QEMU软件包分成多个,目前打包依赖没有解决。

源代码编译安装qemu+ovmf(可能存在问题)

由于直接从经过一番折腾,我基本完成 编译QEMU+OVMF(ARM架构) 。原本以为曙光就在眼前,但是没有想到 qemu 程序运行安装程序始终无法出现安装界面,而且 qemu-system-aarch64 进程会100%消耗CPU资源。我无法解决这个问题,虽然整个折腾过程对qemu和libvirt有了更多了解,但是我还是没有解决在 aarch64 架构下的运行。

所以我改回到 “强制方式安装仓库提供的qemu”

强制方式安装仓库提供的qemu并补全依赖

在arch linux上安装edk2-armvirt软件依赖包
sudo pacman -U --noconfirm edk2-armvirt-202208-3-any.pkg.tar.zst
  • 实际上系统已经安装了 libbpf-1.0.1-1 但是版本高于 qemu-system-aarch64 的依赖,所以下面还需要手工编译安装低版本 libbpf (见下文)

  • 然后强制安装(忽略倚赖):

强制安装qemu-system-aarch64忽略依赖(依赖需要手工修复)
sudo pacman -Sd qemu-system-aarch64

不过,实际上还是存在依赖问题,也就是 qemu-system-aarch64 的库依赖错误:

qemu-system-aarch64 --help

提示:

qemu-system-aarch64: error while loading shared libraries: libbpf.so.0: cannot open shared object file: No such file or directory

这个 libbpf.so.0 是低版本 libbpf ,但是当前系统已经采用了 libbpf-1 ,需要再安装一个低版本

libbpf release 下载一个低版本 libbpf-0.6.1.tar.gz 进行编译安装:

编译安装低版本libbpf-0.6.1
tar xfz libbpf-0.6.1.tar.gz
cd libbpf-0.6.1
cd src
make
sudo cp libbpf.so.0.6.0 /usr/lib/
sudo ln -s /usr/lib/libbpf.so.0.6.0 /usr/lib/libbpf.so.0

这样就能够正常运行 qemu-system-aarch64

备注

折腾差不多3天了,兜兜转转,尝试了各种方法,从源代码编译到绕过软件包安装依赖(手工编译补齐),终于能够正常在 Apple ARM架构芯片M1 ProAsahi Linux 上运行虚拟机了…唏嘘

安装libvirt

在arch linux上安装libvirt以及支持网络连接的软件包
# 安装libvirt
pacman -S libvirt

# 安装支持NAT/DHCP网络组件(iptables-nft和iptables冲突,移除iptables)
pacman -S iptables-nft dnsmasq dmidecode

# 安装bridged网络支持
pacman -S bridge-utils

# 安装virt-install方便安装OS
pacman -S virt-install

# (可选)支持SSH远程管理组件
pacman -S openbsd-netcat
  • 启动libvirt服务:

在arch linux上启动libvirtd
# 启动libvirtd
systemctl start libvirtd

# 激活操作系统启动时启动libvirtd
systemctl enable libvirtd

备注

ARM环境KVM快速起步 采用了基于Debian的 Raspberry Pi Atlas 操作系统,可以无需 编译QEMU+OVMF(ARM架构) ,使用更为方便

启动安装

按照 移动云架构 规划进行磁盘的划分

virsh创建虚拟机的LVM卷磁盘
virsh vol-create-as images_lvm a-b-data-1 12G
virsh vol-create-as images_lvm a-b-data-1-store 55G
virsh vol-create-as images_lvm a-b-data-2 12G
virsh vol-create-as images_lvm a-b-data-2-store 55G
virsh vol-create-as images_lvm a-b-data-3 12G
virsh vol-create-as images_lvm a-b-data-3-store 55G
virt-install通过–location参数在线安装ARM版本Fedora,使用官方安装源
# ARM架构磁盘参数可能不能使用 cache=none,io=native
virt-install \
  --network bridge:virbr0 \
  --name a-b-data-1 \
  --ram=6144 \
  --vcpus=2 \
  --arch aarch64 \
  --boot uefi \
  --disk path=/dev/vg-libvirt/a-b-data-1,sparse=false,format=raw,bus=virtio \
  --disk path=/dev/vg-libvirt/a-b-data-1-store,sparse=false,format=raw,bus=virtio \
  --graphics none \
  --location=https://dl.fedoraproject.org/pub/fedora/linux/releases/37/Server/aarch64/os/ \
  --extra-args="console=tty0 console=ttyS0,115200"

这里需要使用官方源,不知道为何163镜像网站无法执行安装(应该缺少了同步内容)

备注

之前的折腾( 编译QEMU+OVMF(ARM架构) )还是存在缺陷的,我原本以为是安装iso的问题,折腾了好久 iso镜像使用location参数进行virt-install安装虚拟机 ,但最终还是采用上文 Arch Linux ARM官方仓库的软件包为主(忽略依赖强制安装),然后通过源代码编译补齐 libbpf 低版本依赖来解决。

上述在线安装能够正常启动安装过程,但是出现一个报错:

[   11.180807 ] dracut-initqueue[1040]: Warning: can't find installer main image path in .treeinfo
[   11.216388 ] dracut-initqueue[1164]:   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
[   11.216749 ] dracut-initqueue[1164]:                                  Dload  Upload   Total   Spent    Left  Speed

所以我改为从iso安装,方法借鉴 iso镜像使用location参数进行virt-install安装虚拟机 :

virt-install通过–location参数使用iso镜像安装ARM版本Fedora,必须使用io=threads
#ARM64架构虚拟磁盘可能不能使用 cache=none,io=native
#但是如果不加参数,则默认就是 cache=none,io=native 导致无法写入磁盘
#所以改为另一种常用模式 io=threads

host="a-b-data-1"

virt-install \
  --network bridge:virbr0 \
  --name ${host} \
  --ram=6144 \
  --vcpus=2 \
  --arch aarch64 \
  --boot uefi \
  --disk path=/dev/vg-libvirt/${host},format=raw,bus=virtio,cache=writeback,io=threads \
  --disk path=/dev/vg-libvirt/${host}-store,format=raw,bus=virtio,cache=writeback,io=threads \
  --cdrom=/var/lib/libvirt/images/Fedora-Server-dvd-aarch64-37-1.7.iso

备注

我这里遇到一个安装过程中磁盘无法写入异常,通过 排查ARM虚拟机磁盘异常 发现和虚拟机磁盘参数 io=native 相关,所以改为 io=threads 可以绕过这个问题。

这里我采用 --graphics vnc 会提示错误:

ERROR    unsupported configuration: domain configuration does not support video model 'virtio'

非常奇怪,我只在 --disk 指定了 virtio ;而且也不能使用 --graphics spice 。所以我最终取消掉图形指定才启动安装。 此时可以看到字符终端界面

开始 Install Fedora 37 流程之后,会提示提供两种安装模式:

Starting installer, one moment...
anaconda 37.12.6-1.fc37 for Fedora 37 started.
 * installation log files are stored in /tmp during the installation
 * shell is available on TTY2 and in second TMUX pane (ctrl+b, then press 2)
 * when reporting a bug add logs from /tmp as separate text/plain attachments

X or window manager startup failed, falling back to text mode.
================================================================================
================================================================================
X was unable to start on your machine. Would you like to start VNC to connect to
this computer from another computer and perform a graphical installation or
continue with a text mode installation?

1) Start VNC
2) Use text mode

Please make a selection from the above ['c' to continue, 'h' to help, 'q' to
quit, 'r' to refresh]:

为方便操作,采用VNC( pacman -S tigervnc ),使用 vncviewer 连接虚拟机的VNC地址 192.168.122.109:1 ,终于能够看到久违的安装界面了: 交互安装过程 Fedora 37 Server安装

磁盘无法写入的折腾

原本松了一口气,但是没想到 Fedora 37 Server安装 配置完成开始安装,却发生虚拟机磁盘无法写入的异常,尝试多次都同样报错。

排查ARM虚拟机磁盘异常 :

  • 使用 virt-builder快速构建VM工具 构建本地Fedora37虚拟机镜像(最终实际采用官方虚拟机raw镜像),采用简化配置方式能够正常运行KVM虚拟机

  • 对比官方镜像运行虚拟机的磁盘参数和我沿X86虚拟化的磁盘参数,反复验证定位出 io=native 参数导致磁盘无法写入

  • 修订 virt-install 参数,将磁盘参数改为 io=threads 解决磁盘写入问题(上文安装参数已修订正确)

配置虚拟机自动启动

由于 移动云计算部署Ceph 是所有上层KVM虚拟机的运行基础,所以 配置虚拟机自动启动 :

配置ceph的虚拟机自动启动
for i in 1..3;do sudo virsh autostart a-b-data-${i};done

参考