我的 Ubuntu 服务器出现了磁盘故障。托管商的技术人员很快就帮我安装了新硬盘。
然后我按照他们页面上的说明将新磁盘集成到 raid 中。它开始与这个问题的答案类似(如何快速将 GPT 分区方案从一个硬盘复制到另一个硬盘?)将分区表从旧磁盘复制到新磁盘:
sgdisk -R /dev/sdY /dev/sdX
sgdisk -G /dev/sdY
我很确定我没有混淆新旧驱动器。然后我尝试使用以下命令将新磁盘集成到 raid 中
mdadm /dev/md0 -a /dev/sda1
该命令失败。我重新启动才能获取 sda 上的新分区。但事情到此结束。系统将无法再启动。我可以访问救援系统,但我完全不知道要做什么才能启动并运行我的系统。
看起来我的文件系统可能已损坏?
fsck /dev/sdb
fsck from util-linux 2.25.2
e2fsck 1.42.12 (29-Aug-2014)
ext2fs_open2: Bad magic number in super-block
fsck.ext2: Superblock invalid, trying backup blocks...
fsck.ext2: Bad magic number in super-block while trying to open /dev/sdb
有什么方法可以确定文件系统是否确实被破坏了?我当时正在运行 kvm,上面有几个 vm。
答案1
我搞清楚了发生了什么。有两种可能:1) 我弄乱了分区表,或者 2) 其它东西弄乱了分区表,重启后就什么也做不了了。
当 raid1 中的一个磁盘损坏时我应该执行以下操作:
- 检查 raid 状态,
cat /proc/mdstat
确保驱动器确实坏了 mdadm examine
进一步了解突袭的状态- 当系统仍在运行时,对未正确备份的内容进行备份(例如在移除硬盘并强制重新启动已经压力很大的系统之前)
- 在执行任何其他操作之前,请先备份分区表(最好
gdisk
在备份之前以交互方式使用并列出分区,以确保使用正确的设备/硬盘) - 使用从 raid 中干净地
mdadm
删除故障硬盘分区--fail
- 不要将分区表从一个驱动器复制到另一个驱动器,而是使用备份来加载它
- 可能需要重新启动才能正确设置分区(确保之前已备份所有内容)
- 使用
mdadm
将新分区添加回 raid 设备 femdadm --add /dev/md1 /dev/sda2
- 如果由于某种原因你忘记执行,
--fail
你可以用这个重新创建 raid 设备:(mdadm --create /dev/md1 --assume-clean --level=1 --verbose --raid-devices=2 missing /dev/sdb2
我很确定这不是破坏剩余硬盘上文件系统的原因
如果我按照上述方法操作,我就不会陷入上述境地。一旦陷入这种境地,我就找不到出路了。那么是什么让我确信数据已经消失了呢?
- 在救援系统中,我无法使用 挂载任何设备
mount -t ext4 /dev/md1 /mnt/mountpoint
。我不断收到无法识别文件系统和找不到魔法数字的错误 - Testdisk 在尝试重新创建分区表时发现了错误的分区数
dumpe2fs
虽然给我一堆魔法数字的位置没有任何帮助,因为没有一个是有效的,而且这些位置在分区内的某些位置是“固定的”,所以如果分区表是错误的,这些位置就不再排列了fsck
基本上告诉我同样的事情,并牺牲了一个分区来尝试修复文件系统,但每个 inode 都抛出了错误- 我使用 R-Studio(R-Tools 的商业软件,可免费扫描和恢复最大 256kb 的文件)进行了远程扫描,虽然一开始看起来好像有可恢复的文件,但我用它下载了一些 jpg 和 png,但没有一个包含有效的图像数据。我尝试了各种方法来找出文件系统出了什么问题,但一切都回到了混乱的分区表,并且使用 testdisk 恢复失败。
因此,经验教训是:1)将分区表的备份保存在安全的地方(即不在服务器上)2)当发生事情时 - 首先进行备份3)在发生事情之前制定备份策略