从做实验来理解快照功能
btrfs原生快照功能
准备好实验用的空间
dd if=/dev/zero of=snap-test.img bs=1M count=1024
mkfs.btrfs snap-test.img
然后将这块文件挂载
mkdir ~/snapshot-test
sudo mount -o loop snap-test.img ~/snapshot-test
然后我们可以看到snap-test.img是一个顶级子卷
spriple@lena ~/snapshot-test> sudo btrfs subvolume show .
/
Name: <FS_TREE>
UUID: c50a7d7d-3685-4d0c-ace5-fda89fd9d909
Parent UUID: -
Received UUID: -
Creation time: 2026-03-02 21:43:33 +0800
Subvolume ID: 5
Generation: 9
Gen at creation: 0
Parent ID: 0
Top level ID: 0
Flags: -
Send transid: 0
Send time: 2026-03-02 21:43:33 +0800
Receive transid: 0
Receive time: -
Snapshot(s):
Quota group: n/a
接下来我们在根目录下面创建一个子卷用来做btrfs的原生快照功能测试
spriple@lena ~/snapshot-test> sudo btrfs subvolume create @
Create subvolume './@'
spriple@lena ~/snapshot-test> sudo btrfs subvolume list .
ID 256 gen 10 top level 5 path @
spriple@lena ~/snapshot-test> ls
'@'/
然后创建测试文件,便于验证快照的内容
spriple@lena ~/s/@ [1]> sudo touch sometile{1,2,3,4}.txt
spriple@lena ~/s/@> ls
sometile1.txt sometile2.txt sometile3.txt sometile4.txt
创建快照,并且验证内容
spriple@lena ~/snapshot-test> sudo btrfs subvolume snapshot @ @/snapshots
Create snapshot of '@' in '@/snapshots'
spriple@lena ~/snapshot-test> ls @/snapshots/
sometile1.txt sometile2.txt sometile3.txt sometile4.txt
可以看到创建的快照中内容和创建快照之前是一模一样的
这里感觉有个问题,第一创建快照的时候如果不会递归创建内容可以理解,但是如果第二次创建快照,感觉有可能把快照本身包含进去
snapper快照工具
还是在之前创造的btrfs测试环境中测试
清理干净之前创造的子卷,然后创建一个新的home子卷
sudo btrfs subvolume create home
然后为这个home子卷创建一个配置
sudo snapper -c home create-config ~/snapshot-test/home/
这个操作会在/etc/snapper/configs/创建名为home的配置,里面会有关于子卷的配置信息
然后我们先手动创建一个新的快照
spriple@lena ~/snapshot-test> sudo snapper -c home create -d "blank"
spriple@lena ~/snapshot-test> sudo snapper -c home list
# │ Type │ Pre # │ Date │ User │ Cleanup │ Description │ Userdata
──┼────────┼───────┼─────────────────────────────────┼──────┼─────────┼─────────────┼─────────
0 │ single │ │ │ root │ │ current │
1 │ single │ │ Mon 02 Mar 2026 10:59:50 PM CST │ root │ │ blank │
然后我们手动创建一些文件并且创建对应状态的快照
spriple@lena ~/s/home [1]> sudo touch sometile{1,2,3,4,5,6}.txt
spriple@lena ~/s/home> ls
sometile1.txt sometile2.txt sometile3.txt sometile4.txt sometile5.txt sometile6.txt
spriple@lena ~/s/home> sudo snapper -c home create -d "good"
然后我们删除一些文件,创建一个快照
spriple@lena ~/s/home> sudo rm sometile{1,2}.txt
spriple@lena ~/s/home> ls
sometile3.txt sometile4.txt sometile5.txt sometile6.txt
spriple@lena ~/s/home> sudo snapper -c home create -d "bad"
然后我们可以diff good状态和bad状态的区别,并且回滚到blank或者good
spriple@lena ~/s/home [1]> sudo snapper -c home status 3..4
-..... /home/spriple/snapshot-test/home/sometile1.txt
-..... /home/spriple/snapshot-test/home/sometile2.txt
spriple@lena ~/s/home> sudo snapper -c home undochange 3..4
create:2 modify:0 delete:0
spriple@lena ~/s/home> ls
sometile1.txt sometile2.txt sometile3.txt sometile4.txt sometile5.txt sometile6.txt
spriple@lena ~/s/home> sudo snapper -c home undochange 1..3
create:0 modify:0 delete:6
一些技巧
不断在快照之间切换会让人疑惑,自己处在哪一个快照状态,此时就可以使用status命令对比0状态和其他状态,因为0状态是目前的状态