Unraid 缓存池从 Btrfs 无损迁移到 ZFS
侧边栏壁纸
  • 累计撰写 9 篇文章
  • 累计收到 1 条评论

Unraid 缓存池从 Btrfs 无损迁移到 ZFS

坑飞
2025-12-27 / 0 评论 / 25 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2025年12月27日,已超过38天没有更新,若内容或图片失效,请留言反馈。

这是一个非常硬核且实用的操作。很多 Unraid 老用户(包括我)都经历了从 Btrfs 迁移到 ZFS 的过程。

虽然 Unraid 提供了“Mover”机制来移动文件,但对于系统核心目录(如 appdata, system),我强烈建议结合命令行(Terminal)进行操作,比单纯依赖 GUI 的 Mover 更可控、更透明,也更不容易出错。

以下是一份“保姆级”且兼具工程师视角的迁移指南。

准备工作:安全第一

在开始任何操作之前,请务必完成以下三点。别偷懒,数据无价。

  1. 备份 USB 引导盘:在 Main -> Boot Device -> Flash -> Backup
  2. 备份核心数据:如果你的 Cache 盘里有极其重要的 Docker 映射文件,建议先手动打包下载到本地电脑一份。
  3. 确保阵列有空间:检查你的机械硬盘阵列(Array)剩余空间是否大于缓存池(Cache)的已用空间。

第一阶段:疏散缓存池 (Evacuate)

我们需要把 Cache 盘里的所有数据无损地移动到机械硬盘阵列上,从而腾空 Cache 盘进行格式化。

1. 停止所有服务

必须解除对文件的占用,否则移动会失败或导致数据损坏。

  • 停止 DockerSettings -> Docker -> Enable Docker 设置为 No -> Apply
  • 停止 VMSettings -> VM Manager -> Enable VMs 设置为 No -> Apply

2. 修改 Share 设置(关键步骤)

我们需要告诉 Unraid:“把这些 Share 的数据从 Cache 赶回 Array”。

针对通常驻留在 Cache 的 Share(通常是 appdata, domains, system,以及你自己设置的下载目录):

  1. 进入 Shares 选项卡。
  2. 点击 appdata
  3. Unraid 6.12+ 设置方法

    • Primary Storage (主存储):设置为 Array
    • Secondary Storage (辅助存储):设置为 Cache (或你的池名字)。
    • Mover Action:设置为 Move (或者 Secondary to Primary)。
    • 解释:这告诉 Mover,数据应该呆在阵列里,如果在 Cache 里发现了,就把它移过去。
  4. domainssystem 重复上述操作。

3. 执行 Mover

  • 回到 Main 界面。
  • 点击底部的 Move 按钮。
  • 观察:即使界面提示完成,建议在终端输入 watch -n 5 "ls -l /mnt/cache/appdata" 或者查看 Main 界面 Cache 盘的读写速度,确盘读写归零、已用空间接近 0 才是真的完了。

4. 工程师的“兜底”检查 (Terminal)

有时候 Mover 会因为权限或隐藏文件漏掉东西。打开 Unraid 右上角的终端图标 >_,运行以下命令检查 Cache 是否真的一滴都不剩了:

Bash

ls -la /mnt/cache/

如果输出结果除了 . 和 .. 还有其他文件夹(特别是 system 或 appdata),说明没移干净。

手动暴力移动方案(推荐):

如果 Mover 不给力,直接用 rsync 搬运剩余数据到阵列的某个磁盘(比如 disk1):

Bash

# 创建一个临时目录
mkdir -p /mnt/disk1/temp_cache_backup

# 使用 rsync 归档模式移动数据(保留权限和时间戳)
rsync -avPX /mnt/cache/ /mnt/disk1/temp_cache_backup/

# 确认数据都在 disk1 后,手动删除 cache 内容(慎用,确保你备份了!)
rm -rf /mnt/cache/*

第二阶段:格式化为 ZFS (Transformation)

现在 Cache 盘应该是空的了。

  1. 停止阵列:在 Main 界面点击 Stop
  2. 修改文件系统

    • 点击 Cache 池里的设备(例如 Cache 或具体的硬盘)。
    • File System type 修改为 ZFS
    • 进阶提示:如果你是多盘,这里可以配置 RAIDZ 或 Mirror 模式,ZFS 会自动处理。
  3. 启动阵列:点击 Start
  4. 执行格式化

    • 界面底部会提示 Unmountable: Unsupported partition layout
    • 勾选确认框,点击 Format
    • 等待格式化完成,现在你拥有了一个尊贵的 ZFS 存储池。

第三阶段:数据回迁 (Repopulate)

现在要把数据搬回这个高性能的 ZFS 池,并恢复服务。

1. 修改 Share 设置(把方向反过来)

再次进入 Shares 选项卡,修改 appdata, domains, system

  • Unraid 6.12+ 设置方法

    • Primary Storage:设置为 Cache
    • Secondary Storage:设置为 Array
    • Mover Action:设置为 Move (或者 Secondary to Primary)。
    • 解释:这告诉 Mover,数据应该呆在 Cache 里,现在它们在 Array 里,请把它们搬回来。

2. 执行 Mover 或 手动移回

  • 方法 A (Mover):点击 Main -> Move。等待数据搬运完成。
  • 方法 B (手动 rsync - 推荐):如果你刚才用了手动备份方案:

    Bash

    # 把刚才备份的数据搬回新的 ZFS cache
    rsync -avPX /mnt/disk1/temp_cache_backup/ /mnt/cache/
    
    # 搬运完后检查目录结构是否正确(不应该包含 temp_cache_backup 这一层)
    # 比如 /mnt/cache/ 下面应该是 appdata, system 等

    (注意:如果你用了 rsync 搬回去,记得把 Share 设置里的 Secondary Storage 改为 None 或 Array,防止 Mover 逻辑混乱)

3. 验证与启动

  • 检查 /mnt/cache/ 下的文件是否完整。
  • 启动 DockerSettings -> Docker -> Enable -> Yes
  • 启动 VM:同上。

第四阶段:ZFS 专属优化 (Post-Optimization)

既然换了 ZFS,不做这点优化就亏了。

  1. 开启压缩 (LZ4)

    • Main 界面点击 Cache 池的名字(不是硬盘名,是 Pool 的名字)。
    • 找到 Compression,选择 lz4(默认通常是 off)。
    • 注意:这只对新写入的数据生效。对于刚移回去的数据,你可以以后再折腾,或者在移回去之前就开启此设置。
  2. 配置快照 (Snapshot)

    • Apps 商店下载 "ZFS Master" 插件。
    • 它可以让你直观地看到 ZFS 的数据集(Datasets),并配置定期快照。
    • 设置 appdata 每小时快照一次,保留 24 小时。哪怕你在折腾 HomeAssistant 时把配置删光了,也能一键回滚。

总结核心流程

  1. 停服务 (Docker/VM)。
  2. 设 Mover (Array为主,Cache为辅,Move到Array)。
  3. 运行 Mover (确保 Cache 清空)。
  4. 停阵列,改 ZFS,格式化
  5. 设 Mover (Cache为主,Array为辅,Move到Cache)。
  6. 运行 Mover (数据回家)。
  7. 启服务

祝你的 Unraid 进化成功!如果在 rsync 过程中遇到权限报错,记得在命令前加 sudo 或者直接以 root 身份操作。

0

评论 (0)

取消