目录

Btrfs使用指南


准备

1
sudo pacman -S btrfs-progs grub-btrfs

分区和格式化

  • /boot/efi EFI分区
  • / 根目录(子卷在同一个 Btrfs 文件系统上)

使用gdisk或其他工具正常分区 假设目标盘为 /dev/nvme0n1

1
2
mkfs.fat -F32 -n EFI /dev/nvme0n1p1
mkfs.btrfs -L Arch /dev/nvme0n1p2

创建子卷

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 挂载顶层创建子卷
mount /dev/nvme0n1p2 /mnt
cd /mnt

btrfs subvolume create @
btrfs subvolume create @home
btrfs subvolume create @snapshots
btrfs subvolume create @swap

cd /
umount /mnt

挂载子卷

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 根
mount -o subvol=@,compress=zstd:1,noatime /dev/nvme0n1p2 /mnt

# 创建挂载点并挂载其余子卷
mkdir -p /mnt/{boot/efi,home,.snapshots,swap}

mount -o subvol=@home,compress=zstd:1,noatime /dev/nvme0n1p2 /mnt/home
mount -o subvol=@snapshots,compress=zstd:1,noatime /dev/nvme0n1p2 /mnt/.snapshots
mount -o subvol=@swap,nodatacow /dev/nvme0n1p2 /mnt/swap
mount /dev/nvme0n1p1 /mnt/boot/efi

# 继续标准安装:pacstrap, arch-chroot, 装内核等

Swapfile 创建(进入新系统后)

1
2
3
4
5
6
7
# 在 @swap 子卷内(已继承 nodatacow)
sudo truncate -s 0 /swap/swapfile
sudo chattr +C /swap/swapfile
sudo dd if=/dev/zero of=/swap/swapfile bs=1M count=16384 status=progress
sudo chmod 600 /swap/swapfile
sudo mkswap /swap/swapfile
sudo swapon /swap/swapfile

/etc/fstab最后一行加入

1
/swap/swapfile none swap defaults 0 0

手动创建快照

1
2
3
4
5
sudo mkdir /.snapshots/root
sudo mkdir /.snapshots/home
sudo btrfs subvolume snapshot / /.snapshots/root/__name__
sudo btrfs subvolume snapshot /home /.snapshots/home/__name__
sudo grub-mkconfig -o /boot/grub/grub.cfg

查看快照

1
2
ll /.snapshots
btrfs subvolume list /

删除旧快照

1
2
sudo btrfs subvolume delete /.snapshots/root/__name__
sudo btrfs subvolume delete /.snapshots/home/__name__

回滚快照

  1. 先在grub里选择进入之前的快照
  2. 确认当前运行的快照名
1
findmnt -n -o OPTIONS / | grep -oP 'subvol=\K[^,]+'
  1. 挂载 Btrfs 顶层(subvolid=5)
1
2
3
sudo mkdir -p /mnt/top
sudo mount -o subvolid=5 /dev/nvme0n1p2 /mnt/top
cd /mnt/top

现在你能看到所有子卷平铺在这里:@、@home、@snapshots、@swap,以及嵌套在 @snapshots 里的你的快照。

  1. 删除旧根,从当前快照重建
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 可选:删除嵌套子卷
# sudo btrfs subvolume delete /mnt/top/@/var/lib/portables
# sudo btrfs subvolume delete /mnt/top/@/var/lib/machines

# 删除旧的 @
sudo btrfs subvolume delete @

# 从当前运行的快照创建新的可写 @
sudo btrfs subvolume snapshot @snapshots/root/__name__ @

# 卸载顶层,重启
cd /
sudo umount /mnt/top
sudo reboot