btrfs作为一个现代文件系统,其具有很多优势,比如写时复制,快照,子卷功能,文件校验,文件压缩等等。
我本身是把Arch Linux装到EXT4分区上的,但是,btrfs的子卷把我吸引过去了。传统的分区一般会把rootfs,home目录等等存放在不同分区,导致磁盘的空间可能无法充分利用。
我实际上一直在担心一件事情,就是rootfs分区满了,但是home分区还有大量的可用空间,这就挺尴尬的。
BTRFS的子卷功能则可以保证rootfs和home分区共享同一分区的大小,还能做到之前把rootfs和home目录单独分区的效果。
所以,我跑到btrfs下面去了。
将Arch Linux安装到btrfs分区上
以下内容假定将Arch Linux安装到/dev/vda2
中。
在分区的时候,除去EFI分区外,对于Arch Linux整个文件系统,可以只分一个区。
如果你想使用GRUB的“记住上一次选中的启动项”功能,则需要将/boot
单独分一个区(大小600~1024MB左右均可),并格式化为除btrfs之外的其他文件系统(如ext4)。
在分区完成之后,首先先将目标分区格式化为btrfs文件系统,挂载,并创建子卷。
# 格式化为btrfs
mkfs.btrfs -L arch-btrfs /dev/vda2
# 注意这个compress,压缩算法可以换成你喜欢的
mount --mkdir /dev/vda2 -o compress=zstd /tmp/btrfs-full
# 创建子卷
btrfs subvol create /tmp/btrfs-full/@
btrfs subvol create /tmp/btrfs-full/@home
btrfs subvol create /tmp/btrfs-full/@swap
btrfs subvol create /tmp/btrfs-full/@var-tmp
btrfs subvol create /tmp/btrfs-full/@var-cache
# 为部分不需要写时复制的子卷设置相关属性
chattr +C /tmp/btrfs-full/@swap
chattr +C /tmp/btrfs-full/@var-cache
# 取消挂载
umount /tmp/btrfs-full
如何决定需要创建什么子卷?
-
首先,推荐将rootfs和
/home
文件夹分别存放在不同子卷(@
和@home
)中。 -
swapfile推荐放置于单独的子卷中(
@swap
),并且关闭写时复制。 -
/var/tmp
属于临时文件文件夹,推荐为其单独分一个子卷(@var-tmp
)。不需要为/tmp
创建子卷。 -
建议为
/var/cache
单独创建一个子卷(@var-cache
),并且根据需求,可考虑为该子卷关闭写时复制。 -
部分快照软件可能会用到
/.snapshots
目录。如果你打算使用的快照软件使用到了这个目录,则需要为此目录创建子卷@snapshots
。 -
假定你现在要对rootfs子卷执行快照操作,一些你觉得不应该纳入rootfs快照的目录,比如Docker数据文件夹(
/var/lib/docker
,@docker
)和libvirt文件夹(/var/lib/libvirt
,@libvirt
)等。 -
不要为整个
/var
目录单独分一个子卷。
在创建完子卷之后,挂载子卷。
# 挂载分区,注意这里的compress和上面选择的压缩算法一致
mount --mkdir /dev/sda2 -o compress=zstd,subvol=@ /mnt
mount --mkdir /dev/sda2 -o subvol=@home /mnt/home
mount --mkdir /dev/sda2 -o subvol=@swap /mnt/swap
mount --mkdir /dev/sda2 -o subvol=@var-tmp /mnt/var/tmp
mount --mkdir /dev/sda2 -o subvol=@var-cache /mnt/var/cache
# 如果你要创建一个swapfile,则使用下面的命令
btrfs fi mkswapfile /mnt/swap/swapfile --uuid clear --size 4G
之后,按照正常的安装流程安装Arch Linux即可。不过需要以下以下两点。
一定要记得安装btrfs-progs
软件包。
在执行genfstab
之后,推荐立刻修改/mnt/etc/fstab
,将fstab中的btrfs挂载点的挂载选项稍作编辑,再执行arch-chroot
进行后续配置操作。
推荐删除ssd,discard=async,space_cache=v2,subvolid=xxx
等这些由系统自动决定的挂载选项,保留rw,relatime,compress=zstd:3,subvol=@xxx
等以及其他你认为需要保留的挂载选项。
比如,编辑前:
编辑后:
btrfs的管理
btrfs fi usage /
可以查看当前btrfs分区的使用情况。
可以通过compsize
来查看btrfs中文件/目录的实际空间使用情况。
pacman -S compsize
compsize / -x
compsize ~
btrfs的快照功能
由于btrfs的特性,因此为子卷创建快照是非常简单的。目前也有很多现成的软件,简化了btrfs快照管理的操作步骤,比如Snapper,Timeshift等。
笔者此处使用的是Timeshift,该软件的配置方法比较简单,本文不再概述。
需要提醒的是,btrfs的快照功能并非万金油,它防不了文件系统的物理损坏(如突然断电等情况)。在使用btrfs的快照功能时,依然建议定期备份数据。
请问子卷的名称用@开头是有什么特殊的理由吗?还是单纯方便记忆名字
准确的说,是一种btrfs子卷命名规范
感谢解答,搜了下好像叫什么Ubuntu-type subvolume layout