[转]Linux存储入门:简易数据恢复方案--分区和LVM实战

2023-11-08

数据恢复有没有简易方案?

IT工程师一般都知道如何操作和使用文件和目录。但是,对于系统如何构建出、抽象出文件和目录,一般就不熟悉了。至于更下层的概念,可能大家知道最多的就是驱动了。所以,为了规避这点,可行的简易方案之一,就是以黑箱方式使用testdisk等工具,在我们在对底层了解不多甚至一无所知的情况下,进行数据恢复(商业工具,恢复效果估计更好,当然商业工具的价格也更好)。但是,对于工程师而言,多数时候,仅仅以黑箱方式依赖某些工具进行数据恢复是不够的。

数据恢复,经常是突发事故响应中关键而又耗时的一步。多数情况下,工程师往往并非专司数据恢复,操作环境往往是生产环境,趁手工具难以部署,执行操作要遵循种种约束,加之业务中断的压力。这种情形下,工程师很可能还需要推定数据恢复的结果/耗时等信息,提供数据供决策者使用。很明显,如果你准备考验一下自己的细致、耐心、知识和技能,数据恢复将是个不错的课题。当然,有一点是明确的,只是以黑箱方式使用testdisk等工具进行数据恢复,解决以上问题是不可能的。那么,有没有其他简易方案呢?

这里,我们以一个实际的case为例,讨论一下,在只使用UNIX常见工具(dd/grep/strace等)的情况下,如何简单、快捷的恢复数据。

预先准备

工具

我们要用到以下工具

排查和诊断就是数据处理

如果对数据处理了解不多,请参考OSEMN

  1. obtaining data/获取数据
  2. crubbing data/清洗数据
  3. exploring data/探索数据
  4. modeling data/建模数据
  5. interpreting data/解释数据

测试环境

使用Virtualbox,基于CentOS/Fedora/debian/Ubuntu搭建Linux实验环境。只需要学会strace工具和如下系统调用,就足以追踪系统如何处理诸如LVM物理卷元数据这样过的问题。

数据恢复的原理和流程

什么是元数据

我们以大家都熟悉的磁盘作为存储设备的例子。

现代操作系统都会在磁盘上建立多个分层结构来管理和控制磁盘。比如,磁盘分区,分区上建立物理卷,物理卷上建立卷组,卷组上建立逻辑卷,逻辑卷上建立文件系统,就是这样的一个例子。如果你不熟悉LVM,请参考Logical Volume Manager

这些分层的结构都是很类似的。以磁盘分区为例。所谓分区,以大家最为熟悉的MBR: Master Boot Record结构为例。其实是第一个扇区记录了各个分区的起始扇区,大小和类型。系统需要时,比如启动过程中,系统只要从磁盘的第一个扇区读取这些数据即能拿到各个分区的数据。

具体看看分区的数据结构。以fdisk为例,分区的数据结构定义为

我们看看具体分区的例子,验证一下数据结构

分区使得磁盘上的扇区有了差别。第一个扇区(其实其编号是0),因分区数据记录其上而扮演特殊角色。明显,对系统而言,管理和操作分区实际上就是读写第一扇区上的对应记录而已。

类似分区信息这种系统用以管理某层资源的数据就是元数据

系统在磁盘上建立的各个分层结构,都有类似分区结构的数据结构。以LVM结构为例,我们可以把磁盘记录和LVM工具报告的数据做一对比。LVM数据的从第2个扇区开始,卷组数据在第8个扇区中,可以用dd命令提取相关扇区来验证LVM的数据结构。

下面是一份完整的LVM元数据信息,有兴趣者可以逐一清点各个对象。

元数据和数据:数据损坏分类

系统把磁盘的扇区分成两种来支持分区:第一扇区和所有其他非第一扇区。并且在第一个扇区上记录分区信息,即元数据。而其他非第一扇区则供分区层使用,从磁盘的视角看,其他非第一扇区则是数据部分。我们逐层考察下磁盘、分区和LVM结构

系统启动时,会逐层读取各层元数据,创建各层数据结构。如果某一层元数据损坏或者丢失,那么系统就没有办法完成创建各层数据结构的任务。这种情况下,从客户角度看,很可能就是数据损坏了。比如,如果你把第一个扇区用\0覆盖一遍,那么系统就识别不到分区内容了。当然这种情况下分区层以上的内容,比如物理卷信息,系统也无法处理了。因此,对于数据恢复任务而言,如果元数据损坏,则修复元数据总是必须的,而且往往是第一步。

