跳转到内容

系统盘坏了:重装并接回数据盘 ​

OMV 把系统盘和数据盘分开,正是为了这一天:系统盘坏了,换一块盘重装系统,数据盘接回来,数据都还在。读完这一篇,你能在不碰数据盘的前提下重装 OMV,把已有的文件系统挂回来,并且让用户、共享文件夹和服务回到原来的样子。

开始之前 ​

  • 你需要:一块新的系统盘(或者重新安装用的旧盘)、OMV 安装 U 盘,以及尽可能多的旧系统信息(见下面「重装之前先抢救信息」)。
  • 先确认真的是系统盘的问题,而不是数据盘。症状和判断见 系统无法启动 和 磁盘或文件系统不见了;数据盘上的文件系统变成只读,见 文件系统变成只读;阵列降级,见 RAID 降级。
  • 数据盘出了问题时,原则是先只读、先把数据复制出来,再做 fsck、btrfs check 这类修复,见 用救援系统抢救数据。不要用重装去「试试看」。
  • 本文以 OMV 8 为例。旧系统是 OMV 7 的话,可以直接装 OMV 8,数据盘上的文件系统与 OMV 版本无关。

安装之前,先把所有数据盘从机器上拔掉

影响范围:OMV 的 ISO 安装器会选第一块可用的磁盘,清空它并占用整块盘。如果数据盘还连着,一次误选就会抹掉数据盘上的文件系统和 RAID 元数据,无法恢复。

前置条件:安装前关机,拔掉(或断开数据线)除新系统盘以外的所有磁盘;数据最好有独立备份,因为这是整个流程里风险最高的一步;核对新系统盘的型号和序列号。

怎么回退:没有回退。万一误装到数据盘上,立刻停止写入,不要再做任何操作,按 用救援系统抢救数据 处理,并且要接受数据可能已经丢失。

会丢什么,不会丢什么 ​

位置内容重装后
数据盘上所有文件、文件系统、RAID 阵列元数据、LUKS 头、ZFS 池信息、文件上的权限与 ACL保留
系统盘上OMV 配置数据库 config.xml:共享文件夹的定义和权限、SMB/NFS/rsync 等服务设置、计划任务、通知、S.M.A.R.T. 设置、网络、证书丢失,要重建
系统盘上用户和用户组本身(UID、密码、组成员)、SMB 密码库、SSH 主机密钥丢失,要重建
系统盘上插件及其配置、Docker 的镜像和命名卷(默认在 /var/lib/docker)丢失,要重新安装
数据盘上(如果放在那里)Compose 的 yml 文件和应用数据(appdata)保留,可以导入回 Compose 插件

规律是:存在数据盘上的东西保留,存在系统盘上的丢失。 这也是为什么要把 Compose 文件、应用数据放进数据盘上的共享文件夹,见 Compose 插件设置详解。

重装之前先抢救信息 ​

如果旧系统盘还能被读取(例如它还能挂载,或者只是系统坏了),先把下面这些文件复制到别的地方:

文件用途
/etc/openmediavault/config.xml共享文件夹名称与权限、服务设置,作为参考对照着重建,不要整个覆盖到新系统(见常见问题)
/etc/passwd、/etc/groupUID、GID 与用户、组的对应关系,对齐 UID 的依据
/etc/ssh/ssh_host_*SSH 主机密钥,恢复后客户端不会提示主机密钥变了
/etc/mdadm/mdadm.conf、/etc/fstab阵列和挂载的参考

config.xml 里有明文密码和证书私钥,要当作机密保管。

如果旧系统盘已经完全读不出来,也不要紧:用户和组的对应关系,可以从数据盘上文件的数字属主反推(见下面「重建用户和用户组」);共享文件夹的名称和路径靠你的记忆、备份或者数据盘上的目录结构。

系统还正常的时候,现在就做这件事

下面这几条命令把重建需要的信息导出来,保存到别的电脑上。系统盘是否坏,就取决于你有没有做过这一步:

sh
lsblk -o NAME,SIZE,MODEL,SERIAL,UUID,FSTYPE,MOUNTPOINTS > rebuild-disks.txt
getent passwd | awk -F: '$3 >= 1000 && $3 < 65534' > rebuild-users.txt
getent group  | awk -F: '$3 >= 100  && $3 < 65534' > rebuild-groups.txt
omv-confdbadm read --prettify conf.system.sharedfolder > rebuild-shares.json
omv-rpc ShareMgmt enumerateSharedFolders | jq -r '.[] | [.name, .absdirpath, .reldirpath] | @tsv' > rebuild-shares.tsv
omv-sysinfo > rebuild-sysinfo.txt

