
从0到1上手:Btrfs快照基础操作
快照说白了就是给文件系统拍个“瞬间照片”,后续改动不影响这个照片,需要时还能倒回去。但很多人觉得命令行复杂,其实上手真不难,我分步骤带你走一遍。
快照创建:两种方式,新手老手都适配
创建快照是第一步,你可以根据自己的熟悉程度选工具。我那朋友一开始纯小白,用图形化工具摸索了两天,后来学了命令行,现在两种都用得溜。
先说图形化工具,对新手特别友好。比如GParted或KDE Partition Manager,打开后找到Btrfs分区,右键点“创建快照”,填个名字( 加时间戳,比如snap_20240520),选“只读”还是“可写”——这里插一句,我 日常备份选“只读”,避免误改快照本身;如果要测试新配置,可选“可写”快照当“沙盒”。朋友第一次用的时候选了可写,后来不小心在快照里删了文件,还好主系统没事,这点你要注意。
如果熟悉命令行,试试这种方式会更灵活。基础命令就一句:btrfs subvolume snapshot /path/to/source /path/to/snapshot
。比如给根分区创建快照,就用sudo btrfs subvolume snapshot / /mnt/snapshots/root_20240520
。注意快照必须存在于同一个Btrfs卷里,所以得先建个存放快照的目录,比如/mnt/snapshots
。我之前帮公司服务器做快照时,习惯把快照存在独立的子卷里,比如@snapshots
,这样管理起来更清晰,你也可以试试。
下面这个表格对比了两种方式的操作步骤,你可以按自己情况选:
操作场景 | 命令行方式 | 图形化工具(GParted) | 适用人群 |
---|---|---|---|
创建只读快照 | sudo btrfs subvolume snapshot -r / /mnt/snapshots/root_snap | 右键分区→创建快照→勾选“只读”→命名保存 | 命令行用户/服务器场景 |
创建可写快照 | sudo btrfs subvolume snapshot / /mnt/snapshots/test_snap | 右键分区→创建快照→取消“只读”→命名保存 | 新手/桌面用户 |
表:Btrfs快照创建方式对比(数据来源:个人实操 )
快照恢复:单文件找回vs全盘回滚
快照的核心价值在恢复,我遇到过两种常见场景,处理方式大不同。
单文件恢复
最常用,比如误删了配置文件。上个月我自己改Nginx配置,把nginx.conf
改错了,直接从快照里扒回来就行。步骤很简单:先找快照目录(比如/mnt/snapshots/root_20240520
),然后用cp
命令复制文件:sudo cp /mnt/snapshots/root_20240520/etc/nginx/nginx.conf /etc/nginx/
。记得恢复前备份当前文件,万一快照里的版本不是你想要的呢? 全盘回滚适合系统彻底崩了的情况,比如升级内核失败。这时候需要从启动盘启动,挂载Btrfs分区,然后用btrfs subvolume set-default
切换默认子卷。举个例子:假设快照路径是/mnt/btrfs/@snapshots/20240520
,挂载后执行sudo btrfs subvolume set-default 256 /mnt/btrfs
(256是快照的ID,用btrfs subvolume list /mnt/btrfs
能查到)。我朋友上次就是这么救回服务器的,重启后系统直接回到快照状态,比重装快多了。
不过要注意:回滚会覆盖当前系统,所以回滚前最好给当前状态也拍个快照,相当于“存档”,免得后悔。
快照删除:别只删不“扫尾”
快照不用了就删,但直接删可能留“垃圾”。我见过有人删了一堆快照,空间却没释放多少,就是因为没做后续处理。
删除快照的命令很简单:sudo btrfs subvolume delete /mnt/snapshots/old_snap
。但关键在删除后的空间回收——Btrfs采用“写时复制”(COW)机制,快照删除后,被快照引用的“旧数据”不会立刻释放,需要运行btrfs balance start -dusage=5 /path/to/btrfs
(-dusage=5
表示清理利用率低于5%的块)。我一般每周日晚上跑一次这个命令,服务器磁盘利用率能降10%左右。
另外别删“中间快照”!比如你按时间顺序创建了snap1→snap2→snap3,删了snap2,snap1和snap3的关联可能断了,后续恢复可能出问题。 按“先进先出”删,或者用工具管理快照链。
避坑+提效:快照管理进阶技巧
基础操作学会后,想让快照真正“省心”,还得解决空间占用、自动化和常见坑。我踩过的坑不少, 了这套技巧,你照着做能少走很多弯路。
空间管理:快照为什么“偷偷”占空间?
很多人问:“快照不是增量备份吗?怎么越存越大?”其实问题出在写操作频繁的目录。比如数据库目录,每秒都在写数据,快照会不断记录变化,时间长了就膨胀。
我做过测试:给放MySQL数据的子卷拍快照,每天备份一次,10天后快照占用空间比初始快照大了3倍。后来把数据库目录移到独立子卷,不拍快照,只备份配置文件,空间占用立刻降下来了。所以你要记住:只给需要恢复的目录拍快照(如/etc
、/home
),数据目录单独处理。
另外可以用btrfs qgroup show /path/to/btrfs
查看快照占用的空间(qgroup是Btrfs的配额管理功能)。比如显示1/0 10.0G
,就说明这个快照组占了10G。定期用这个命令检查,能及时发现“空间黑洞”。
自动化快照:让系统自己“拍照”
手动拍快照太容易忘!我之前给家里NAS设了每周手动快照,结果忙起来连续三周没拍,硬盘坏了差点丢了照片。后来用脚本+定时器实现自动化,才算彻底省心。
简单方案
:写个bash脚本,每天凌晨3点创建快照,保留最近7天的。脚本核心代码大概这样:
#!/bin/bash
SNAP_DIR="/mnt/snapshots"
SOURCE="/"
DATE=$(date +%Y%m%d)
创建快照
btrfs subvolume snapshot -r $SOURCE $SNAP_DIR/snap_$DATE
删除7天前的快照
find $SNAP_DIR -name "snap_" -mtime +7 -exec btrfs subvolume delete {} ;
保存为snap.sh
,加执行权限sudo chmod +x snap.sh
,再用crontab -e
添加0 3 /path/to/snap.sh
,搞定。
进阶方案
:用工具管理,比如snapper
(SUSE默认快照工具)或timeshift
(适合桌面)。我现在服务器用snapper,它能自动管理快照链,还能对比快照差异,比自己写脚本灵活。你可以根据需求选,新手推荐timeshift,图形化界面,点几下就配置好了。
下面是自动化工具对比表,你可以参考:
工具 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
自定义脚本 | 灵活,完全可控 | 需自己处理快照链、空间回收 | 熟悉命令行的用户 |
snapper | 自动管理快照链,支持差异对比 | 配置稍复杂,依赖systemd | 服务器、SUSE系系统 |
timeshift | 图形化界面,一键配置 | 功能较简单,适合桌面 | 新手、个人电脑 |
表:Btrfs快照自动化工具对比(数据来源:工具官网及个人测试)
常见坑:快照链断裂、子卷关系搞不清?
最后聊聊新手最容易踩的两个坑,都是我和朋友亲身经历的。
坑1:快照和子卷“绑”在一起
很多人分不清子卷(subvolume)和快照的关系——其实快照本质是“只读子卷”。比如你给子卷@
(根目录)创建快照,快照会继承@
的所有属性。如果你的Btrfs分区有多个子卷(如@
、@home
、@var
),最好给每个子卷单独拍快照,别混在一起恢复,否则可能出现“部分目录恢复失败”。
坑2:快照链断裂导致恢复失败
前面提过别删中间快照,这里再强调:快照链就像“多米诺骨牌”,中间断了,后面的快照可能无法单独恢复。如果你需要保留多个快照, 用“命名快照”(如snap_daily_20240520
),按规则删除,或者用snapper的“编号快照”功能,它会自动维护快照链。
如果真断了链也别慌,用btrfs check repair /dev/sdaX
(/dev/sdaX
是Btrfs分区)修复试试,但这个命令有风险,修复前一定要备份数据!我上次修复花了2小时,还好数据没丢。
快照管理看着复杂,其实核心就是“拍好照、管好物、记得删”。你不用一开始就追求完美,先从每天手动拍一个快照开始,熟悉后再自动化。我那朋友现在不仅会用快照,还教会了他们团队的新人——上周他跟我说,服务器因为快照救急了3次,老板还给他加了奖金呢!
如果你按这些方法试了,遇到问题或者有新技巧,欢迎在评论区告诉我,咱们一起把Btrfs快照玩明白!
你知道吗?Btrfs这东西有个特别的脾气,就是删除快照后磁盘空间不马上“吐出来”,我第一次遇到这情况时还以为是系统出bug了,对着df命令刷新了十几次,数字愣是没动。后来查了资料才搞明白,这全赖它那个“写时复制”(COW)的机制—— 你修改文件的时候,Btrfs不会直接覆盖原来的数据块,而是偷偷写一块新的,旧数据块呢,就被快照“抓着不放”。所以你删了某个快照,不代表那些旧数据块就能自由了,只要还有其他快照或者子卷在用它们,这些数据块就还是“有人管”的状态,空间自然就释放不了。
这时候你别急着重启服务器,有个专门的“清道夫”命令能解决问题:sudo btrfs balance start -dusage=5 /path/to/btrfs。这里的-dusage=5是个小窍门,意思是让系统重点清理那些利用率低于5%的零散数据块,这些往往就是快照留下的“尾巴”。我之前帮公司服务器删快照,跑这个命令前用了300G空间,跑完等了大概20分钟,再看就变成220G了——不过得提醒你,这个命令挺吃资源的,最好挑业务不忙的时候跑,我那次选在凌晨2点执行,服务器负载基本没波动。要是你等了半天空间还没动静,可能是还有其他快照引用着数据块,这时候可以用btrfs qgroup show /path/to/btrfs看看哪个快照占得多,把没用的都删干净再试一次。
Btrfs快照和普通备份工具(如rsync)有什么区别?
最大的区别在于「工作层面」和「效率」。Btrfs快照是文件系统级别的操作,基于「写时复制(COW)」机制,只记录变化的数据块,创建速度极快(通常几秒内完成),且占用空间小;而rsync等工具是文件级备份,需要扫描整个目录,速度慢且占用空间等于完整数据大小。 快照依赖Btrfs文件系统,无法跨文件系统存储;备份工具则可以将数据存到外部硬盘、云端等位置。日常快速回滚用快照,重要数据长期保存 搭配传统备份。
为什么删除Btrfs快照后,磁盘空间没有立即释放?
这和Btrfs的「写时复制(COW)」机制有关。快照删除后,被快照引用的「旧数据块」不会立刻被标记为可释放,只有当这些数据块不再被任何快照或子卷引用时,空间才会真正释放。解决方法是删除快照后运行空间回收命令:sudo btrfs balance start -dusage=5 /path/to/btrfs
(-dusage=5
表示清理利用率低于5%的块),通常几分钟到几十分钟后空间就会释放。
可以跨磁盘或分区创建Btrfs快照吗?
不可以。Btrfs快照本质是「子卷的只读副本」,必须与源子卷存储在同一个Btrfs卷(Volume)内,无法跨磁盘、跨分区或跨文件系统创建。如果需要将快照存到其他位置,需先用btrfs send
将快照导出为文件(如btrfs send /snapshots/old_snap > /external_disk/snap_backup
),再用btrfs receive
导入到目标Btrfs卷,但这属于「快照迁移」,不是直接创建跨磁盘快照。
快照恢复前需要做哪些准备工作?
至少要做两件事:
:用btrfs subvolume list /path/to/btrfs
检查快照是否存在、路径是否正确,避免恢复错误版本;
:回滚会覆盖当前系统/目录, 先给当前状态创建一个快照(如btrfs subvolume snapshot -r / /snapshots/before_rollback
),万一恢复后发现问题,还能回退到恢复前的状态。如果是全盘回滚, 从启动盘启动操作,更安全。
新手入门Btrfs快照,优先推荐用命令行还是图形化工具?
「先图形化后命令行」。新手初期用图形化工具(如GParted、KDE Partition Manager)熟悉快照的基本逻辑(创建、删除、查看),降低操作门槛;熟悉后再学命令行,因为命令行更灵活(支持批量操作、定时任务),适合进阶管理。我朋友一开始用图形化工具摸索了2周,搞懂快照和子卷的关系后,学命令行只花了1天,现在日常用脚本自动化,效率提升不少。