外观
从群晖、TrueNAS 迁移到 OMV
换一套 NAS 系统,最重要的是数据不丢、权限不乱。读完这一篇,你能选择合适的迁移方式,把数据用 rsync 搬到 OMV,在拆盘直连的时候保证旧盘不被改动,并且知道哪些东西(套件数据、权限、快照)不能直接带过来。
开始之前
- 新旧两台 NAS 要同时可用。旧 NAS 在新 NAS 验证完成之前不要动,至少保留几周。
- 在 OMV 上先准备好目标:数据盘、文件系统和共享文件夹,见 OMV 的存储模型:从磁盘到共享、共享文件夹:OMV 共享的基本单位。
- 本文的命令在 OMV 的 shell(root 身份)里执行。涉及旧 NAS 磁盘的内容,是按各系统的官方文档和通用的 Linux 做法整理的,没有在实机上验证,动手前先用不重要的数据演练。
迁移的两个大坑:方向写反,以及改动了旧盘
影响范围:rsync 是单向同步。源和目标写反,或者带上 --delete,会用空目录或旧数据覆盖、删除新数据。拆盘直连时,如果旧盘被意外写入、初始化或者「修复」,旧 NAS 上的数据就无法恢复。
前置条件:开始前确认旧 NAS 上的数据有独立备份;rsync 命令先用 -n(试运行)看一遍输出;旧盘只做只读挂载。
怎么回退:网络拷贝时,旧 NAS 的数据始终没有被改动,拷错了删掉目标重来即可。拆盘直连时,只要保持只读,旧盘就原样可用,装回旧 NAS 即可。绝不要把旧盘接到电脑上后点「初始化」「格式化」,也不要对它运行 fsck、mdadm --create、btrfs check --repair 这类会写入的命令。
先选路线
| 路线一:网络拷贝(推荐) | 路线二:拆盘直连 | |
|---|---|---|
| 做法 | 新旧两台都开机,通过网络用 rsync 复制 | 把旧 NAS 的硬盘拆下来,接到 OMV 机器或者救援系统上,只读挂载后复制 |
| 好处 | 旧 NAS 保持原样,随时能回头;不关心旧盘的结构 | 不受网络速度限制;旧 NAS 已经坏了也能用 |
| 代价 | 速度受网络和旧 NAS 的 CPU 限制 | 需要懂旧盘的结构;有操作错误的风险;要保证旧盘不被改动 |
| 适合 | 旧 NAS 还能正常使用 | 旧 NAS 坏了,或者数据量太大、网络太慢 |
不同来源的磁盘结构和直连可行性:
| 来源 | 磁盘上的结构 | 在 OMV 上能不能直接读 |
|---|---|---|
| 群晖 DSM | md 软 RAID(SHR 在上面还有一层 LVM),文件系统是 Ext4 或 Btrfs | 能,群晖官方有文章介绍用电脑恢复数据的方法 |
| TrueNAS | ZFS 池 | 要装 ZFS 插件,还要检查特性、加密和 ACL,见下文 |
| Unraid | 每块数据盘是独立的 XFS 或 Btrfs(也可能是 ZFS),校验盘不是文件系统 | 单块数据盘可以单独挂载 |
路线一:网络拷贝
准备目标
- 在 OMV 上挂载好数据盘,建好共享文件夹,名称尽量和旧 NAS 的共享一致,客户端的访问习惯就不用改。
- 建好用户和用户组,权限的设计见 三层权限:共享权限、ACL 与文件系统权限。批量创建见 批量导入用户。
- 目标文件系统的剩余空间要大于要迁移的数据量。
选择传输方式
| 方式 | 说明 |
|---|---|
| 在 OMV 上拉取 | 旧 NAS 开启 SSH,在 OMV 上 rsync 通过 SSH 拉取。速度最好,需要在旧 NAS 的管理界面里启用 SSH,具体位置以你的系统版本为准 |
| 把旧 NAS 的共享挂载到 OMV | 用 omv-extras 的远程挂载把旧 NAS 的 SMB 或 NFS 共享挂载到 OMV,再在本机 rsync。通用性最好,不需要 SSH,见 远程挂载:把别的 NAS 和网盘接进来 |
| 旧 NAS 推送到 OMV 的 rsync 服务 | 在 OMV 的 服务 → Rsync → 服务器(Services → Rsync → Server)里建一个模块,模块里的用户(User)和用户组(Group)决定落地文件的属主,见 rsync 服务端:接收其他机器的备份 |
| 用一台电脑中转 | 最简单,也最慢,数据要走两遍网络 |
rsync 命令
下面以「旧 NAS 的共享已经挂载到 OMV 的 /mnt/old-nas」为例,把一个共享的内容复制到 OMV 的共享文件夹里。<...> 要换成你自己的路径,先试运行,再正式运行:
sh
# 1. 试运行,只列出会复制什么,不会真的复制
rsync -rltDhn --info=progress2 \
--exclude='@eaDir' --exclude='#recycle' --exclude='#snapshot' \
/mnt/old-nas/<共享名>/ /srv/dev-disk-by-uuid-<UUID>/<共享文件夹>/
# 2. 确认无误后正式运行,去掉 -n,保留中断后续传的能力
rsync -rltDh --info=progress2 --partial \
--exclude='@eaDir' --exclude='#recycle' --exclude='#snapshot' \
/mnt/old-nas/<共享名>/ /srv/dev-disk-by-uuid-<UUID>/<共享文件夹>/参数的含义:
| 参数 | 含义 |
|---|---|
-r -l -t -D | 递归、保留符号链接、保留修改时间、保留设备文件。这里特意没有用 -a,因为 -a 还会保留属主和权限,而旧 NAS 上的用户编号在 OMV 上并不存在 |
-h | 数字用人类可读的单位显示 |
--info=progress2 | 显示整体进度 |
--partial | 保留没传完的文件,中断后可以续传 |
-n | 试运行,什么都不改 |
--exclude | 排除群晖专有的目录:@eaDir(缩略图和索引)、#recycle(回收站)、#snapshot(快照目录) |
注意事项:
- 源路径末尾的
/很重要:/mnt/old-nas/共享名/表示复制目录里的内容,不带/会多出一层目录。 - 不要加
--delete。迁移是复制,不是同步。 - 数据量大时,用
nohup rsync … > /root/migrate.log 2>&1 &放到后台运行,避免 SSH 断开中断,用tail -f /root/migrate.log看进度。 - 想让落地的文件属于某个用户,可以加
--chown=<用户>:users,需要 root 身份。
拷贝完成后,统一设置权限:在 OMV 里用共享文件夹的权限和 ACL 页面设置,需要递归时见 访问控制列表(ACL)详解,里面写了递归替换的风险。
验证
- 再运行一次带
-n和--itemize-changes的试运行,什么都不应该列出来:
sh
rsync -rltDn --itemize-changes \
--exclude='@eaDir' --exclude='#recycle' --exclude='#snapshot' \
/mnt/old-nas/<共享名>/ /srv/dev-disk-by-uuid-<UUID>/<共享文件夹>/- 对比文件数和总大小:
find <目录> -type f | wc -l,du -sh <目录>。 - 抽样打开几个重要的文件,尤其是照片、文档和数据库文件。
- 重要数据可以加
-c(按校验和比较)再对比一次,耗时很长,只对关键目录做。
路线二:拆盘直连
通用原则
- 只读。 挂载时带
ro,不运行任何会写入的修复命令。 - 别让 OMV 自动接管。 把旧 NAS 的磁盘接到正在运行的 OMV 上,系统可能自动识别和组装其中的 RAID。更稳妥的做法是用救援系统启动,在里面只读挂载,见 用救援系统抢救数据。
- 把所有成员盘都接上。RAID 或 SHR 要所有盘(热备盘除外)同时在。
- 先查 S.M.A.R.T.,硬盘本身有问题,先备份再说。
群晖
群晖的数据卷是标准的 Linux 软 RAID,SHR 在 RAID 上还有一层 LVM,所以能在 Linux 上识别。官方知识库有一篇 How can I use a PC to recover data when my Synology NAS malfunctions?,适用于 DSM 6.2.x 及以上、使用 Btrfs 或 Ext4 的卷,用 Ubuntu 18.04,不适用于使用了可读写 SSD 缓存的卷。它的步骤是:安装 mdadm 和 lvm2,组装 RAID 并激活卷组,用 cat /proc/mdstat 和 lvs 找到设备路径,最后只读挂载。
这里对官方步骤做一个保守的调整:官方用的是 mdadm -AsfR && vgchange -ay,其中 -f 是强制组装,-R 是允许缺盘运行。mdadm 手册对 --force 的警告是:需要强制才能启动的阵列「可能包含数据损坏」。所以先试不带强制的做法,不行再考虑:
sh
mdadm --assemble --scan --readonly # 只读组装,不改动成员盘
cat /proc/mdstat # 查看识别出的阵列
vgchange -ay # 激活 LVM(SHR 才有)
lvs # 看逻辑卷,设备路径形如 /dev/vg1000/lv
mkdir -p /mnt/syno
mount -o ro /dev/<设备路径> /mnt/syno没有 LVM 的普通 RAID,设备路径就是 /dev/mdX。Btrfs 卷里,群晖的共享文件夹通常是一个子卷,复制时进入对应的子目录。数据挂载好之后,用 rsync 复制到 OMV 的数据盘,命令同上。
TrueNAS
TrueNAS 的数据在 ZFS 池里。在 OMV 上需要先安装 ZFS 插件,见 ZFS 插件。先只列出可导入的池,这个命令不会导入任何东西:
sh
zpool import确认池和它的状态正常之后,以只读方式导入,并把挂载点放到一个临时目录下:
sh
zpool import -o readonly=on -R /mnt/truenas <池名>-o readonly=on 让池以只读方式导入,-R 设置临时的根目录。注意:
- 池提示上次由另一个系统使用时,说明没有正常导出。确认旧 NAS 已经关机,不会同时使用这个池,才可以考虑强制导入(
-f)。 - 创建池的系统比 OMV 的 OpenZFS 新时,池里启用的新特性可能不被支持,导入会失败。
- 启用了 ZFS 原生加密的数据集,需要密钥才能读。老版本 TrueNAS(CORE)用 GELI 做的整盘加密,不能在 Linux 上读。
- TrueNAS 的数据集可能使用 NFSv4 ACL,在 OMV 上可能无法完整识别。数据能读,权限要重建。具体以
zfs get acltype <数据集>的结果为准,这一点没有在实机上验证。
导入之后同样用 rsync 复制。拷完用 zpool export <池名> 导出。
Unraid
Unraid 的每块数据盘是独立的文件系统,可以单独挂载,只读挂载后用 rsync 复制即可。校验盘(parity)上没有文件系统,不需要处理。
不能直接迁移的东西
| 内容 | 说明 |
|---|---|
| 套件、应用的数据库 | 例如群晖 Photos、Drive、Moments 的索引和数据库,只能迁移文件本身,应用里的整理、标签、分享要重新做。用 Immich、Nextcloud 等替代时,用它们自己的导入功能 |
| 用户和密码 | 要在 OMV 里重建,密码重新设置 |
| 权限和 ACL | 数字属主不同,Windows ACL 和 NAS 专有的权限信息通常无法被 OMV 直接使用,要按 OMV 的权限模型重新设计 |
| 快照 | Btrfs 或 ZFS 的快照是文件系统内部的,不会被带过来。要保留历史版本,在旧系统上从快照里单独复制出来 |
| 计划任务、备份任务 | 要在 OMV 上重新配置,见 备份策略:冗余不是备份 |
检查结果
- OMV 上的共享里,文件数和总大小与旧 NAS 一致,抽样打开没有问题。
- 在客户端上通过 SMB 访问新的共享,权限符合预期。
- 迁移完成后,OMV 上做了第一次备份,见 备份策略:冗余不是备份。
- 旧 NAS 保留到新 NAS 稳定运行一段时间之后再处理。
常见问题
迁移后文件的属主显示成数字。 用了 -a、-o 之类会保留旧属主的参数,或者源和目标的用户编号对不上。按本文的方法不保留属主,之后用 OMV 统一设置。
文件名乱码或者有非法字符。 来源系统的文件名编码和 OMV 不同,或者含有 Linux 不允许的字符。这种文件需要在来源端先改名。
拷贝速度很慢。 看旧 NAS 的 CPU 是否跑满,是否是通过 Wi-Fi 连接,大量小文件天然比大文件慢。
拆盘直连时,系统提示要初始化硬盘。 不要初始化。这只是系统看不懂群晖或 ZFS 的格式,数据都还在。