记录第二次系统宕机后导致分区丢失的恢复过工程

环境描述

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或输入密码继续。

系统宕机后导致分区丢失的恢复过程_File descriptor 3

输入密码,进行fsck检查,之后尝试mount -a去确认挂载是否有问题。

     提示:​找不到/dev/lvm_vg/lvm_lv的分区,无法挂载。

系统宕机后导致分区丢失的恢复过程_File descriptor 3_02

之后通过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

系统宕机后导致分区丢失的恢复过程_分区丢失恢复_03

系统宕机后导致分区丢失的恢复过程_unknown partition ta_04

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

系统宕机后导致分区丢失的恢复过程_File descriptor 3_05

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

系统宕机后导致分区丢失的恢复过程_系统宕机救援模式_06

    确认sdb分区丢失后开始准备恢复。 unknown partition table

分区恢复

1、下载和解压testdisk

下载地址:​​https://www.cgsecurity.org/wiki/TestDisk_Download​

系统宕机后导致分区丢失的恢复过程_testdisk_07

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】 下一步

系统宕机后导致分区丢失的恢复过程_分区丢失恢复_08

选择要恢复的磁盘,【Proceed】下一步

系统宕机后导致分区丢失的恢复过程_分区丢失恢复_09

【Intel】下一步

系统宕机后导致分区丢失的恢复过程_File descriptor 3_10

【Analyse】下一步

系统宕机后导致分区丢失的恢复过程_File descriptor 3_11

【Quick Search】下一步

系统宕机后导致分区丢失的恢复过程_unknown partition ta_12

继续。根据磁盘大小 时间不一样

系统宕机后导致分区丢失的恢复过程_unknown partition ta_13

【Deeper Search】下一步

系统宕机后导致分区丢失的恢复过程_unknown partition ta_14

进入恢复界面

系统宕机后导致分区丢失的恢复过程_系统宕机救援模式_15

恢复找回中……【物理磁盘1.8T大概需要8个小时,虚机1.8大概需要2小时】

系统宕机后导致分区丢失的恢复过程_File descriptor 3_16

分析完--【99%】

系统宕机后导致分区丢失的恢复过程_unknown partition ta_17

先来看看选项:【有两个分区选项,分别看下】

系统宕机后导致分区丢失的恢复过程_分区丢失恢复_18

重点看下面的提示,但没选该项。

系统宕机后导致分区丢失的恢复过程_testdisk_19

开始操作:重点

系统宕机后导致分区丢失的恢复过程_系统宕机救援模式_20

系统宕机后导致分区丢失的恢复过程_testdisk_21

系统宕机后导致分区丢失的恢复过程_系统宕机救援模式_22

系统宕机后导致分区丢失的恢复过程_系统宕机救援模式_23

之后,根据提示 一路退出

重启系统后就可以通过lvs等命令看到分区,并可以mount了。

【总结】

1、找到分区表后需要选择“write”,这步是必须的。

2、一般情况下不需要重启主机也可以退出该工具后看到多出来的分区表。

3、一般情况一次即可恢复分区,如一次不行可以多试几次,不会引起数据的丢失。

3、挂载分区,验证数据

1、先用lsblk看看是否有新的分区出现,在sdb下级显示。

2、再用lvs查看lv逻辑卷是否正常

3、最后挂载,验证数据

    a、 和上面执行的lvm命令比对下,发现:多出来一个pv物理卷。

    b、lvs查看出现:卷组lvm_vg,逻辑卷lvm_lv,该卷组和逻辑卷正是上面故障时找不到的分区。

系统宕机后导致分区丢失的恢复过程_testdisk_24

          尝试挂载成功,看到之前分区上的数据。

系统宕机后导致分区丢失的恢复过程_unknown partition ta_25


~~~~关于testdisk工具的其他功能,比如恢复数据等,还需继续挖掘。