ARM移动云KVM虚拟化

采用 arch linux ARM KVM虚拟化 技术构建在 Apple ARM架构芯片M1 Pro MacBook Pro ( ARM Atlas 架构 )

架构

挫折和探索

我没有想到在 Apple ARM架构芯片M1 Pro MacBook Pro上通过 Asahi Linux (底层是 Arch Linux ARM) 部署 KVM Atlas 虚拟化会遇到这么多挫折:

安装虚拟化软件

安装 qemu-system-aarch64

备注

以下是我在 Asahi Linux 上经过探索总结的部署KVM虚拟化的方法步骤,应该是最简便和准确的方法(去除了反复尝试的一些错误方法)。

虽然QEMU可以运行任意硬件架构操作系统,但是对于运行ARM64架构操作系统,只需要安装 qemu-system-aarch64 即可。需要注意,当前社区仓库没有解决依赖包安装,直接安装 qemu-system-aarch64 会提示依赖错误,所以解决方法如下:

在arch linux上安装edk2-armvirt软件依赖包
sudo pacman -U --noconfirm edk2-armvirt-202208-3-any.pkg.tar.zst
  • 强制安装 qemu-system-aarch64 :

强制安装qemu-system-aarch64忽略依赖(依赖需要手工修复)
sudo pacman -Sd qemu-system-aarch64
  • 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

安装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

libvirt存储配置

备注

创建3个基于 移动云计算libvirt LVM卷管理存储池 的虚拟机,作为运行 移动云计算部署Ceph 的底层虚拟机。这3个底层虚拟机需要配置 libvirt LVM卷管理存储池

磁盘分区规划: 分区9作为 Linux LVM逻辑卷管理 构建 Ceph Atlas 的KVM虚拟机集群

移动云计算的磁盘分区

分区名

LVM卷

大小

用途

btrfs-data

50G

个人数据存储

btrfs-docker

48G

/var/lib/docker

lvm-libvirt

216G

用于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

parted分区: 50G data, 48G docker, 216G libvirt
# 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
创建vg-libvirt卷
# 将分区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 ,并且启动激活:

定义使用LVM卷组的libvirt存储池
# 定义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镜像 启动安装:

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