当然,如果数据损坏了,即使元数据完好无缺,那么数据也是损坏了。比如,你误删了一个文件,那么,分区结构再完好对于文件被删也于事无补。

基于以上分析,我们可以把数据损坏简单分三类类:元数据损坏、数据损坏或者前面两种损坏类型的混合型损坏。

元数据修复可以简易处理

以基于磁盘的分区、LVM以及文件系统为例。分层结构的数据格式都有严格的格式(比如分区的数据结构就是一个C的struct),出现位置也固定(有关分区的元数据记录在第一个扇区的446~462字节之间),而且这些数据结构往往都带有魔数(比如,分区的类型83),而且常用的分层结构,也不外乎分区、LVM以及文件系统等几种。因此,对于元数据以及系统如何处理元数据,我们都容易追踪和检查。因此,可以预期,修复元数据,有简易方案。

原理

如果有数据损坏,那么除非有日志、备份,或者数据本身有逻辑可供使用,否则数据是不能恢复了。比如,通常的文件删除操作,系统只是解除了文件名称和文件内容相关间的联系而已。文件本身的内容还是记录再磁盘上。这种情况下,只要重建文件名称和文件内容间的联系即可恢复文件。

相对而言,简单情形的是元数据损坏。如果只是元数据损坏,而且我们知道正确的元数据。因为元数据操作,不会触及数据部分,因此,我们只要重建元数据部分即可恢复数据。如果涉及到多层,则逐层恢复即可。以分区丢失为例。

比如我们有一块数据盘,整盘我们只是用fdisk分了一个区,现在分区丢失了。这种情形下,只要用fdsik,按照默认情形,重新分区就能恢复分区。

就这种情形,我们给出一个可用的分析流程。

症状和初步排查

症状

客户反馈

降配重启后,系统无法启动

排查发现客户一逻辑卷无法挂载导致重启失败。在/etc/fstab中注释掉逻辑卷的挂载配置,系统启动成功。

但是客户的逻辑卷上有重要数据。此逻辑卷在数据盘上,数据盘大小是2TB。此磁盘全部2TB全部分配给一个分区,此分区上创建有LVM结构。

分区数据如下

初步排查

首先确定分区上是否有数据,通过查看一些扇区,我们就会有很大的概率确认这一点。当然也可以逐扇区确认。

逐扇区确认,可以用如下命令办理。假设磁盘是/dev/vdb。

当然,也可以通过抽样检查来确认。这种方法通常是检查磁盘分区的前面一部分扇区。比如,下面的例子,通过检查前面几十个扇区,我们可以确认磁盘上确有数据。

接下来使用testdisk工具恢复数据。尝试数次,testdisk工具总是在扫描到2%时停滞,处理过程不能继续。

初次恢复尝试

分区还在,但是LVM结构丢失,经检查,由LVM工具链维护的备份数据/etc/lvm/backup/vg_xxxxxx文件还在。因此,这种情形下,按照我们的恢复流程,只要在分区之上,尝试重建LVM和文件系统,应该就可以解决问题。

根据备份数据恢复LVM结构,可以参考Recovering Physical Volume Metadata。可惜的是,我们第一步就折戟沉沙了。

看样子,分区的数据有些地方出错了。根据上面命令报错的信息,对比LVM的备份数据和分区数据,很快我们就发现了问题。现有分区记录的其拥有的扇区数目,少于其上LVM卷组记录的扇区数量。

问题出在哪里?

因为种种原因,我们不能确认分区信息和LVM备份数据为何不一致。但是,我们可以进一步从磁盘上提取、分析数据。因为有关分区的元数据在(分区在),所以我们进一步检查磁盘上还有没有有关LVM的元数据?这只要使用下面的命令行

结果及其结果分析如下

所以,磁盘上还有有关LVM的元数据,但是为什么系统没有凭借这些数据构建出LVM结构呢?我们创建一个测试环境,用strace追踪下系统处理LVM物理卷元数据的执行路径。如下命令即可

当然,更好的办法是把strace记录放置到文件中,以备仔细检查

