这是一个非常硬核且实用的操作。很多 Unraid 老用户(包括我)都经历了从 Btrfs 迁移到 ZFS 的过程。
虽然 Unraid 提供了“Mover”机制来移动文件,但对于系统核心目录(如 appdata, system),我强烈建议结合命令行(Terminal)进行操作,比单纯依赖 GUI 的 Mover 更可控、更透明,也更不容易出错。
以下是一份“保姆级”且兼具工程师视角的迁移指南。
准备工作:安全第一
在开始任何操作之前,请务必完成以下三点。别偷懒,数据无价。
- 备份 USB 引导盘:在
Main->Boot Device->Flash->Backup。 - 备份核心数据:如果你的 Cache 盘里有极其重要的 Docker 映射文件,建议先手动打包下载到本地电脑一份。
- 确保阵列有空间:检查你的机械硬盘阵列(Array)剩余空间是否大于缓存池(Cache)的已用空间。
第一阶段:疏散缓存池 (Evacuate)
我们需要把 Cache 盘里的所有数据无损地移动到机械硬盘阵列上,从而腾空 Cache 盘进行格式化。
1. 停止所有服务
必须解除对文件的占用,否则移动会失败或导致数据损坏。
- 停止 Docker:
Settings->Docker->Enable Docker设置为 No ->Apply。 - 停止 VM:
Settings->VM Manager->Enable VMs设置为 No ->Apply。
2. 修改 Share 设置(关键步骤)
我们需要告诉 Unraid:“把这些 Share 的数据从 Cache 赶回 Array”。
针对通常驻留在 Cache 的 Share(通常是 appdata, domains, system,以及你自己设置的下载目录):
- 进入
Shares选项卡。 - 点击
appdata。 Unraid 6.12+ 设置方法:
- Primary Storage (主存储):设置为
Array。 - Secondary Storage (辅助存储):设置为
Cache(或你的池名字)。 - Mover Action:设置为
Move(或者Secondary to Primary)。 - 解释:这告诉 Mover,数据应该呆在阵列里,如果在 Cache 里发现了,就把它移过去。
- Primary Storage (主存储):设置为
- 对
domains和system重复上述操作。
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 盘应该是空的了。
- 停止阵列:在
Main界面点击Stop。 修改文件系统:
- 点击 Cache 池里的设备(例如
Cache或具体的硬盘)。 - 将
File System type修改为 ZFS。 - 进阶提示:如果你是多盘,这里可以配置 RAIDZ 或 Mirror 模式,ZFS 会自动处理。
- 点击 Cache 池里的设备(例如
- 启动阵列:点击
Start。 执行格式化:
- 界面底部会提示
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 里,请把它们搬回来。
- Primary Storage:设置为
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/下的文件是否完整。 - 启动 Docker:
Settings->Docker->Enable->Yes。 - 启动 VM:同上。
第四阶段:ZFS 专属优化 (Post-Optimization)
既然换了 ZFS,不做这点优化就亏了。
开启压缩 (LZ4):
- 在
Main界面点击 Cache 池的名字(不是硬盘名,是 Pool 的名字)。 - 找到
Compression,选择 lz4(默认通常是 off)。 - 注意:这只对新写入的数据生效。对于刚移回去的数据,你可以以后再折腾,或者在移回去之前就开启此设置。
- 在
配置快照 (Snapshot):
- 去
Apps商店下载 "ZFS Master" 插件。 - 它可以让你直观地看到 ZFS 的数据集(Datasets),并配置定期快照。
- 设置
appdata每小时快照一次,保留 24 小时。哪怕你在折腾 HomeAssistant 时把配置删光了,也能一键回滚。
- 去
总结核心流程
- 停服务 (Docker/VM)。
- 设 Mover (Array为主,Cache为辅,Move到Array)。
- 运行 Mover (确保 Cache 清空)。
- 停阵列,改 ZFS,格式化。
- 设 Mover (Cache为主,Array为辅,Move到Cache)。
- 运行 Mover (数据回家)。
- 启服务。
祝你的 Unraid 进化成功!如果在 rsync 过程中遇到权限报错,记得在命令前加 sudo 或者直接以 root 身份操作。
评论 (0)