2023年11月25日发(作者:)

⼀次Linuxtestdisk+gdisk恢复XFS⽂件系统及数据的经

⼀次Linuxtestdisk+gdisk恢复XFS⽂件系统及数据的经历

硬盘之前状况,gdisk进⾏硬盘分区(SATA标准,3.6T容量),1.6T+2.0T两个分区,然后⽤格式化分区,最后结果

就是,GPT分区表+两个XFS⽂件系统的硬盘(/dev/sdb,/dev/sdb1,/dev/sdb2)

我已⽆法确定引起这次硬盘错误的原因,但我确实这么做过:

原因⼀,从另⼀个硬盘的/home挂载点复制了⼤量数据到/dev/sdb1,然后我就将硬盘的数据线和电源线都拔掉了,这个动作在系

统运⾏和关闭的两种情况下都做过,(SATA 硬盘是否安全的⽀持热插拔?)

原因⼆,在这次准备复制数据的之前,我没有将硬盘固定,也没有平放在台⾯(有⼀点斜度),然后开机,(胡乱的猜想着斜

坡加载技术)

下⾯进⼊正题:

1,硬盘错误引起分区⽆法读取,挂载,开始纳闷哪⾥出了问题

2,运⾏gdisk -l /dev/sdb,显⽰如下

有警告信息及注意事项,虽然这⾥的标记GPT:damaged说明GPT有问题,但最后还是显⽰出了有分区的信息存在,(GPT分区

表信息应该没有彻底损坏,不然怎么读取到两个分区的信息的呢),两个分区⾥Code标记都变成了0700Microsoft basic

data),正常的应该是8300Linux filesystem),这个标记应该说明的是XFS⽂件系统的superblock信息毁了,这是后来经过XFS

⽂件系统⼯具xfs_repair知道的

详细分区情况,但是是得出来的结果有问题的

gdisk检测到五个问题,(惊讶,这么多的问题)

3,进⾏到这⾥,我着急了,于是寻求帮助

⾸先,尝试了xfs_repair /dev/sdb,这个命令进⾏了⼏次,因为中途中断过,这个修复时间是⽐较长的,⼏⼩时(差不多34

时?)后得到的结果却是⽆法检测验证到有效的备份superblock信息,(失败,⼼都凉了)

然后,找到testdisk⼯具,⼤略的看了下说明就上⼿做(英⽂实在是差,仔细地看也不明⽩),第⼀次进⾏Analyse后,完全不

知道做什么,就直接退出

然后就去测试查看,运⾏lsblkgdisk,没有任何改变,(此刻是没抱什么希望的),输出的⽇志⽂件也完全看不

懂,但我在⽇志⽂件⾥看到了有XFS这三个

字母的⾝影,(此时⼼中还是有⼀丝喜悦的)

4,继续⽹上搜索,寻求答案,(⾟⾟苦苦建⽴的⽂件数据啊,那个⼼情真是⽆奈啊)

使⽤testdisk进⾏第⼆次Analyse(分析⽬前分区结构及搜寻丢失的分区),经过6⼩时的分析与搜索后,我⼤胆的进⾏了第⼆个

动作,转换分区类型,(当时的想法是inodedata block⾥记录的信息应该是不会丢失或被覆盖的),于是我选择了Linux

reserved(⾕歌翻译了⼀下,“Linux保留,这⾥是没有Linux filesystem 的,找来找去也没找到更合适的了),再进⼊⼦菜单

选择了XFS(还有

XFS2,XFS3XFS4,这⾥是⽐较疑惑的,⽹上没有找到任何答案),⾄此点击写⼊,然后退出。再⼀次阅读

件,(这⾥有点⼩插曲,我在主⽂件侠⾥找不到⽂件,进⾏whereis 搜寻,这个⽂件怎么会跑

/usr/src/linux-3.10.3-1-ARCH/这⾥了呢)?

5,⽂件内容如下:

这⾥是系统的⼀些相关信息

这⾥是选择了EFI GPT选项后得出的结果,在这⾥就分析出了当前的分区结构,只有⼀个Linux Reserved分区类型的分区,

(这⾥的这个分析是不是肯定的)

这⾥是应该是选择了Analyse选项后再点击quick search得到的,⼤概是两段内容,第⼀,对于分区1⽂件系统的标记搜索,成

