1.故障发生背景

Ext4文件系统没有umount下来,之后做了fsck操作检查一致性,结果导致Ext4文件mount不上(有时也会表现为导致目录变成了文件)。

报错提示信息:mount: wrong fs type, bad option, bad superblock

2.故障原理分析

某故障时,日志和数据不一致造成的正常文件系统数据被覆盖的现象。这种故障在Ext3、Ext4文件系统常有发生,好在.journal日志文件留有缓冲,恢复时可以从.journal日志文件里找到相应信息,并粘贴回相应位置,达到重建原文件的目的。

3.案例重要信息

Linux系统的硬盘的第一个扇区是MBR扇区,从MBR分区表能看出来,本案例一共有两个分区。第一个分区是交换分区,共7.8G,第二个分区是Ext4文件系统,共292G。总的大小为300G。

Ext3、Ext4文件系统有日志功能,本案例考虑从.journal日志文件中找到丢失数据。

1.      块大小为固定的4KB,即8个扇区。

2.      超级块(Superblock)起始位置在1024字节处,即2号扇区,大小为2个扇区。

3.      块组描述表从第一个块开始,即从4096字节处开始。

4.案例重要概念

超级块(Superblock):用于存储文件系统的配置参数(如块大小、总块数、i-节点数)和动态信息(当前空闲块数和i-节点数)。Ext4文件系统的超级块(Superblock)开始于1024字节处,即2号扇区。

块组:Ext4文件系统的全部空间被划分为若干个块组,每个块组内的结构都是大致相同的。

块组描述符表:每个块组都对应一个块组描述符,这些块组描述符统一放在文件系统的前部,称为块组描述符表。每个块组描述符大小为32字节,其主要描述块位图、i-节点位图及i-节点表的地址等信息。

i节点:描述文件的时间信息、大小、块指针等信息。

块组描述符和超级块在块中的位置:当块大小为2个扇区时,0号块是引导程序或者保留块,超级块起始于1号块。当块大小为4个扇区时,引导程序或者保留块位于0号块的前两个扇区,超级块位于0号块的后两个扇区。当块大小为8个扇区时,引导程序或者保留块位于0号块的0-1号扇区,超级块位于0号块的2-3号扇区。

Ext4文件系统的整体结构及第一个块组的具体结构如图1所示。

5.解决步骤

步骤总结:

1.通过.journal日志文件里的超级块备份找到超级块,确定块大小。

2.通过.journal日志文件里的超级块备份找到超级块,重建超级块信息。

3.通过.journal日志文件找到目录节点,重建(恢复)目录。

4.通过.journal日志文件找到目录节点找到要恢复的文件的节点信息,重建(恢复)文件。

首先用WinHex打开Ext4文件系统,可以看到0-23扇区的数据(包括超级块和块组描述符)被日志记录覆盖。Ext3、Ext4文件系统的日志页以C0 3B 39 98开头。如图2所示。

图2

  1. 确定块大小

超级块中有关于块大小的信息。从.journal日志中查找超级块的备份。用WinHex查找得到.journal日志中超级块的信息,其标志是“53ef”。查找超级块方式如图3所示。查看块大小方法如图4和图5所示。超级块0x18-0x1B处描述块大小,确定本案例块大小为4KB。

图3

通过超级块查看块大小如图4所示。

图4

或者WinHex模板编辑器也可以显示块大小如图5所示。

图5

2.      重建(恢复)超级块

由于原文件系统超级块损坏,所以恢复文件时,要把这部分超级块信息粘贴回去,即放在2号扇区开始,或1024字节处。

做完以上操作,超级块备份某些地方与实际的超级块数值可能不一致,需要通过WinHex的模板管理器修改一下。本案例对超级块所在的块组作了修改,它在第0个块组里。如图6所示。

图6

3.      重建(恢复)块组描述表

由于部分块组描述表被破坏,所以在.journal日志文件里找到所有的块组描述表,并把它们粘贴回去。

.journal日志文件里,如图1所示,块组描述符表存储在超级块的后面。所以要找块组描述表时,可以先找到超级块。找到后将块组描述符表内容粘贴到4096字节处。

4.      重建(恢复)目录

当我们要恢复某个文件夹里的文件时,比如我们需要恢复kyproc文件夹里的数据。我们发现这些文件夹在WinHex里是不能打开的状态。如图7所示。很明显这个目录损坏了,打开其节点信息,发现正常数据被日志填充,如图8所示。

图7

图8

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

图9

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

图10

根据所在块号,就可以定位kyproc目录相应节点的位置。由于人工补节点比较繁琐,我们可以打开.journal日志文件,从里面找到其节点信息,把相应的信息粘贴回去。

上述方法可以重建(恢复)目录,恢复目录里的文件也是通过同样的方法从.journal日志文件里找到相应的文件的节点信息,找到后粘贴回原来的位置,达到重建(恢复)文件的目的。

来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/sanyuanempire/p/6168726.html

