记一次CentOS系统分区表全盘删除后的恢复操作
接到求助,某CentOS节点失联,BMC控制台无响应,进入救援模式,检查分区,发现/dev/sda(系统盘所在设备块)下无任何分区。由于服务器系统盘全部是做了RAID1的,因此排除了硬件损坏的可能,和服务器owner确认可能是有同学误操作删除分区表后,着手准备恢复。由于时间紧急没有截屏记录,以下为文字回忆,主要是记录解决思路和踩坑过程。
挂载Live盘,进入救援模式,恢复网络连接,用于安装testdisk(testdisk类似于windows中的diskgenius,用来恢复linux分区数据屡试不爽)
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.dns 8.8.8.8
计划使用yum安装,无奈缺少yummain依赖,此路不通,改为下载离线二进制包
wget https://www.cgsecurity.org/testdisk-7.1.linux26-x86_64.tar.bz2
解压后执行
testdisk /dev/sda
,开始恢复分区表# 光标选中sda磁盘,选择Proceed回车 # 接下来选择分区类型,Intel表示MBR分区,EFI GPT表示GPT分区,根据实际情况选择 # 这里我踩了坑,testdisk默认选择了GPT分区,后来发现实际这块系统盘是MBR分区,只能用testdisk重新恢复一遍MBR分区 # 选择Analyse,选择Quick Search # 等待分区表搜索结束后,绿色部分就是被删除的分区表,可以简单核对下是否准确,回车进入分区 # 如果分区数量依然不对,这里可以选择Deeper Search深度扫描 # 如果分区确定没问题,选择Write,回车将分区表重新写入磁盘 # 退出testdisk
lsblk查看,我们熟悉的系统分区又回来了,通过挂载检查各个分区文件都在,但是重启后,未显示内核引导,光标直接卡在
1234F:
,由于内核引导都未能加载,判断是grub引导出现问题。再次返回救援模式,挂载sda1引导分区,果然发现grub和grub2目录一堆问号,且访问和删除都提示
structure needs cleaning
使用xfs_repair修复文件系统无果,准备重新格式化boot分区,将原boot分区中除grub和grub2目录以外的文件全部备份,mkfs.xfs /dev/sda格式化boot分区,恢复备份文件,然后开始修复引导
# 在chroot前bind mount,解决grub-probe: error: cannot find a device for / 报错 mount -o bind /dev /mnt/sysimage/dev mount -o bind /proc /mnt/sysimage/proc mount -o bind /run /mnt/sysimage/run mount -o bind /sys /mnt/sysimage/sys chroot /mnt/sysimage grub2-install /dev/sda grub2-mkconfig -o /boot/grub2/grub.cfg
恢复引导后重启,熟悉的内核引导界面回来了,还没来得及喜悦,新的坑出现了:加载内核时报错
invalid magic number you need to load the kernel first
内核加载失败,判断是备份出来的boot分区内的内核文件也受到波及损坏了,痛定思痛,下定决心:直接删除重建boot分区+重装内核+重建引导
# fdisk删除原boot分区,n新建第一块分区表 # fdisk a,给新建的分区表打上BOOT标记 # 保存分区表,mkfs.xfs给boot重新格式化 # 挂载到/mnt/sysimage/boot下,准备重装内核 # 通过chroot,uname -a确定恢复的内核版本 # 重装内核 rpm -ivh /run/install/repo/Packages/kernel-3.10.0-1160.el7.x86_64.rpm --root=/mnt/sysimage/ --force # 内核安装完成后,重复第6步的命令进行引导修复
重启服务器,OS引导正常,内核启动顺畅,熟悉的登录页面又回来了,成就感+1