系统优化

飞牛NAS Btrfs全攻略:快照/压缩/子卷

2026-07-30 2 admin

飞牛NAS Btrfs全攻略:快照、压缩与子卷

为何选择Btrfs

在飞牛NAS(fnOS)中,Btrfs是一个极具潜力的文件系统选择。不同于传统的ext4,Btrfs集成了快照、数据校验、在线压缩和灵活的子卷管理功能,特别适合追求数据安全与存储效率的用户。本教程将带你逐一攻克Btrfs的核心特性:快照备份、透明压缩和子卷隔离,让你的NAS更智能、更省空间。

准备工作:确认你的飞牛NAS使用Btrfs

在开始操作前,请确保你的存储池或数据卷已经格式化为Btrfs。

  1. 登录飞牛NAS后台,进入“存储管理” -> “存储空间”。
  2. 查看你的数据盘或卷的“文件系统”类型。如果显示为“Btrfs”,恭喜你,可以继续。如果是“ext4”,你需要备份数据后重新格式化(注意:格式化会清除所有数据)。
  3. 如果尚未创建Btrfs卷,可以在“存储管理”中新建存储池时选择“Btrfs”作为文件系统。

核心功能一:子卷

子卷是Btrfs的基石。你可以把一个Btrfs分区想象成一个大的“容器”,子卷则是容器内独立的“小房间”。每个子卷可以独立进行快照、设置挂载选项,甚至设置不同的压缩算法。

创建子卷

假设你的Btrfs卷挂载在/volume1。我们为重要数据创建一个名为data的子卷。

  1. 通过SSH或飞牛NAS的“文件管理器”中的“终端”功能连接到NAS后台。
  2. 运行以下命令创建子卷:
sudo mkdir -p /volume1/data_share
sudo btrfs subvolume create /volume1/data_share

注意:mkdir 只是创建了目录,btrfs subvolume create 才是真正创建子卷。你可以通过 btrfs subvolume list /volume1 查看所有子卷。

  1. 现在,/volume1/data_share 就是一个独立的子卷了。你可以将共享文件夹直接指向这个子卷路径。

子卷的好处

隔离数据:不同应用的数据放在不同子卷,比如 docker_datamediabackup。即使一个子卷被写满,也不会影响其他子卷的正常读写。更重要的是,快照可以针对单个子卷进行,避免备份整个大分区。

核心功能二:快照

快照是Btrfs的杀手锏。它能在瞬间记录子卷在某一时刻的状态,并且几乎不占用额外空间(只有修改的数据才会占用增量空间)。

创建手动快照

我们为刚才的data_share子卷创建一个快照。

  1. 在NAS上创建一个存放快照的目录,通常建议放在同一个Btrfs卷下,但不要放在被快照的子卷内部。
sudo mkdir -p /volume1/snapshots
  1. 创建只读快照(推荐,防止误修改):
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的“计划任务”可以帮你实现自动化。

  1. 进入“控制面板” -> “任务计划”。
  2. 新增一个“用户自定义脚本”任务,设置执行周期,例如每天凌晨2点。
  3. 在脚本内容中输入:
#!/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支持在线透明压缩,意味着数据在写入磁盘前会被自动压缩,读取时自动解压,对用户和应用程序完全透明。这能显著节省存储空间,尤其适合存放文本文件、日志、备份包等可压缩性高的数据。

开启压缩(新挂载)

如果你需要为一个现有的子卷开启压缩,需要重新挂载它。

  1. 查看当前子卷挂载点:mount | grep /volume1/data_share
  2. 临时卸载子卷(确保没有进程在使用):
sudo umount /volume1/data_share
  1. 重新挂载并启用压缩(推荐zstd算法,速度快、压缩比高):
sudo mount -o compress=zstd /dev/sdX /volume1/data_share

注意:将/dev/sdX替换为你实际的设备路径(如/dev/sda1),可通过 lsblk 查看。

永久开启压缩

为了让重启后依然生效,需要修改fstab文件。

  1. 备份/etc/fstabsudo cp /etc/fstab /etc/fstab.bak
  2. 编辑/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
  1. 保存退出,然后执行 sudo mount -a 测试配置是否正确。如果无报错,重启后压缩将自动生效。

验证压缩效果

使用 compsize 工具查看压缩率。

sudo btrfs filesystem show /volume1/data_share
sudo compsize /volume1/data_share

输出会显示原始大小、压缩后大小和压缩比。通常文本文件的压缩比可达2:1甚至更高。

高级技巧:结合使用

将子卷、快照和压缩结合使用,效果更佳。

例如,为Docker的数据目录创建独立子卷并开启压缩:

  1. 创建子卷:sudo btrfs subvolume create /volume1/docker_data
  2. 挂载并启用压缩:sudo mount -o compress=zstd /dev/sda1 /volume1/docker_data
  3. 将Docker的数据目录指向这个子卷。
  4. 日常通过计划任务对/volume1/docker_data做快照,实现快速回滚。

这样,Docker的镜像层、容器数据不仅占用空间更小,还能被快照保护,一举两得。

总结

Btrfs为飞牛NAS带来了企业级的数据管理能力。通过子卷实现数据隔离,利用快照实现秒级备份与恢复,借助透明压缩节省存储空间。掌握这三个核心功能,你的NAS将从简单的文件服务器升级为高效、可靠的数据中心。建议从创建第一个子卷和手动快照开始,逐步尝试自动化脚本和压缩配置。记得,在操作前备份重要数据,实践出真知。