记录第二次系统宕机后导致分区丢失的恢复过工程
环境描述
1、物理主机使用raid卡--P408i-a和4块磁盘,分别作了两组raid1,480G安装操作系统,1.8T存放本地数据;
2、系统版本为centos7.8(命令cat /etc/redhat-release),内核版本为3.10.0-229.el7.x86_64(命令:uname -a),内核版本低7.1。说明系统是centos7.8,内核是7.1(不是centos7.8的系统内核)
以下数据来自redhat官网;
RHEL 7 | ||
RHEL 7.9 | 2020/9/29 | 3.10.0-1160 |
RHEL 7.8 | 2020/3/31 | 3.10.0-1127 |
RHEL 7.7 | 2019/8/6 | 3.10.0-1062 |
RHEL 7.6 | 2018/10/30 | 3.10.0-957 |
RHEL 7.5 | 2018/4/10 | 3.10.0-862 |
RHEL 7.4 | 2017/7/31 | 3.10.0-693 |
RHEL 7.3 | 2016/11/3 | 3.10.0-514 |
RHEL 7.2 | 2015/11/19 | 3.10.0-327 |
RHEL 7.1 | 2015/3/5 | 3.10.0-229 |
RHEL 7.0 GA | 2014/6/9 | 3.10.0-123 |
RHEL 7.0 Beta | 2013/12/11 | 3.10.0-54.0.1 |
出现宕机后磁盘的raid卡加载有问题,可能是因为内核版本导致。该厂家提供的CPU支持的内核列表数据显示不包含内核7.1版本的操作系统。
故障确认
1、故障现象或起因
主机网络不通,登录ilo或bmc后发现系统处于救援模式,需要Ctrl+D或输入密码继续。
输入密码,进行fsck检查,之后尝试mount -a去确认挂载是否有问题。
提示:找不到/dev/lvm_vg/lvm_lv的分区,无法挂载。
之后通过fstab文件中注释该磁盘挂载,系统启动成功,但磁盘分区丢失。
分别通过message日志和dmesg命令定位到报错信息
2、message启动过程定位分区丢失unknown partition table
信息如下,从中看到accraid模块加载存在问题。
kernel: ioapic: probe of 0000:d6:05.4 failed with error -22
kernel: pci_hotplug: PCI Hot Plug PCI Core version: 0.5
kernel: pciehp: PCI Express Hot Plug Controller Driver version: 0.4
##################内核加载raid卡信息报错
kernel: Adaptec aacraid driver 1.2-0[30300]-ms
kernel: aacraid 0000:2d:00.0: can't disable ASPM; OS doesn't have ASPM control
kernel: resource map sanity check conflict: 0xe1100000 0xe11fffff 0xe1100000 0xe1107fff 0000:2d:00.0
kernel: ------------[ cut here ]------------
kernel: WARNING: at arch/x86/mm/ioremap.c:171 __ioremap_caller+0x2d9/0x3a0()
kernel: Info: mapping multiple BARs. Your kernel is fine.
kernel: Modules linked in:
kernel: aacraid(+) i40e(+) ptp pps_core
kernel: CPU: 0 PID: 827 Comm: kworker/0:1 Not tainted 3.10.0-229.el7.x86_64 #1
kernel: Hardware name: HPE ProLiant DL560 Gen10/ProLiant DL560 Gen10, BIOS U34 05/21/2019
kernel: Workqueue: events work_for_cpu_fn
kernel: ffff880fe617bc40 0000000038a523ab ffff880fe617bbf8 ffffffff81604b0a
kernel: ffff880fe617bc30 ffffffff8106e34b ffffc90029f00000 00000000e1200000
kernel: ffffc90029f00000 ffffc90029f00000 0000000000100000 ffff880fe617bc98
kernel: Call Trace:
kernel: [<ffffffff81604b0a>] dump_stack+0x19/0x1b
kernel: [<ffffffff8106e34b>] warn_slowpath_common+0x6b/0xb0
kernel: [<ffffffff8106e3ec>] warn_slowpath_fmt+0x5c/0x80
kernel: [<ffffffff81079ba9>] ? iomem_map_sanity_check+0xc9/0xd0
kernel: [<ffffffff81059c89>] __ioremap_caller+0x2d9/0x3a0
kernel: [<ffffffff81059d67>] ioremap_nocache+0x17/0x20
kernel: [<ffffffffa00ba9cf>] aac_srcv_ioremap+0x1f/0x80 [aacraid]
kernel: [<ffffffffa00baec2>] aac_srcv_init+0x52/0x4b4 [aacraid]
kernel: [<ffffffffa00ad542>] aac_probe_one+0x212/0x660 [aacraid]
kernel: [<ffffffff81308c55>] local_pci_probe+0x45/0xa0
kernel: [<ffffffff8108c104>] work_for_cpu_fn+0x14/0x20
kernel: [<ffffffff8108f1db>] process_one_work+0x17b/0x470
kernel: [<ffffffff81090133>] worker_thread+0x293/0x400
kernel: [<ffffffff8108fea0>] ? rescuer_thread+0x400/0x400
kernel: [<ffffffff8109739f>] kthread+0xcf/0xe0
kernel: [<ffffffff810972d0>] ? kthread_create_on_node+0x140/0x140
kernel: [<ffffffff8161497c>] ret_from_fork+0x7c/0xb0
kernel: [<ffffffff810972d0>] ? kthread_create_on_node+0x140/0x140
kernel: ---[ end trace b785a9022ec87d91 ]---
kernel: i40e 0000:11:00.0: f6.71 a1.7 n06.80 e80004004
kernel: i40e 0000:11:00.0: The driver for the device detected a
newer version of the NVM image than expected.
Please install the most recent version of the network driver.
##############启动过程的磁盘加载报错:unknown partition table
kernel: sd 0:0:0:0: [sda] 937637552 512-byte logical blocks: (480 GB/447 GiB)
kernel: sd 0:0:0:0: [sda] Write Protect is off
kernel: sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, supports DPO and FUA
kernel: sd 0:0:1:0: [sdb] 3516262832 512-byte logical blocks: (1.80 TB/1.63 TiB)
kernel: sd 0:0:1:0: [sdb] Write Protect is off
kernel: sd 0:0:1:0: [sdb] Write cache: disabled, read cache: enabled, supports DPO and FUA
kernel: sda: sda1 sda2 sda3
kernel: sdb: unknown partition table
kernel: sd 0:0:1:0: [sdb] Attached SCSI removable disk
kernel: sd 0:0:0:0: [sda] Attached SCSI removable disk
3、dmeg命令定位
[ 3.815035] sd 0:0:0:0: [sda] 937637552 512-byte logical blocks: (480 GB/447 GiB)
[ 3.815103] sd 0:0:0:0: [sda] Write Protect is off
[ 3.815105] sd 0:0:0:0: [sda] Mode Sense: 06 00 10 00
[ 3.815257] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, supports DPO and FUA
[ 3.815317] sd 0:0:1:0: [sdb] 3516262832 512-byte logical blocks: (1.80 TB/1.63 TiB)
[ 3.815323] sd 0:0:1:0: [sdb] Write Protect is off
[ 3.815325] sd 0:0:1:0: [sdb] Mode Sense: 06 00 10 00
[ 3.815342] sd 0:0:1:0: [sdb] Write cache: disabled, read cache: enabled, supports DPO and FUA
[ 3.816029] sdb: unknown partition table
[ 3.816134] sd 0:0:1:0: [sdb] Attached SCSI removable disk
[ 3.816745] sda: sda1 sda2 sda3
[ 3.817374] sd 0:0:0:0: [sda] Attached SCSI removable disk
4、操作系统里使用lvm相关的命令报错File descriptor
File descriptor 3 (socket:[15033]) leaked on XXX invocation
File descriptor 3 (socket:[15033]) leaked on lvmdiskscan invocation. Parent PID 4441: -bash
确认sdb分区丢失后开始准备恢复。 unknown partition table
分区恢复
1、下载和解压testdisk
下载地址:https://www.cgsecurity.org/wiki/TestDisk_Download
linux的下载和安装
wget --no-check-certificate https://www.cgsecurity.org/testdisk-7.2-WIP.linux26-x86_64.tar.bz2
tar xvf testdisk-7.2-WIP.linux26-x86_64.tar.bz2
cd testdisk-7.2-WIP/
./testdisk_static ###开始运行
2、恢复找回分区
在linux下恢复,特别是ssh登录的,需要注意一定要找一个永不关机的windows主机,在windows主机下ssh进到系统开始执行testdisk恢复。因为整个过程根据磁盘大小,需要很长时间。
开始【Create】 下一步
选择要恢复的磁盘,【Proceed】下一步
【Intel】下一步
【Analyse】下一步
【Quick Search】下一步
继续。根据磁盘大小 时间不一样
【Deeper Search】下一步
进入恢复界面
恢复找回中……【物理磁盘1.8T大概需要8个小时,虚机1.8大概需要2小时】
分析完--【99%】
先来看看选项:【有两个分区选项,分别看下】
重点看下面的提示,但没选该项。
开始操作:重点
之后,根据提示 一路退出
重启系统后就可以通过lvs等命令看到分区,并可以mount了。
【总结】
1、找到分区表后需要选择“write”,这步是必须的。
2、一般情况下不需要重启主机也可以退出该工具后看到多出来的分区表。
3、一般情况一次即可恢复分区,如一次不行可以多试几次,不会引起数据的丢失。
3、挂载分区,验证数据
1、先用lsblk看看是否有新的分区出现,在sdb下级显示。
2、再用lvs查看lv逻辑卷是否正常
3、最后挂载,验证数据
a、 和上面执行的lvm命令比对下,发现:多出来一个pv物理卷。
b、lvs查看出现:卷组lvm_vg,逻辑卷lvm_lv,该卷组和逻辑卷正是上面故障时找不到的分区。
尝试挂载成功,看到之前分区上的数据。
~~~~关于testdisk工具的其他功能,比如恢复数据等,还需继续挖掘。