另外,系统盘本身的备份是更好的办法,见 备份系统盘:backup 插件。

操作步骤 ​

一、安装新系统 ​

  1. 关机,拔掉所有数据盘,装上新的系统盘。
  2. 按 用 ISO 安装 OMV 安装,装好后完成 第一次登录:修改默认密码,把系统更新到最新,固定 IP。
  3. 先别急着装插件、建共享。

二、接回数据盘 ​

  1. 关机,接回所有数据盘,开机。
  2. 登录 Web 界面,到 存储器 → 磁盘(Storage → Disks),用型号和序列号确认每一块数据盘都被识别了。少了哪块,先检查线缆和供电,不要继续。

三、恢复存储层 ​

按数据盘上原来的结构,选对应的做法:

原来的结构恢复办法
单盘 EXT4、XFS、Btrfs直接到下一步挂载
软 RAID(md)在 系统 → 插件(System → Plugins)安装 openmediavault-md(如果界面里没有 存储器 → RAID 管理,Storage → Multiple Device),阵列会从成员盘上的元数据自动识别。看到阵列之后再挂载它上面的文件系统。不要用 mdadm --create 重新创建,那会覆盖元数据,见 软件 RAID:用 md 插件组阵列。阵列显示降级时,换盘用 RAID 管理 里的恢复(Recover)把新盘加进阵列,新增和移除在降级的阵列上可能是灰的,见 RAID 降级 和 软件 RAID 维护:换盘、扩容与重建
LVM安装 openmediavault-lvm2,逻辑卷出现后再挂载
LUKS 加密安装 openmediavault-luksencryption 并用原来的密码或密钥文件解锁,见 LUKS 磁盘加密。密码丢了,数据就拿不回来
ZFS安装 ZFS 插件并导入池,见 ZFS 插件。池提示上次由另一个系统使用时,先确认旧系统已经关机,再按插件的说明强制导入
mergerfs、SnapRAID安装对应插件,用相同的成员盘和相同的名称重新建立。SnapRAID 的内容文件和校验文件在数据盘上,名称对上才能继续使用,见 mergerfs 和 SnapRAID

四、挂载已有的文件系统 ​

到 存储器 → 文件系统(Storage → File Systems),已有但还没有挂载的文件系统会列在这里(状态提示以界面显示为准,例如「检测到文件系统」)。点工具栏上的挂载(Mount,提示文字是「挂载现有文件系统」),在文件系统(File system)下拉里选出要挂载的那一个,保存,再点击黄色提示条上的应用(Apply)。挂载后的路径是 /srv/dev-disk-by-uuid-<UUID>。不要点创建(Create),创建会格式化。

详细见 挂载已有数据的硬盘。挂载时可以顺便设置用量警告阈值(Usage Warning Threshold)。

五、重建用户和用户组(对齐 UID) ​

数据盘上的文件记录的是数字的 UID 和 GID,不是用户名。新系统里用户的 UID 必须和旧系统一致,文件的属主才对得上。界面里新建单个用户没有 UID 字段,所以用导入。

  1. 先弄清原来的 UID 和 GID。有 rebuild-users.txt、/etc/passwd 备份最好;没有的话,从数据盘上读出现有的数字属主:

    sh
    find /srv/dev-disk-by-uuid-<UUID> -xdev -maxdepth 3 -printf '%U %G\n' | sort | uniq -c | sort -rn | head -20

    输出每一行是「数量 UID GID」,数量多的那几组就是主要的用户和组。users 组的 GID 是 100,系统会自动有。

  2. 先导入用户组(指定 GID),再导入用户(指定 UID),格式和注意事项见 批量导入用户。

  3. 用户的密码要重新设置,包括 SMB 密码。SMB 密码库在系统盘上,随系统盘一起丢了,必须通过 OMV 为每个用户重新设置密码。

导入之后,到数据盘上 ls -l 看一眼,原来显示为数字的属主,现在应该显示成用户名。如果仍然是数字,说明 UID 没对上。

六、重建共享文件夹 ​

