大约一个半月前,我注意到一台 (OpenSuSE 11.3) 服务器中的两个硬盘驱动器快要坏了。根据 SMART 数据进行猜测,我首先替换了 /dev/sdb;为此,我从阵列中移除了驱动器,关闭了服务器,替换了驱动器,重新启动,然后将新驱动器添加到阵列中。到目前为止,一切顺利。如果我没记错的话,我还在这个驱动器上安装了 GRUB。然后我开始替换和重建 /dev/sda。我不记得我是否关闭了它以替换 /dev/sda(驱动器位于热插拔托架/托架中),但在第一次重新启动时,我遇到了各种 GRUB 问题,导致无法启动操作系统。我终于启动了它,但注意到一些奇怪的行为。例如,根据 /proc/mdstat,阵列中只有一个驱动器处于活动状态:
openvpn01:/home/Kendall # cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sdb3[2]
20972784 blocks super 1.0 [2/1] [_U]
bitmap: 1/161 pages [4KB], 64KB chunk
md1 : active raid1 sdb2[2]
5245208 blocks super 1.0 [2/1] [_U]
bitmap: 2/11 pages [8KB], 256KB chunk
md0 : active raid1 sdb1[2]
1052212 blocks super 1.0 [2/1] [_U]
bitmap: 0/9 pages [0KB], 64KB chunk
unused devices: <none>
嗯,好吧,所以我尝试将 /dev/sda 添加回阵列中:
mdadm --manage /dev/md0 --add /dev/sda1
mdadm: add new device failed for /dev/sda1 as 3: Device or resource busy
这很奇怪...但请注意 lsof 向我们显示的内容:
openvpn01:/home/Kendall # lsof /dev/sda3 | head -15
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 8,3 4096 128 /
init 1 root rtd DIR 8,3 4096 128 /
init 1 root txt REG 8,3 39468 404103 /sbin/init
init 1 root mem REG 8,3 91812 33849572 /lib/libaudit.so.1.0.0
init 1 root mem REG 8,3 17392 33648690 /lib/libdl-2.11.2.so
init 1 root mem REG 8,3 1674953 33683537 /lib/libc-2.11.2.so
init 1 root mem REG 8,3 55024 33994082 /lib/libpam.so.0.82.2
init 1 root mem REG 8,3 120868 33828745 /lib/libselinux.so.1
init 1 root mem REG 8,3 143978 33683531 /lib/ld-2.11.2.so
kthreadd 2 root cwd DIR 8,3 4096 128 /
...因此,看起来根文件系统实际上是从 /dev/sda3 运行的。在 MD-RAID 设置中,md2 是根 FS 阵列,而 /dev/sd[ab]3 是阵列中的分区。查看挂载
openvpn01:/home/Kendall # cat /proc/mounts
/dev/sda3 / xfs rw,relatime,attr2,noquota 0 0
/dev/md1 /boot ext4 rw,relatime,user_xattr,acl,barrier=1,data=ordered 0 0
/dev/sda3 肯定已安装根文件系统,但 /boot 正在使用该阵列。
此外,当我通过 yast2 进入引导加载程序配置屏幕并查看引导加载程序详细信息时,它在“磁盘顺序设置”下仍然有旧驱动器(我通过序列号知道这一点)。
基本上,现在我担心的是阵列。操作系统认为阵列中只有一个驱动器,而这并不是安装根文件系统的驱动器!我计划在接下来的几天内尝试修复剩余的 GRUB 问题,但随后我担心阵列上的数据会发生什么;基本上,它能否在不破坏我的任何/所有数据的情况下重建自身?
希望我已经提供了足够的细节;如果没有,请发表评论,我会添加任何必要的信息。
谢谢,
肯德尔
答案1
可能发生的情况是,您的 initrd 决定用作/dev/sda3
根文件系统,但是在构建 MD 阵列时,/dev/sdb3
其修改时间较晚,/dev/sda3
并用于支持阵列。
# mdadm --examine /dev/sd??
并# mdadm --detail /dev/md?
可能给你提供一些关于正在发生的事情的额外线索。
最安全的方法是按照 Zoredache 的建议从实时 CD 进行备份和重建。确保备份 /dev/sda? 和 MD 阵列 - 其中一个或两个可能比另一个具有更新的数据。