一例Ext4文件系统fsck后损坏的修复过程相关推荐

  1. Ext4文件系统fsck后损坏的修复过程-linux数据恢复

    在数据恢复案例开始之前有几个概念需要了解 块组:Ext4文件系统的全部空间被划分为若干个块组,每个块组内的结构都是大致相同的. 块组描述符表:每个块组都对应一个块组描述符,这些块组描述符统一放在文件系 ...

  2. linux ext4文件系统超级块损坏修复

    前言 误操作 dd if=/var/www/html/admin.php of=/dev/sdb 之后系统报磁盘空间不足,意识到出事了 解决 debugfs -w /dev/sdb 返回,/dev/s ...

  3. mysql ext3 ext4_给你一个惊喜:EXT3/EXT4文件系统数据删除后的数据恢复

    所谓的日志型文件系统,就是文件系统中做了什么操作,操作系统就把它记录下来,比如创建一个新文件,操作系统会在日志文件中记录下来, 删除一个文件,操作系统也会在日志文件中记录下来,记录的信息包括文件名称. ...

  4. linux系统fsck.ext4,linux – 如何在fsck之后恢复损坏的ext4文件系统?

    我在软件raid5上有一个ext4文件系统.当我开始耗尽空间时,文件系统运行"好了"好几年了.我在6x2T硬盘上有9T的音量.我开始通过执行mdadm失败,删除,添加,重建,重复过 ...

  5. android ext4 损坏,EXT4文件系统损坏导致的实例无法启动的排查与修复

    现象 某现网局点进行POC时,发现某DN core掉,且一直无法启动. core文件堆栈和dn的pg_log日志中的堆栈信息一致. 堆栈中显示 checkpoint 时进行 buffer 落盘时导致c ...

  6. Linux文件系统中错误的是,linux – ext4文件系统损坏 – 可能是硬件错误?

    我打开电脑约半小时后,我在dmesg中收到这些错误: [ 1355.677957] EXT4-fs error (device sda2): htree_dirblock_to_tree: inode ...

  7. Ext4文件系统修复

    Ext4文件系统修复 目录 一. super block........................................................................ ...

  8. Ext4文件系统架构分析(一)

    本文描述Ext4文件系统磁盘布局和元数据的一些分析,同样适用于Ext3和Ext2文件系统,除了它们不支持的Ext4的特性外.整个分析分两篇博文,分别概述布局和详细介绍各个布局的数据结构及组织寻址方式等 ...

  9. ext4 文件系统新特性

    Ext4的名称来源于4th extended filesystem,它是广泛应用于Linux的Ext3文件系统的后继.同Ext3类似,Ext4也是日志文件系统.而与Ext3仅仅是将日志功能加入到Ext ...

  10. linux重新识别逻辑卷,linux – 从已删除的LVM逻辑卷恢复ext4文件系统的任何方法?...

    前几天,当我在Vmware下的 Linux客户端上扩展磁盘时,我有一个适当的大脑放屁时刻.我将Vmware磁盘文件扩展到所需的大小然后我做了我通常在没有LVM的Linux客户端上做的事情:我删除了LV ...

最新文章

  1. 打印swift 变量的类型
  2. uniapp自定义顶部导航组件
  3. Java实现单链表的逆转置
  4. MySQL之常用函数
  5. Android之奔溃提示com.google.gson.internal.LinkedTreeMap cannot be cast to java.util.HashMap
  6. Linux 脚本文件中开头的#!/bin/bash和#!/bin/sh是什么意思
  7. 庖丁解牛ASP.NET3.5控件和组件开发技术-(1)服务器控件概述
  8. LwIP之动态内存堆
  9. 鼠标方式自动弹出内容html,html 在一个超链接上面,鼠标移动上去时,也显示一串文字,如何实现...
  10. MapReduce之如何给运行在YARN上的MapReduce作业配置内存
  11. 关于@media不生效的问题和meta总结
  12. Java 基础 匿名对象
  13. Interpreting Attributions and Interactions of Adversarial Attacks论文解读
  14. Linux忘记密码修改密码
  15. 照片放大不清晰怎么处理
  16. 参数化三维管网建模系统MagicPipe3D
  17. 人工智能AI学习教程
  18. 耦合矩阵 matlab,耦合矩阵变换(化简)的问题
  19. winstor磁盘阵列数据恢复
  20. Excel 中固定行标题和列标题

热门文章

  1. Android深入四大组件(一)应用程序启动过程
  2. python模块之httplib(在py3中功能进一步强大,请详看文档)
  3. 使用struts2 做客户端校验时抛出freemarker模版错误异常的处理
  4. Oracle数据反向恢复
  5. iText 实践的目录(the content of iText in Action)
  6. android 出现在默认应用程序,如何将我的应用程序设置为默认的SMS应用程序?
  7. 微型计算机系统视频适配器为,计算机硬件基础1-微型计算机系统组成(含教材6,8,9章内容).ppt...
  8. python扩展库简介_NumPy简介-Python扩展程序库 -- NumPy-编程文章分享
  9. docker安装gamit_ubuntun10.10中安装gamit 10.40
  10. Nginx源码分析 - 基础数据结构篇 - 内存池 ngx_palloc.c(02)