飞牛NAS Btrfs全攻略:快照/压缩/子卷
飞牛NAS Btrfs全攻略:快照、压缩与子卷
为何选择Btrfs
在飞牛NAS(fnOS)中,Btrfs是一个极具潜力的文件系统选择。不同于传统的ext4,Btrfs集成了快照、数据校验、在线压缩和灵活的子卷管理功能,特别适合追求数据安全与存储效率的用户。本教程将带你逐一攻克Btrfs的核心特性:快照备份、透明压缩和子卷隔离,让你的NAS更智能、更省空间。
准备工作:确认你的飞牛NAS使用Btrfs
在开始操作前,请确保你的存储池或数据卷已经格式化为Btrfs。
- 登录飞牛NAS后台,进入“存储管理” -> “存储空间”。
- 查看你的数据盘或卷的“文件系统”类型。如果显示为“Btrfs”,恭喜你,可以继续。如果是“ext4”,你需要备份数据后重新格式化(注意:格式化会清除所有数据)。
- 如果尚未创建Btrfs卷,可以在“存储管理”中新建存储池时选择“Btrfs”作为文件系统。
核心功能一:子卷
子卷是Btrfs的基石。你可以把一个Btrfs分区想象成一个大的“容器”,子卷则是容器内独立的“小房间”。每个子卷可以独立进行快照、设置挂载选项,甚至设置不同的压缩算法。
创建子卷
假设你的Btrfs卷挂载在/volume1。我们为重要数据创建一个名为data的子卷。
- 通过SSH或飞牛NAS的“文件管理器”中的“终端”功能连接到NAS后台。
- 运行以下命令创建子卷:
sudo mkdir -p /volume1/data_share
sudo btrfs subvolume create /volume1/data_share
注意:mkdir 只是创建了目录,btrfs subvolume create 才是真正创建子卷。你可以通过 btrfs subvolume list /volume1 查看所有子卷。
- 现在,
/volume1/data_share就是一个独立的子卷了。你可以将共享文件夹直接指向这个子卷路径。
子卷的好处
隔离数据:不同应用的数据放在不同子卷,比如 docker_data、media、backup。即使一个子卷被写满,也不会影响其他子卷的正常读写。更重要的是,快照可以针对单个子卷进行,避免备份整个大分区。
核心功能二:快照
快照是Btrfs的杀手锏。它能在瞬间记录子卷在某一时刻的状态,并且几乎不占用额外空间(只有修改的数据才会占用增量空间)。
创建手动快照
我们为刚才的data_share子卷创建一个快照。
- 在NAS上创建一个存放快照的目录,通常建议放在同一个Btrfs卷下,但不要放在被快照的子卷内部。
sudo mkdir -p /volume1/snapshots
- 创建只读快照(推荐,防止误修改):
sudo btrfs subvolume snapshot -r /volume1/data_share /volume1/snapshots/data_share_20231027
参数 -r 表示只读。快照路径为 /volume1/snapshots/data_share_20231027。
恢复快照
如果你误删了文件,可以将快照恢复成一个新的子卷,然后复制文件。
sudo btrfs subvolume snapshot /volume1/snapshots/data_share_20231027 /volume1/data_share_restored
此时,/volume1/data_share_restored 就是恢复后的数据目录。你可以从中找回丢失的文件。
自动化快照
手动操作太麻烦?飞牛NAS的“计划任务”可以帮你实现自动化。
- 进入“控制面板” -> “任务计划”。
- 新增一个“用户自定义脚本”任务,设置执行周期,例如每天凌晨2点。
- 在脚本内容中输入:
#!/bin/bash
# 设置变量
SOURCE="/volume1/data_share"
SNAPSHOT_DIR="/volume1/snapshots"
DATE=$(date +%Y%m%d_%H%M%S)
# 保留最近30天的快照,自动删除旧的
btrfs subvolume snapshot -r $SOURCE $SNAPSHOT_DIR/data_share_$DATE
# 清理超过30天的快照(按需调整)
btrfs subvolume list -o $SOURCE | grep "data_share_" | awk '{print $NF}' | while read snap; do
snap_date=$(echo $snap | grep -oP '\d{8}')
if [ -n "$snap_date" ] && [ "$(date -d "$snap_date" +%s)" -lt "$(date -d '30 days ago' +%s)" ]; then
btrfs subvolume delete "$SNAPSHOT_DIR/$snap"
fi
done
这段脚本会每天生成快照,并自动删除30天前的旧快照。你可以根据需要调整天数。
核心功能三:透明压缩
Btrfs支持在线透明压缩,意味着数据在写入磁盘前会被自动压缩,读取时自动解压,对用户和应用程序完全透明。这能显著节省存储空间,尤其适合存放文本文件、日志、备份包等可压缩性高的数据。
开启压缩(新挂载)
如果你需要为一个现有的子卷开启压缩,需要重新挂载它。
- 查看当前子卷挂载点:
mount | grep /volume1/data_share。 - 临时卸载子卷(确保没有进程在使用):
sudo umount /volume1/data_share
- 重新挂载并启用压缩(推荐
zstd算法,速度快、压缩比高):
sudo mount -o compress=zstd /dev/sdX /volume1/data_share
注意:将/dev/sdX替换为你实际的设备路径(如/dev/sda1),可通过 lsblk 查看。
永久开启压缩
为了让重启后依然生效,需要修改fstab文件。
- 备份
/etc/fstab:sudo cp /etc/fstab /etc/fstab.bak。 - 编辑
/etc/fstab:
sudo nano /etc/fstab
找到对应Btrfs分区的行,在挂载选项(第四个字段)中添加 ,compress=zstd。
例如,原始行可能是:
/dev/sda1 /volume1 btrfs defaults 0 0
修改为:
/dev/sda1 /volume1 btrfs defaults,compress=zstd 0 0
- 保存退出,然后执行
sudo mount -a测试配置是否正确。如果无报错,重启后压缩将自动生效。
验证压缩效果
使用 compsize 工具查看压缩率。
sudo btrfs filesystem show /volume1/data_share
sudo compsize /volume1/data_share
输出会显示原始大小、压缩后大小和压缩比。通常文本文件的压缩比可达2:1甚至更高。
高级技巧:结合使用
将子卷、快照和压缩结合使用,效果更佳。
例如,为Docker的数据目录创建独立子卷并开启压缩:
- 创建子卷:
sudo btrfs subvolume create /volume1/docker_data。 - 挂载并启用压缩:
sudo mount -o compress=zstd /dev/sda1 /volume1/docker_data。 - 将Docker的数据目录指向这个子卷。
- 日常通过计划任务对
/volume1/docker_data做快照,实现快速回滚。
这样,Docker的镜像层、容器数据不仅占用空间更小,还能被快照保护,一举两得。
总结
Btrfs为飞牛NAS带来了企业级的数据管理能力。通过子卷实现数据隔离,利用快照实现秒级备份与恢复,借助透明压缩节省存储空间。掌握这三个核心功能,你的NAS将从简单的文件服务器升级为高效、可靠的数据中心。建议从创建第一个子卷和手动快照开始,逐步尝试自动化脚本和压缩配置。记得,在操作前备份重要数据,实践出真知。