btrfs子卷管理和TimeShift踩坑日记
起因
高中时代曾经购入过一台ThinkPad并安装了LinuxMint系统,历尽磨难 久经沙场后软件环境已不知道被折腾成什么样子。今晚误触打开TimeShift后几行猩红的刺目提示就冒了出来:
系统分区存在无法支持的子卷布局。目前只支持具有 @ 和 @home 子卷的Ubuntu类型布局。
应用将会退出。
这是使用btrfs快照模式的timeshift-gtk(即为LinuxMint预装的快照系统管理备份软件) 在非标准btrfs字卷下的错误提示,这台老ThinkPad的系统根目录是从ZFS迁移到btrfs的,有不妥善之处也在意料之中,之前遇到此类问题在网上基本找不到有用资料,故写下本篇博客记录下btrfs子卷的管理过程和TimeShift的一些坑点。
问题分析
关于btrfs子卷(subvolume)的概念在此不再赘述,有需要的读者请自行到: Btrfs - ArchWiki了解。
使用btrfs命令获取字卷列表:
sudo btrfs subvolume list /
ID 256 gen 124164 top level 5 path @可以看到笔者之前的配置中尚未创建@home子卷,/home目录是在@子卷下的,这样TimeShift无法对@home单独拍快照,而这也是btrfs文件系统快照的限制。
故我们需要:
创建 @home 子卷
将 /home下的文件迁移到 @home 子卷
调整 /etc/fstab 挂载配置
配置 TimeShift 以创建系统快照
btrfs子卷操作
先在根目录下创建@home子卷:
sudo btrfs subvolume create /@home随后查询当前块设备列表:
sudo lsblk
NAME MA:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 238.5G 0 disk
├─sda1 8:1 0 512M 0 part /boot/grub
│ /boot/efi
└─sda2 8:2 0 238G 0 part /把刚创建好的子卷挂载到文件树上:
sudo mkdir /mnt/temp_home
sudo mount /dev/sda2 /mnt/temp_home -o subvol=@home然后复制文件到子卷下:
sudo rsync -aHAX /home/ /mnt/temp_home/最后编辑fstab,添加这一行,使得系统能自动挂载@home子卷:
UUID=<换成你的UUID> /home btrfs defaults,subvol=@home 0 0# 挂载和文件系统问题
在仅仅做了以上操作,把/home迁移出来到@home子卷,并不能让Timeshift觉得这是个正常的分区,它依旧不认可这个子卷!
系统分区存在无法支持的子卷布局。目前只支持具有 @ 和 @home 子卷的Ubuntu类型布局。
应用将会退出。
经过数小时的尝试之后,笔者发现主要是挂载配置和btrfs默认子卷的问题。
设置@为默认子卷
用以下命令查看并设置@为默认子卷:
sudo btrfs subvolume list /
ID 256 gen 124164 top level 5 path @
ID 257 gen 124164 top level 5 path @home
sudo btrfs subvolume set-default 256 /修复根目录挂载配置
笔者原来的fstab配置是这样的:
UUID=<我的磁盘的UUID> / auto defaults 0 0
UUID=<我的磁盘的UUID> /home btrfs defaults,subvol=@home 0 0这样子挂载,根分区并没有被TimeShift正确的识别为 @卷!
我们需要修改成这样:
UUID=<我的磁盘的UUID> / btrfs defaults,subvol=@ 0 0
UUID=<我的磁盘的UUID> /home btrfs defaults,subvol=@home 0 0完成
完成以上所有配置后,重启系统让新的挂载配置生效。此时再次打开TimeShift,应该就能正常识别btrfs的子卷布局了。可以在设置中确认快照位置和配置,然后正常创建系统快照。