功,(这个标记是什么,superblock?,不是损毁了吗?)。第⼆,对于分区2⽂件系统的标记搜索,在这⾥搜索到了很多标

记,但是在⽐对数据(能这样表达吗)时却出现了问题,(这⾥应该就是为什么会耗时6⼩时的原因),因为数据的信息标记超

出了磁盘的整个容量,(这会是什么原因造成的呢)

这⾥是搜索完成后得到⽆法恢复分区2⽂件系统的信息

这⾥是这次使⽤testdisk最后的结果⽇志,只找到了丢失的分区1⽂件系统,然后进⾏了分区类型的改变和确定写⼊。

6,经过上步的尝试,(说实话,⼼⾥很忐忑),使⽤lsblk查找,还是找不

/dev/sdb1,于是运⾏gdisk

虽然看到不想看到的信息,但是No problems found⼀句让我有些惊喜,继续

作出决定,重写分区表信息7,喜出望外的结果

检测出/dev/sdb/sdb1

成功挽回⽂件!(兴奋啊)8,疑问与猜想

GPT分区表已经修复好,分区1的类型为Linux reserved(并不是未出问题之前的Linux filesystem),成功检测到/dev/sdb1

⽂件系统是XFS。已经挽回了数据,虽然并没有完整的修复,但现在没有空闲的磁盘来备份这些数据,所以这⾥就没敢继续往

下尝试恢复了

疑问⼀:能不能直接使⽤gdisk的重新建⽴分区表的功能,使⽤testdisk好像最主要的作⽤就是做了分区的搜索,然后做了个分

区类型的转换(这步是否可⽤其它⼯具完成)?

疑问⼆:XFS⽂件系统的superblock到底有没有损毁,如果没有损毁,怎么就检测不到分区⽂件系统信息,如果损毁了⼜是怎

么恢复的,因为尝试运⾏了xfs_repair,检测到磁盘最后⼀个扇区也验证不了备份的superblocksuperblock有没有彻底恢复,

如果是彻底恢复的,为什么不能正确的检测到分区2的信息,如果并不是完整的superblock,⼜何以能够读取分区1的作息?

疑问三:总觉得这⾥的Linux reserved怪怪的,难道它在磁盘⾥的记录信息与Linux filesystem是兼容的?这个记录信息与XFS

⽂件系统的superblock有没有关系?

疑问四:运⾏dd if=/dev/sdb of=/dev/sdax,会是什么结果?

猜想疑问⼀:阅读了鸟哥的私房菜基础篇⾥的ext2⽂件系统的那⼀章节,对⽂件系统(ext2,ext3,ext4XFS)有这么个了解,

记录整个磁盘分区情况的是GPT分区表,记录分区⽂件系统信息的是superblock,记录⽂件系统⾥的⽂件信息的是inode,记

录⽂件系统⾥的⽂件实际数据的是block,这⾥的inodeblock是否有独特的标记,是否可写这样⼀个程序,直接读取到磁盘

⾥的inode来找到block

从⽽搜索出⽂件信息

猜想疑问⼆:说到这⾥当然还有⼀些疑问,这⾥的思维有些乱。GPT磁盘在开始区域

记录着保留的MBR信息,GPT信息及superblock信息,这些是怎么记录下来的,因为这个区域没有进⾏⽂件系统格式化,磁

盘的整个磁盘的最⼩单位是sector(扇区),进⾏分区⽂件系统格式化后,磁盘⽤来记录信息的最⼩单位是block吗,那么

默认256bytesinode⼜是个什么,superblock信息为什么会记录在第⼀个

分区以前未格式化的区域?

此篇⼩记说明:以上信息仅针对本⼈使⽤的系统环境,其中有⼀⼩部份表达的信息⽆法

⽤图⽚来⽐对,因为⼀开始没想要写此记,所以⼀些信息的截图就忽略了,特别是

xfs_repair这个环节。

最后作个提醒:硬盘发⽣错误,在系统运⾏期间⽆法⾃动fsck导致系统⽆法成功启动

或⽆法检测分区读取数据信息(⾮启动盘)后,绝不能再对硬盘进⾏任何写操作,慎⽤fsck,切记,切记,这样,⾃⼰就能最

有把握的将数据拯救出来!