当前位置: 首页 > news >正文

服务器数据恢复- Ext4文件系统分区挂载报错的数据恢复案例

Ext4文件系统相关概念:
块组:Ext4文件系统的空间被划分为若干个块组,每个块组内的结构大致相同。
块组描述符表:每个块组都对应一个块组描述符,这些块组描述符统一放在文件系统的前部,称为块组描述符表。每个块组描述符大小为32字节,其主要描述块位图、i-节点位图及i-节点表的地址等信息。
超级块(Superblock):用于存储文件系统的配置参数(如块大小、总块数、i-节点数)和动态信息(当前空闲块数和i-节点数)。Ext4文件系统的超级块(Superblock)开始于1024字节处,即2号扇区。
i节点:描述文件的时间信息、大小、块指针等信息。
块组描述符和超级块在块中的位置:当块大小为2个扇区时,0号块是引导程序或者保留块,超级块起始于1号块。当块大小为4个扇区时,引导程序或者保留块位于0号块的前两个扇区,超级块位于0号块的后两个扇区。当块大小为8个扇区时,引导程序或者保留块位于0号块的0-1号扇区,超级块位于0号块的2-3号扇区。
Ext4文件系统结构及第一个块组结构:


Ext4文件系统故障&初检&分析:
某公司服务器Ext4文件系统umount失败,管理员执行fsck操作检查一致性,导致Ext4文件系统mount不上并报错,报错信息:“mount:wrong fs type,bad option,bad superblock”。
日志和数据的不一致导致正常文件系统数据被覆盖的情况在Ext3、Ext4文件系统中发生频率较高。因为.journal日志文件保留了缓冲数据,可以通过.joumal日志文件找到相应信息并重建源文件。
通过查看MBR分区表得知本案例中的Linux操作系统分了两个分区:交换分区+Ext4文件系统。北亚企安数据恢复工程师通过对该Ext4文件系统的分析,得到以下信息:
1、块大小为固定的4KB,即8个扇区。
2、超级块(Superblock)起始位置在1024字节处,即2号扇区,大小为2个扇区。
3、块组描述表从第一个块开始,即从4096字节处开始。

服务器数据恢复过程:
1、将故障服务器上硬盘取出,检测后没有发现硬件故障。以只读方式将磁盘做全盘镜像,镜像完成后按照原样将磁盘还原到原服务器中。后续的数据分析和数据恢复操作都基于镜像文件进行,避免对原始磁盘数据造成二次破坏。
2、用工具打开Ext4文件系统,可以看到0-23扇区的数据(包括超级块和块组描述符)被日志记录覆盖。Ext3、Ext4文件系统的日志页以C0 3B 39 98开头。

在journal日志中将超级块的备份查找出来,通过工具查找超级块信息,其标志是“53ef”。超级块0x18-0x1B处描述块大小,确定本案例块大小为4KB。
查找超级块:

通过超级块查看块大小:

块大小:

3、由于原文件系统超级块损坏,所以恢复文件时,要把这部分超级块信息粘贴回去,放在2号扇区开始,或1024字节处。做完以上操作,超级块备份某些地方与实际的超级块数值可能不一致,需要通过工具进行修改。对超级块所在的块组进行了修改,超级块在第0个块组里。

4、由于部分块组描述表被破坏,所以需要在.journal日志文件里找到所有的块组描述表并把它们粘贴回去。.journal日志文件里的块组描述符表存储在超级块的后面,要找块组描述表可以先找到超级块,找到后将块组描述符表内容粘贴到4096字节处。
5、恢复某个文件夹比如kyproc文件夹里的数据时,我们发现这些文件夹在WinHex里是不能打开的状态(如下图1所示),很明显这个目录损坏了。打开其节点信息,发现正常数据被日志填充(如下图2所示)。


找到它的上一级目录,即var文件夹。右击点“open”,打开看到var文件里的所有文件的目录信息。找到要恢复的kyproc目录的信息,12 32 EE 00是其i-节点号,10 00表示其目录项长度,06表示其文件名称长度,02表示其文件类型为目录(如下图所示)。

在var文件夹的目录块下查找kyproc目录的位置(如下图所示),标红的位置是找到的结果。此位置显示所在块号为62399108。

根据所在块号可以定位kyproc目录相应节点的位置。打开.journal日志文件,从里面找到其节点信息,把相应的信息粘贴回去。
6、通过上述方法重建目录后开始重建目录里的文件。重建目录里的文件也是使用同样的方法:从.journal日志文件里找到相应的文件的节点信息,找到后粘贴回原来的位置,达到重建文件的目的。

http://www.lryc.cn/news/155078.html

相关文章:

  • 19-springcloud(上)
  • 前端基础---HTML笔记汇总一
  • 智汇云舟亮相中国安防工程商集成商大会
  • 使用 Sealos 在离线环境中光速安装 K8s 集群
  • 算法-模拟
  • 如何通过Instagram群发消息高效拓展客户?
  • 基于springboot实现多线程抢锁的demo
  • Java I/O模型发展以及Netty网络模型的设计思想
  • 智能电网时代:数字孪生的崭露头角
  • 每日一题 501二叉搜素树中的众数(中序遍历)
  • 测试理论与方法----测试流程第三个环节:设计测试用例
  • C++多态案例2----制作饮品
  • 机械零件保养3d模拟演示打消客户购买顾虑
  • SpringBoot的自动装配源码分析
  • Linux常用命令——csplit命令
  • React 组件的3大属性: state
  • vscode 上传项目到gitlab
  • [羊城杯 2020] easyphp
  • QT 常用类与组件
  • C#控制台连接Mysql数据库,有配置数据库连接字符串的配置文件
  • PowerBuilder连接SQLITE3
  • Git 基本原理和常用操作
  • 单元测试和集成测试的区别
  • node基础概念
  • ArcGIS Maps SDK for JS(二):MapView简介----创建2D地图
  • 知识图谱推理研究综述9.3
  • 详细介绍c++中的类
  • C语言:扫雷小游戏
  • VScode SSH无法免密登录
  • Spring Cloud--从零开始搭建微服务基础环境【四】