准备
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__
|
回滚快照
- 先在grub里选择进入之前的快照
- 确认当前运行的快照名
1
| findmnt -n -o OPTIONS / | grep -oP 'subvol=\K[^,]+'
|
- 挂载 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
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
|