arch linux ARM KVM虚拟化¶
我尝试在 ARM Atlas 架构的 Asahi Linux 上构建ARM虚拟化:
硬件: Apple ARM架构芯片M1 Pro MacBook Pro 2022
OS: Asahi Linux
备注
arch linux: QEMU 和 arch 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并补全依赖¶
edk2-armvirt 下载到本地安装:
sudo pacman -U --noconfirm edk2-armvirt-202208-3-any.pkg.tar.zst
实际上系统已经安装了
libbpf-1.0.1-1
但是版本高于qemu-system-aarch64
的依赖,所以下面还需要手工编译安装低版本libbpf
(见下文)然后强制安装(忽略倚赖):
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
进行编译安装:
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 Pro 的 Asahi Linux 上运行虚拟机了…唏嘘
安装libvirt¶
arch linux for arm软件仓库提供 Libvirt虚拟机管理器 安装;除了 Libvirt虚拟机管理器 和 QEMU /KVM (Hypervisor) 之外,还需要一些网络相关的组件:
# 安装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服务:
# 启动libvirtd
systemctl start libvirtd
# 激活操作系统启动时启动libvirtd
systemctl enable libvirtd
备注
在 ARM环境KVM快速起步 采用了基于Debian的 Raspberry Pi 操作系统,可以无需 编译QEMU+OVMF(ARM架构) ,使用更为方便
执行 移动云计算libvirt LVM卷管理存储池 为 Libvirt虚拟机管理器 构建一个基于 Linux LVM逻辑卷管理 的存储池(详细步骤见 移动云计算libvirt LVM卷管理存储池 )
启动安装¶
按照 移动云架构 规划进行磁盘的划分
创建使用 移动云计算libvirt LVM卷管理存储池 的虚拟机磁盘(举例
a-b-data-1
):
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
由于我采用 iso镜像使用location参数进行virt-install安装虚拟机 能够解决终端模式, 但是看起来 Ubuntu LTS 22.04还不能在 Apple Silicon MacbookPro上工作 (误判),权衡之后改为采用 Fedora ( Fedora集成Asahi Linux工具 ):
# 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安装虚拟机 :
#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安装 配置完成开始安装,却发生虚拟机磁盘无法写入的异常,尝试多次都同样报错。
使用 virt-builder快速构建VM工具 构建本地Fedora37虚拟机镜像(最终实际采用官方虚拟机raw镜像),采用简化配置方式能够正常运行KVM虚拟机
对比官方镜像运行虚拟机的磁盘参数和我沿X86虚拟化的磁盘参数,反复验证定位出
io=native
参数导致磁盘无法写入修订
virt-install
参数,将磁盘参数改为io=threads
解决磁盘写入问题(上文安装参数已修订正确)
配置虚拟机自动启动¶
由于 移动云计算部署Ceph 是所有上层KVM虚拟机的运行基础,所以 配置虚拟机自动启动 :
for i in 1..3;do sudo virsh autostart a-b-data-${i};done
参考¶
Spawn a Linux virtual machine on Arm using QEMU (KVM) arm社区wiki文档
How to make a better ARM virtual machine (armhf/aarch64) with UEFI
FS#74773 - Cannot resolve “edk2-armvirt”, a dependency of “qemu-system-aarch64”
How to boot Arch Linux ARM in QEMU (patched for M1) 关于如何在ARM架构中QEMU启动Arch Linux ARM虚拟机镜像的方法,不过这个文档是使用qcow2和raw镜像,并且使用的是 macOS平台QEMU实现:UTM (也就是针对 macOS 移植的 QEMU )