ARM移动云KVM虚拟化¶
采用 arch linux ARM KVM虚拟化 技术构建在 Apple ARM架构芯片M1 Pro MacBook Pro ( ARM Atlas 架构 )
架构¶
由于arch linux ARM没有直接提供可用的 qemu 安装包,所以 编译QEMU+OVMF(ARM架构) 来实现 arch linux ARM KVM虚拟化
由于 Asahi Linux 内核版本过新不被 ZFS 直接支持,而 Btrfs 对kvm的支持有很多限制,所以采用 Linux LVM逻辑卷管理 构建 libvirt LVM卷管理存储池
挫折和探索¶
我没有想到在 Apple ARM架构芯片M1 Pro MacBook Pro上通过 Asahi Linux (底层是 Arch Linux ARM) 部署 KVM Atlas 虚拟化会遇到这么多挫折:
从一开始安装软件包就发现 Pacman 仓库的
aarch64
架构的虚拟化系列软件包依赖是broken的,无法直接安装既然没有二进制安装包,那么开源的软件,我们从源代码编译可不可行呢?可行,但是非常麻烦(带来的好处是对 Open Virtual Machine Firmware(OMVF) UEFI 以及 QEMU 有了更深的了解):
编译QEMU+OVMF(ARM架构) 想办法构建 Open Virtual Machine Firmware(OMVF) 实现虚拟机的UEFI启动,但是好不容易编译成功并且配置好 Libvirt虚拟机管理器 使用自制的nvram
却发现居然还是无法出现安装界面,期间尝试了各种
virt-install
安装参数组合采用 iso镜像使用location参数进行virt-install安装虚拟机 传递内核参数(想基于iso安装依然能够字符终端模式)依然无法解决instller启动
不得已又回转来想办法解决 Arch Linux ARM 虚拟化软件的 强制方式安装仓库提供的qemu并补全依赖 ,峰回路转,终于能够启动安装
再遇拦路虎: 安装程序无法写入磁盘导致安装失败, 排查ARM虚拟机磁盘异常 对比和尝试不同的虚拟磁盘参数组合:
ARM64架构下
io=native
导致无法写虚拟磁盘,调整为io=threads
解决
安装虚拟化软件¶
安装 qemu-system-aarch64
¶
备注
以下是我在 Asahi Linux 上经过探索总结的部署KVM虚拟化的方法步骤,应该是最简便和准确的方法(去除了反复尝试的一些错误方法)。
虽然QEMU可以运行任意硬件架构操作系统,但是对于运行ARM64架构操作系统,只需要安装 qemu-system-aarch64
即可。需要注意,当前社区仓库没有解决依赖包安装,直接安装 qemu-system-aarch64
会提示依赖错误,所以解决方法如下:
将 edk2-armvirt 依赖安装包下载到本地安装:
sudo pacman -U --noconfirm edk2-armvirt-202208-3-any.pkg.tar.zst
强制安装
qemu-system-aarch64
:
sudo pacman -Sd qemu-system-aarch64
从 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
安装libvirt¶
arch linux for arm软件仓库提供 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服务:
# 启动libvirtd
systemctl start libvirtd
# 激活操作系统启动时启动libvirtd
systemctl enable libvirtd
libvirt存储配置¶
备注
创建3个基于 移动云计算libvirt LVM卷管理存储池 的虚拟机,作为运行 移动云计算部署Ceph 的底层虚拟机。这3个底层虚拟机需要配置 libvirt LVM卷管理存储池
磁盘分区规划: 分区9作为 Linux LVM逻辑卷管理 构建 Ceph Atlas 的KVM虚拟机集群
分区名 |
LVM卷 |
大小 |
用途 |
---|---|---|---|
btrfs-data |
50G |
个人数据存储 |
|
btrfs-docker |
48G |
|
|
lvm-libvirt |
|
用于libvirt的LVM卷(合计) |
|
base-1 |
16G |
基础虚拟机1 |
|
base-2 |
16G |
基础虚拟机2 |
|
base-3 |
16G |
基础虚拟机3 |
|
ceph-1 |
56G |
ceph数据盘1 |
|
ceph-2 |
56G |
ceph数据盘2 |
|
ceph-3 |
56G |
ceph数据盘3 |
|
磁盘采用 移动云计算的Btrfs实践 划分磁盘分区:
# 50G data,48G docker,216G libvirt(3个vm 共48G + 3个Ceph存储 168G)
parted -a optimal /dev/nvme0n1 mkpart primary 181GB 231GB
parted -a optimal /dev/nvme0n1 mkpart primary 231GB 279GB
parted -a optimal /dev/nvme0n1 mkpart primary 279GB 495GB
parted /dev/nvme0n1 name 7 btrfs-data
parted /dev/nvme0n1 name 8 btrfs-docker
parted /dev/nvme0n1 name 9 lvm-libvirt
创建 Linux LVM逻辑卷管理 的PV和VG:
# 将分区9的LVM标记激活
parted /dev/nvme0n1 set 9 lvm on
# 在分区9上创建LVM的PV和VG
pvcreate /dev/nvme0n1p9
vgcreate vg-libvirt /dev/nvme0n1p9
定义
images_lvm
存储池: 使用逻辑卷组vg-libvirt
目标磁盘/dev/nvme0n1p9
,并且启动激活:
# 定义libvirt存储池images_lvm,指定使用LVM卷组vg-libvirt,目标设备/dev/nvme0n1p9
virsh pool-define-as images_lvm logical --source-name vg-libvirt --target /dev/nvme0n1p9
# 启动存储卷images_lvm并设置为自动启动
virsh pool-start images_lvm
virsh pool-autostart images_lvm
完成上述 libvirt LVM卷管理存储池 配置后,就可以创建基础虚拟机,如下文
创建虚拟机¶
使用Fedora官方下载iso镜像 启动安装:
#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移动云的虚拟机部署 就可以开始部署 移动云计算部署Ceph