我们组合使用strace和grep命令来确认系统默认的LVM物理卷位置。如果你没有耐心分析下面的数据,请跳过直接看后面的截图

数据清洗结果如下。如果没有耐心分析,请跳过直接看下面的分析截图

很明显,系统预期LVM元数据是在分区的第8个扇区,但是在需要做数据恢复的磁盘上,LVM的元数据却是在第71个扇区,而分区的起始扇区是2048,因此,LVM数据根本不在分区内。这就是为什么磁盘上还有LVM元数据,系统却没有识别出来LVM的原因。

既然系统是因为有关LVM的元数据所在扇区不对而导致系统无法识别LVM结构,设想通过重新分区,我们把有关LVM元数据调整到分区的第8个扇区。稍加计算,就会发现,只要把分区的起始扇区从第2048个扇区调整到第63个扇区即可。不仅如此,通过调整分区大小,我们同样也解决了磁盘分区扇区数不足的问题

数据恢复

较新的fdisk工具,不允许起始扇区小于2048,因此,我们用parted工具来调整分区的起始扇区。

调整过程是先删掉扇区,而后再创建之。而结果正如我们所预期的,分区调整完成,客户的数据立刻恢复了。物理卷、卷组、逻辑卷、文件系统以及数据,都完好无损。

结语

从处理这个实际case可以看出,如果知道如何识别各层元数据,比如分区LVM文件系统;能够追踪系统处理各层元数据的逻辑,那么,组合使用UNIX常用的ddod等工具,足以简单有效的处理元数据损坏的情形,快速恢复数据。如果掌握了常见的系统调用,并且掌握了strace工具,那么对于如何识别元数据以及系统如何处理元数据,完全可以通过简单分析strace输出拿到相应答案。

除了易学、简单、快捷、高效,元数据修复方案还有一个优点,就是可以确保不会破坏数据。这可能是这个方案的最大亮点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[转]Linux存储入门:简易数据恢复方案--分区和LVM实战 的相关文章

  • 修改linux下的路径

    虽然我认为我已经接近 Linux 专业人士 但显然我仍然是一个初学者 当我登录服务器时 我需要使用最新版本的R 统计软件 R 安装在 2 个地方 当我运行以下命令时 which R I get usr bin R 进而 R version
  • awk 子串单个字符

    这是columns txt aaa bbb 3 ccc ddd 2 eee fff 1 3 3 g 3 hhh i jjj 3 kkk ll 3 mm nn oo 3 我可以找到第二列以 b 开头的行 awk if substr 2 1 1
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 无法加载 JavaHL 库。- linux/eclipse

    在尝试安装 Subversion 插件时 当 Eclipse 启动时出现此错误 Failed to load JavaHL Library These are the errors that were encountered no libs
  • 如何通过替换为空页映射来取消映射 mmap 文件

    Linux 用户空间有没有办法用空页面 映射自 dev null 或者可能是一个空页面 重复映射到从文件映射的页面的顶部 对于上下文 我想找到这个 JDK bug 的修复 https bugs openjdk java net browse
  • 通过特定分隔符删除字符串

    我的文件中有几列 其中第二列有 分隔符 我想删除第二列中的第一个 第三个和第四个字符串 并将第二个字符串留在该列中 但我有正常的分隔符空间 所以我不知道 input 22 16050075 A G 16050075 A G 22 16050
  • Jenkins中找不到环境变量

    我想在詹金斯中设置很多变量 我试过把它们放进去 bashrc bash profile and profile of the jenkins用户 但 Jenkins 在构建发生时找不到它们 唯一有效的方法是将所有环境变量放入Jenkinsf
  • 如何在bash中使用jq从变量中包含的json中提取值

    我正在编写一个 bash 脚本 其中存储了一个 json 值 现在我想使用 Jq 提取该 json 中的值 使用的代码是 json val code lyz1To6ZTWClDHSiaeXyxg redirect to http examp
  • 为什么 Linux perf 使用事件 l1d.replacement 来处理 x86 上的“L1 dcache misses”?

    在英特尔 x86 上 Linux用途 https stackoverflow com a 52172985 149138事件l1d replacements来实施其L1 dcache load misses event 该事件定义如下 计数
  • 为什么内核需要虚拟寻址?

    在Linux中 每个进程都有其虚拟地址空间 例如 32位系统为4GB 其中3GB为进程保留 1GB为内核保留 这种虚拟寻址机制有助于隔离每个进程的地址空间 对于流程来说这是可以理解的 因为有很多流程 但既然我们只有 1 个内核 那么为什么我
  • Linux中的CONFIG_OF是什么?

    我看到它在很多地方被广泛使用 但不明白在什么场景下我需要使用它 What is 配置 OF OF 的全名是什么 打开固件 这是很久以前发明的 当时苹果公司正在生产基于 PowerPC CPU 的笔记本电脑 而 Sun Microsystem
  • Linux中的定时器类

    我需要一个计时器来以相对较低的分辨率执行回调 在 Linux 中实现此类 C 计时器类的最佳方法是什么 有我可以使用的库吗 如果您在框架 Glib Qt Wx 内编写 那么您已经拥有一个具有定时回调功能的事件循环 我认为情况并非如此 如果您
  • chown:不允许操作

    我有问题 我需要通过 php 脚本为系统中的不同用户设置文件所有者权限 所以我通过以下命令执行此操作 其中 1002 是系统的用户 ID file put contents filename content system chown 100
  • 在哪里可以找到并安装 pygame 的依赖项?

    我对 Linux 比较陌生 正在尝试安装 python 的 pygame 开发环境 当我运行 setup py 时 它说我需要安装以下依赖项 我找到并安装了其中之一 SDL 然而 其他人则更加难以捉摸 Hunting dependencie
  • Android 时钟滴答数 [赫兹]

    关于 proc pid stat 中应用程序的总 CPU 使用率 https stackoverflow com questions 16726779 total cpu usage of an application from proc
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • 如何在apache 2.4.6上安装apxs模块

    我刚刚用过apt get update我的 apache 已更新为2 4 6 我想安装 apxs 来编译模块 但收到此错误 The following packages have unmet dependencies apache2 pre
  • ubuntu:升级软件(cmake)-版本消歧(本地编译)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的机器上安装了 cmake 2 8 0 来自 ubuntu 软件包 二进制文件放置在 usr bin cmake 中 我需要将 cmake 版本至少