到 存储器 → 共享文件夹(Storage → Shared Folders),点创建(Create)。每个共享文件夹要和原来一致:

  • 名称:和原来相同,客户端(Windows、Mac、容器)按名称访问。
  • 文件系统:选刚才挂载的那一个。
  • 相对路径(Relative path):选原来的目录。

目录已经存在时,OMV 不会修改它的权限和属主,只有目录不存在时才会新建并设置权限。所以你数据盘上原来的目录权限、ACL 都会原样保留。

共享文件夹的权限(Permissions,即谁可以读写)存在配置数据库里,已经丢失,需要在共享文件夹页或者用户页重新设置,思路见 设置共享文件夹权限。

七、重建服务 ​

按需要重新配置,每一项都对照 config.xml 的参考或截图:

  • SMB/CIFS、NFS、rsync 服务和共享:SMB/CIFS 共享:Windows 与 macOS 访问、NFS 共享:给 Linux 和虚拟化平台用。
  • 计划任务、rsync 任务、S.M.A.R.T. 监控和自检计划、邮件通知,参考 安装后检查清单。
  • 之前装过的插件:先 安装 omv-extras,再逐个安装。
  • Compose 应用:装好 Compose 插件后,在 服务 → Compose → 设置(Services → Compose → Settings)里把 Compose 文件、数据、备份指向原来的共享文件夹,Docker 存储也最好放在数据盘上。然后到 服务 → Compose → 文件(Services → Compose → Files),用预览导入的内容(Preview Import)看一下,再用导入(Import),插件会递归扫描目录,把原来的 compose 文件导入回来,已有的不会重复导入。镜像需要重新拉取,命名卷里的数据如果放在系统盘上就没有了,所以应用数据要放在数据盘的相对路径卷里。
  • SSH 主机密钥:如果你保存了旧的 /etc/ssh/ssh_host_*,恢复之后重启 SSH 服务,客户端就不会提示主机密钥变了。

八、做一次新的备份 ​

重建完成后,马上做两件事:给系统盘做备份(备份系统盘:backup 插件),并把本文开头那组导出命令的结果更新一份,下次就不用抢救了。

检查结果 ​

  • 存储器 → 文件系统 里每个数据文件系统都显示为已挂载,没有「丢失」。
  • 数据盘上的文件,ls -l 显示的属主是用户名,而不是数字。
  • 用一个普通用户通过 SMB 访问共享,能读写应该能读写的目录,读不了不该读的目录。
  • 计划任务、备份、告警邮件都重新设置过,并且发过测试邮件。
  • 重启一次 NAS,所有挂载、共享、容器都能自动恢复。

常见问题 ​

能不能直接把旧的 config.xml 覆盖到新系统上? 不建议。配置里记录了文件系统挂载条目的 UUID、网卡名、证书、插件的节点,和新系统一对不上就会出错,而且官方没有提供配置导入功能。把它当成只读的参考,对着它在界面里重建。

挂载文件系统时,界面没有显示我的盘。 先在 存储器 → 磁盘 确认磁盘被识别,再看有没有安装对应的插件(RAID、LVM、加密、ZFS)。如果是 USB 硬盘,见 外接 USB 硬盘的正确用法。

文件的属主显示成数字,或者用户读不了自己的文件。 UID 没有对齐。核对用户的 UID,和数据盘上数字属主的对应关系,并用导入功能重新创建。批量改属主(chown -R)风险很大,要先有备份,并且只在确认对应关系之后使用。

重装后所有客户端都要求重新输入密码。 正常。用户的密码和 SMB 密码库都需要重建。

数据盘上的 RAID 阵列没有出现。 先在 存储器 → RAID 管理 里看它是不是显示为 inactive,成员盘是否都在。不要用 --force 或 --create 强行拼装,把 mdadm --examine 的输出保存下来,见 RAID 降级 和 用救援系统抢救数据。阵列已经出现但显示降级的,按 软件 RAID 维护:换盘、扩容与重建 换盘。

预防 ​

  • 系统盘用独立的小盘,并且做定期备份,见 备份策略:冗余不是备份。
  • 把 Compose 文件、应用数据放进数据盘的共享文件夹。
  • 导出本文开头那组信息,保存到 NAS 以外的地方。
  • 用批量导入的方式管理用户,把 UID 和 GID 记在文档里。

参考资料 ​

OpenMediaVault 非官方中文使用指南,与 openmediavault 项目及其开发者无隶属关系。