移动云计算的Btrfs实践

由于 Asahi Linux 的内核迭代非常激进,最新的 v6.1 内核已经超出了 OpenZFS 支持的最高 v6.0版本,所以在 使用zfs-dkms在arch linux编译安装ZFS 遇到困难。为了能够在 移动云架构 中实践前沿Linux技术,考虑到 Btrfs 是Linux内核主线内置支持,我于2022年11月,改为采用 Btrfs 来构建 Docker btrfs 存储驱动

前置工作

  • 安装 btrfs-progs 工具:

arch linux安装btrfs工具并加载内核模块
pacman -S btrfs-progs
modprobe btrfs

磁盘分区

由于在 Apple ARM架构芯片M1 Pro 的MacBook Pro 2022,我放弃了之前的 使用zfs-dkms在arch linux编译安装ZFS ,但是分区方式沿用,所以依然使用 parted分区工具 对磁盘进行分区,做了一些细微调整:

移动云计算的磁盘分区

分区名

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
  • 完成后检查 parted /dev/nvme0n1 print 输出信息如下:

parted分区输出
Model: APPLE SSD AP0512R (nvme)
Disk /dev/nvme0n1: 500GB
Sector size (logical/physical): 4096B/4096B
Partition Table: gpt
Disk Flags: 

Number  Start   End    Size    File system  Name                  Flags
 1      24.6kB  524MB  524MB                iBootSystemContainer
 2      524MB   149GB  148GB
 3      149GB   151GB  2500MB
 4      151GB   152GB  500MB   fat32                              boot, esp
 5      152GB   181GB  29.0GB  ext4
 7      181GB   231GB  50.2GB               btrfs-data
 8      231GB   279GB  48.0GB               btrfs-docker
 9      279GB   495GB  216GB                lvm-libvirt
 6      495GB   500GB  5369MB               RecoveryOSContainer

备注

分区删除然后重建可能需要重启系统才能正确感知分区,我尝试 partx -a /dev/nvme0n1partprobe 都没有成功

btrfs文件系统

  • 对分区 7/8 进行文件系统格式化,并挂载(启用 lzo 压缩):

对分区 7/8 进行文件系统格式化,并挂载
sudo mkfs.btrfs -f -L data /dev/nvme0n1p7
sudo mkfs.btrfs -f -L docker /dev/nvme0n1p8

# 分区UUID采用 blkid /dev/nvme0n1p7 查看
echo "UUID=efd22ea6-9365-4bc3-a233-e61d1d159fcd  /data  btrfs  defaults,compress=lzo  0  1" >> /etc/fstab
echo "UUID=9dcef08a-a2f4-4128-abb0-2cb6f63644a6  /var/lib/docker  btrfs  defaults,compress=lzo  0  1" >> /etc/fstab

mkdir /data
mkdir /var/lib/docker

mount /data
mount /var/lib/docker

使用btrfs