随机推荐

  • 天梯赛习题集 L 1 - 016 查验身份证 (15 分)

    一个合法的身份证号码由17位地区 日期编号和顺序编号加1位校验码组成 校验码的计算规则如下 首先对前17位数字加权求和 权重分配为 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 然后将计算的和对11取模得到值Z 最
  • Uabntu 17.04+python2.7 +anaconda2

    Uabntu 17 04 python2 7 anaconda2 python 2 7 安裝 安裝外部庫 網絡問題 安裝 pip apt get Anacoda2 使用 電腦白癡的ubantu python之路 python 2 7 安裝
  • 在linux里rm 命令怎么删除多个文件

    dilantaya 说 请问在linux里rm 命令怎么删除多个文件 比如 大量的 2010 10 xx log 和 2010 09 xx log 文件 用rm命令怎么一起给删除了 谢谢 chenyx 说 用 代替xx就能删除了 例如 rm
  • cmake使用TOOLCHAIN进行交叉编译

    cmake DCMAKE TOOLCHAIN FILE toolchain RK3399 cmake CMAKE INSTALL PREFIX usr local rk3399mpp 创建toolchain RK3399 cmake文件 c
  • View事件分发相关面试题

    1 View事件分发机制 对屏幕的点击 滑动 抬起等一系的动作都是由一个一个MotionEvent对象组成的 根据不同动作 主要有以下三种事件类型 ACTION DOWN 手指刚接触屏幕 按下去的那一瞬间产生该事件 ACTION MOVE
  • STL 中排序相关算法总结

    sort 头文件 sort 算法定义在头文件 include 中 算法作用 sort 算法是基于快速排序实现的 默认对指定范围内的元素进行升序排列 使用条件 使用 sort 进行排序到容器必须支持随机访问 默认使用 lt 运算符进行比较 也
  • CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?

    CNN 卷积神经网络 RNN 循环神经网络 DNN 深度神经网络 的内部网络结构有什么区别 CNN 卷积神经网络 RNN 循环神经网络 DNN 深度神经网络 的内部网络结构有什么区别 以及他们的主要用途是什么 只知道CNN是局部感受和参数共
  • ElasticSearch 8.0脚本评分查询

    使用脚本来提供返回的文档的自定义评分 script score查询非常有用 例如 评分函数成本比较高且我们仅仅需要计算一组过滤后的文档的评分 请求的样例 下面的script score查询设置每个返回的文档的评分等于my int字段值除以1
  • 机器视觉介绍

    机 器 视 觉 介 绍 机器视觉介绍 机器视觉介绍 机器视觉检测系统任务 尺寸测量 条码识别 外观测量
  • 【图文教程】若依前后端分离版本-菜单怎么设置

    在使用若依前后端分离版本作为基础架构的时候 需要新建菜单怎么操作 本文凯哥将详细讲解怎么添加 1 登录若依系统后 系统管理 gt gt 菜单 先新建一个一级菜单 可以模仿 系统管理 菜单来创建 系统菜单 我们自己创建的 淘宝客 菜单如下 这
  • 存够20万才敢结婚!算算你的工资够了吗?

    前程无忧2015年白领婚恋成本调查 报告 乔治 克鲁尼结婚了 本尼迪克特 康伯巴奇结婚了 福山雅治结婚了 堀北真希结婚了 恐婚的最后还是踏入了婚姻殿堂 永远的偶像派也闪婚了 真是应验了 凡是有钱的单身汉总想娶位太太 这已经成了一条举世公认的
  • 微信公众号授权(java后端)

    一 授权开发的流程 详情的东西请以官网为准 在此就不多说了 具体而言 网页授权流程分为四步 1 引导用户进入授权页面同意授权 获取code 2 通过code换取网页授权access token 与基础支持中的access token不同 3
  • Django组件介绍

    文章目录 Django组件介绍 1 分页器的使用 1 1 数据库内插入大量数据 1 2 导入模块 1 3 实例化一个分页器 1 4 分页器对象相关的方法 1 5 一个简单的分页示例 2 forms组件 2 1 检验字段功能 2 11 导入f
  • python中[:,2]是什么意思

    这是numpy的切片操作 一般结构如num a b c d 分析时以逗号为分隔符 逗号之前为要取的num行的下标范围 a到b 1 逗号之后为要取的num列的下标范围 c到d 1 如果是这种num b c d a的值未指定 那么a为最小值0
  • 农业土壤墒情监测系统解决方案

    一 方案概述 土壤墒情监测系统能够实现对土壤墒情 土壤湿度 的长时间连续监测 用户可以根据监测需要 灵活布置土壤水分传感器 也可将传感器布置在不同的深度 测量剖面土壤水分情况 系统还提供了额外的扩展能力 可根据监测需求增加对应传感器 监测土
  • Java如何将date日期格式转换为时间戳

    可以使用Java中的java util Date类的getTime 方法将日期转换为时间戳 例如 import java util Date public class Main public static void main String
  • Advanced Installer汉化版教程(打包程序,安装包制作)

    Advanced Installer汉化版教程 转载 打包程序 安装包制作 下载地址 http www crsky com soft 6776 html 1 新建一个安装工程 2 详细的设置工程文件 A 设置产品信息以及在控制面板里的一些信
  • C++扫雷制作(新手上路)

    文章目录 前言 制作软件 代码结构 结构体 刷新屏幕 创建雷区 游戏过程 按钮的制作 总结 前言 在熟读C primer plus 之后 为了进一步熟悉C 编程 制作了一个简易版扫雷 有何不足 有何见地 请大家评论留言 以下是游戏图片 制作
  • vue+elementUI的el-form的回车键登录,监听键盘来触发事件

    vue elementUI的el form的回车键登录 监听键盘来触发事件 1 当只有一个el input的时候 可以用elementUI的自带的回车键触发提交事件 但是有时候会同时触发刷新页面 这样可以在el form上添加 submit
  • [转]Linux存储入门:简易数据恢复方案--分区和LVM实战

    数据恢复有没有简易方案 IT工程师一般都知道如何操作和使用文件和目录 但是 对于系统如何构建出 抽象出文件和目录 一般就不熟悉了 至于更下层的概念 可能大家知道最多的就是驱动了 所以 为了规避这点 可行的简易方案之一 就是以黑箱方式使用te