我尝试从 mdadm raid 灾难中恢复,该灾难发生在从 ubuntu 服务器 10.04 迁移到 12.04 时。我从 dmesg 日志中知道了设备的正确顺序,但根据这些信息,我仍然无法访问数据。
超级块看起来很乱;每个磁盘的 mdadm --examine 都处于打开状态askubuntu 上的这个问题
通过检查备用存储的原始内容,我发现我的数据的开头(在我的情况下是 LUKS 容器)位于相对于 raid 中第一个分区的开头的位置 0x22000。
问题:向“mdadm --create”发出哪些选项组合来重新创建以给定偏移量开始的 mdadm?位图大小是多少?
PS. 粘贴系统健康时 syslog 的相关信息这里。
答案1
似乎不需要任何工具来设置 RAID 有效负载在任何给定偏移上的起始位置。问题源于 3.00 以上和以下 mdadm 版本之间的偏移变化。目前看来,由于偏移不同,3.00 以上版本的 mdadm(我尝试了 3.24)无法重新创建旧版 mdadm 所做的布局。需要使用旧版。
问题首先出现在 Ubuntu 12.04 内核的一个已知错误中,该错误在某些情况下(例如在发行版升级期间发现...)会覆盖超级块。解决方案是避免使用从 3.2.0-22.35 到 3.2.0-24.37 的内核,顺便说一下,其中包括 Ubuntu 12.04 Mini-cd 安装程序上使用的内核。
这是[电子邮件保护]邮件列表中,Robin Hill 先生给了我解决方案:
看起来你已经受到这里提到的错误的影响: http://neil.brown.name/blog/20120615073245
您已获得重建阵列所需的大部分数据。我认为只是缺少块大小。这可能是 512K,因为阵列使用的是 1.2 超级块,但如果您使用的是旧版 mdadm,则可能是 64K。
您的数据偏移量为 272 个扇区,这意味着您需要使用较旧的 mdadm 版本来重新创建阵列。较新的版本使用 2048 个扇区,但看起来 3.0 版本使用 272 个扇区,因此如果可能的话,请获取该版本的副本。
假设您的驱动器按与以前相同的顺序编号,则创建命令将是:
mdadm -C /dev/md5 -e 1.2 -l 5 -n 5 /dev/sd{b,f,c,e,d}6 \ --assume-clean --uuid=a3945c40:73237cd6:3d61998e:8f773d03
和
mdadm -C /dev/md6 -e 1.2 -l 6 -n 5 /dev/sd{b,f,c,e,d}5 \ --assume-clean --uuid=2a8fd2df:3ad53552:e8b80ecf:a46d93a2
确保使用花括号格式而不是方括号列出磁盘 - 这将确保顺序保持不变。还要确保
--assume-clean
使用它来防止重建启动并丢失数据。重新创建阵列后,
fsck -n
在阵列上运行以检查详细信息是否正确。 如果不正确,请停止阵列并尝试再次重新创建,添加“-c 64”以将块大小设置为 64K。一旦您将它们启动并且 fsck 显示干净,您就可以使用重新添加位图
mdadm -G /dev/mdX --bitmap=internal
。请先阅读 Neil 的博客文章,因为我可能遗漏了一些内容。
因此,从 XUbuntu 10.04 实时 CD 启动后,我能够使用给定的命令成功重新创建阵列,并访问我的所有数据。
值得注意的是,旧版 mdadm 仅适用于娱乐数组。可以使用 12.04 live CD 正常访问该数组(使用通常的mdadm --assemble --scan
)。
如果想要将 raid 的布局更改为较新的布局(偏移 2048 个扇区),则路径很长:
我知道更新现有阵列中偏移位置的唯一方法是一次使一个磁盘发生故障,将超级块清零,然后使用新的 mdadm 将它们重新添加到阵列中。重新添加后,它将使用新的偏移位置。如果您有备用磁盘和足够新的内核版本,则可以使用先发制人的替换选项,这将避免在没有完整奇偶校验可用的情况下运行。
...希望这篇文章可以让至少一位系统管理员从 10.04 升级到 12.04 时避免心脏病发作 ;-)
另请参阅 askubuntu 上的相关问题:10.04 升级到 12.04 后 mdadm 失败。