最全面的LVM逻辑磁盘数据恢复方案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据恢复需求
2.1Linux IO存储栈
图(1)Linux IO 存储栈
Linux 的存储相关的栈包括如图1所示,最下方为各种硬件存储器,例如SATA,SAS,SSD等硬盘和磁带库等。
2.2存储故障
2.2.1介质故障
•磁盘消失,例如由于线缆或者网络问题造成的磁盘丢失或者ISCSI磁盘链接失败
•磁盘坏道
•偶发的硬件错误
2.2.2错误操作
包括误删除,格式化,重新分区等操作。
2.2.3RAID故障
服务器上的硬盘比较多的应用了RAID(冗余磁盘阵列)来实现数据保护。以多块硬盘环境下常使用的RAID 5为例,当损坏一块硬盘时数据不会受到影响,而这种情况下如果第二块硬盘再损坏(或者更换硬盘时拔错)就会丢失数据。此时要注意硬盘掉线的先后顺序,如果将2块硬盘同时上线则会导致部分数据访问出错,正确的方法是先上线最后出问题的硬盘,看数据是不是我们想要的,再尝试之前掉线的硬盘进行比较。
有些RAID卡在插入掉线的硬盘时会自动尝试Rebuild(重建),这样就会损坏我们需要的数据,因此企业级数据恢复最好还是找专业的公司/人士来进行。有的RAID卡还会出现硬盘完好,而RAID信息丢失的问题。如果用户在运输服务器/磁盘阵列时,将硬盘拆出来单独运输,没有记录安装的顺序,也可能会导致数据无法访问。
2.2.4文件或者文件系统故障
这部分属于高端的数据恢复技术,比如ext2、ext3、reiserfs、XFS…文件系统。Linux/Unix的数据恢复难度较大一方面是由于这些文件系统结构复杂,另一方面则是有些厂商的相关资料不公开,比如IBM的AIX系统。这样我们只能通过不断的摸索,积累经验来“破解”它们的结构,最终能够恢复上面的数据,或者提取出修改文件(属性)的访问记录等。
2.3存储部署对数据丢失的考虑
•通常需要引入冗余(REDUNDANT)和备份(BAKUP)两种机制。•RAID和MIRROR和最常见的存储冗余的实现方式,可以容忍介质故障等问题。
•备份测试可以在错误操作或者文件系统故障时,很容易的恢复数据。3数据恢复策略
3.1数据恢复基本步骤
由于存储故障是无法完全避免的,在出现故障的时候,需要考虑如下的几个基本策略和步骤:
•分析故障,通过分析用户手册,分析系统LOG,检查系统状态等方式定位和分析问题
•在问题没有定位之前,不可以对存储系统作更改操作
•在分析问题之后,必须通过模拟系统测试恢复策略的可行性和风险•寻求专业帮助,通过mail list,BBS,付费支持等方式获取专业的指导
3.2数据恢复方法
3.2.1硬件故障处理
•检查硬盘,数据线,连接部位,电源等问题
•检查Fimware版本,分析对应的Changelog
•磁盘坏扇区,使用二进制的操作执行备份,例如dd命令
3.2.2磁盘分区故障
•检查驱动和内核版本
•通过fdisk ,diskpart, partprobe,gpart等工具分析分区信息
•检查磁盘和分区大小,blockdev,fdisk,sysfs等工具
3.2.3RAID故障
•分析RAID中device,raidset和volume的信息
•查看RAID的配置文件的信息
•尽可能的分析RAID的元数据信息
3.2.4元数据
元数据是指数据的组织结构。通常,有两种方式存储:
)在磁盘上,通常在硬盘的最前面或者最后面预留扇区用于存储元数据
)在配置文件中保存必要的信息
在执行数据恢复的时候,通常需要先修复元数据再修复数据。
4LVM数据恢复
4.1LVM基础
4.1.1LVM的架构
图(2)LVM基础架构
如果所示为Linux Volume Management系统的基础架构,由PV,VG 和LV组成。
4.1.2LVM的on-disk PV结构
PV的基本结构如下:
)标签,占用一个sector,包括签名,UUID,元数据的位置指针
)元数据:占用多个sector
)真正元数据的指针
)循环缓存,文本格式
)原子更新操作
)序列号
)校验码,冗余信息,自动修复信息等
图(3)LVM的PV结构
4.1.3LVM的文本元数据配置
如下为一个/etc/lvm/backup/pool的配置实例:
# Generated by LVM2 version 2.02.42 (2008-10-26): Sat Sep 25 17:36:30 2010
contents = "Text Format Volume Group"
version = 1
description = "Created *after* executing 'lvcreate --name block --size 300G pool'"
creation_host = "zhuweiR30" # Linux zhuweiR30 2.6.28-storix #1 SMP Thu Dec 24 17:25:02 CST 2009 i686
creation_time = 1285407390 # Sat Sep 25 17:36:30 2010
pool {
id = "0Lm9dz-sIeu-t2Ho-qIBR-lD2P-dcbK-K1U4zW"
seqno = 2
status = ["RESIZEABLE", "READ", "WRITE"]
flags = []
extent_size = 8192 # 4 Megabytes
max_lv = 0
max_pv = 0
physical_volumes {
pv0 {