RAID 和 LVM2 卷的恢复
现代 Linux 操作系统中提供的 Linux 软件 RAID(廉价磁盘冗余阵列)和 LVM2(逻辑卷管理器,版本 2)的组合提供了稳健性和灵活性,但如果您需要从使用软件 RAID 和 LVM2 分区格式化的驱动器恢复数据,则会增加复杂性。最近,当我尝试在另一台计算机上挂载使用 RAID 和 LVM2 创建的系统磁盘时,我以痛苦的方式发现了这一点。首次尝试读取磁盘上的文件系统以令人沮丧的方式失败了。
我曾尝试将两个硬盘放入一个小型计算机中,该计算机实际上只设计用于容纳一个硬盘,并将磁盘作为镜像 RAID 1 卷运行。(在本文的其余部分,我将该系统称为 raidbox。)但这种尝试失败了。运行几个小时后,它会因自动热关断故障而关机。我已经拆开了系统,并开始只用一个磁盘重新安装,这时我意识到旧的 RAID 卷上有一些我想检索的文件。
如果系统没有使用 RAID 或 LVM2,恢复数据会很容易。步骤是将旧驱动器连接到另一台计算机,挂载文件系统,然后从故障卷复制文件。我首先尝试这样做,使用我称为 recoverybox 的计算机,但这次尝试遇到了挫折。
获取数据被证明具有挑战性,既因为数据位于 RAID 设备内部隐藏的逻辑卷上,也因为 RAID 设备上的卷组与恢复系统上的卷组具有相同的名称。
一些流行的现代操作系统(例如,Red Hat Enterprise Linux 4、CentOS 4 和 Fedora Core 4)可以在安装时自动对磁盘进行分区,使用 LVM 为根设备设置分区。通常,它们会设置一个名为 VolGroup00 的卷组,其中包含两个逻辑卷 LogVol00 和 LogVol01,第一个用于根目录,第二个用于交换空间,如清单 1 所示。
清单 1. 典型的 LVM 磁盘配置
[root@recoverybox ~]# /sbin/sfdisk -l /dev/hda Disk /dev/hda: 39560 cylinders, 16 heads, 63 sectors/track Warning: The partition table looks like it was made for C/H/S=*/255/63 (instead of 39560/16/63). For this listing I'll assume that geometry. Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0 Device Boot Start End #cyls #blocks Id System /dev/hda1 * 0+ 12 13- 104391 83 Linux /dev/hda2 13 2481 2469 19832242+ 8e Linux LVM /dev/hda3 0 - 0 0 0 Empty /dev/hda4 0 - 0 0 0 Empty [root@recoverybox ~]# /sbin/pvscan PV /dev/hda2 VG VolGroup00 lvm2 [18.91 GB / 32.00 MB free] Total: 1 [18.91 GB] / in use: 1 [18.91 GB] / in no VG: 0 [0 ] [root@recoverybox ~]# /usr/sbin/lvscan ACTIVE '/dev/VolGroup00/LogVol00' [18.38 GB] inherit ACTIVE '/dev/VolGroup00/LogVol01' [512.00 MB] inherit
软件 RAID 设备的原始配置有三个 RAID 1 设备:md0、md1 和 md2,分别用于 /boot、swap 和 /。LVM2 卷组位于最大的 RAID 设备 md2 上。卷组被命名为 VolGroup00。当时这似乎是一个好主意,因为它意味着此盒子的分区配置看起来类似于发行版默认的做法。清单 2 显示了软件 RAID 阵列在运行时的情况。
清单 2. 软件 RAID 磁盘配置
[root@raidbox ~]# /sbin/sfdisk -l /dev/hda Disk /dev/hda: 9729 cylinders, 255 heads, 63 sectors/track Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0 Device Boot Start End #cyls #blocks Id System /dev/hda1 * 0+ 12 13- 104391 fd Linux raid autodetect /dev/hda2 13 77 65 522112+ fd Linux raid autodetect /dev/hda3 78 9728 9651 77521657+ fd Linux raid autodetect /dev/hda4 0 - 0 0 0 Empty [root@raidbox ~]# cat /proc/mdstat Personalities : [raid1] md2 : active raid1 hdc3[1] hda3[1] 77521536 blocks [2/2] [UU] md1 : active raid1 hdc2[1] hda2[1] 522048 blocks [2/2] [UU] md0 : active raid1 hdc1[1] hda1[1] 104320 blocks [2/2] [UU]
如果您曾经将两个卷组命名为相同的东西,并且出现问题,您可能会面临相同的问题。不幸的是,创建冲突的名称很容易做到,因为操作系统具有默认的主卷组名称 VolGroup00。
要恢复,首先要做的是将驱动器移动到另一台机器。您可以通过将驱动器放入 USB2 硬盘盒中轻松地做到这一点。然后,当您将其插入恢复计算机时,它将显示为 SCSI 硬盘设备,例如 /dev/sda。这降低了在尝试安装原始计算机的硬件时损坏恢复机器的风险。
然后,挑战在于使 RAID 设置被识别,并获得对其中逻辑卷的访问权限。您可以使用sfdisk -l /dev/sda来检查旧驱动器上的分区是否仍然存在。
要使 RAID 设置被识别,请使用mdadm扫描设备的 raid 卷 UUID 签名,如清单 3 所示。
清单 3. 扫描磁盘以查找 RAID 阵列成员
[root@recoverybox ~]# mdadm --examine --scan /dev/sda1 /dev/sda2 /dev/sda3 ARRAY /dev/md2 level=raid1 num-devices=2 ↪UUID=532502de:90e44fb0:242f485f:f02a2565 devices=/dev/sda3 ARRAY /dev/md1 level=raid1 num-devices=2 ↪UUID=75fa22aa:9a11bcad:b42ed14a:b5f8da3c devices=/dev/sda2 ARRAY /dev/md0 level=raid1 num-devices=2 ↪UUID=b3cd99e7:d02be486:b0ea429a:e18ccf65 devices=/dev/sda1
此格式非常接近 mdadm 工具使用的 /etc/mdadm.conf 文件的格式。您需要将 mdadm 的输出重定向到一个文件,将设备行连接到 ARRAY 行,并放入一个不存在的第二个设备以获得 RAID1 配置。以降级模式查看 md 阵列将允许数据恢复
[root@recoverybox ~]# mdadm --examine --scan /dev/sda1 ↪/dev/sda2 /dev/sda3 >> /etc/mdadm.conf [root@recoverybox ~]# vi /etc/mdadm.conf
编辑 /etc/mdadm.conf,使 devices 语句与 ARRAY 语句位于同一行,如清单 4 所示。为每个阵列成员的 devices 条目添加“missing”设备,以填补每个阵列两个设备的 raid1 补充。如果恢复计算机已经有 md 设备和 /etc/mdadm.conf 中的 ARRAY 语句,请不要忘记重新编号 md 条目。
清单 4. /etc/mdadm.conf
DEVICE partitions ARRAY /dev/md0 level=raid1 num-devices=2 ↪UUID=b3cd99e7:d02be486:b0ea429a:e18ccf65 ↪devices=/dev/sda1,missing ARRAY /dev/md1 level=raid1 num-devices=2 ↪UUID=75fa22aa:9a11bcad:b42ed14a:b5f8da3c ↪devices=/dev/sda2,missing ARRAY /dev/md2 level=raid1 num-devices=2 ↪UUID=532502de:90e44fb0:242f485f:f02a2565 ↪devices=/dev/sda3,missing
然后,使用以下命令激活新的 md 设备mdadm -A -s,并检查 /proc/mdstat 以验证 RAID 阵列是否已激活。清单 5 显示了 raid 阵列应有的外观。
清单 5. 重新激活 RAID 阵列
[root@recoverybox ~]# mdadm -A -s [root@recoverybox ~]# cat /proc/mdstat Personalities : [raid1] md2 : active raid1 sda3[1] 77521536 blocks [2/1] [_U] md1 : active raid1 sda2[1] 522048 blocks [2/1] [_U] md0 : active raid1 sda1[1] 104320 blocks [2/1] [_U] unused devices: <none>
如果 md 设备出现在 /proc/mdstat 中,一切都很好,您可以继续挂载 LVM 卷。
下一个障碍是系统现在将有两组包含 VolGroup00 的 lvm2 磁盘。通常,vgchange -a -y命令将允许 LVM2 识别新的卷组。但是,如果存在包含相同卷组名称的设备,则这将不起作用。发出vgchange -a y将报告 VolGroup00 不一致,并且 RAID 设备上的 VolGroup00 将不可见。要解决此问题,您需要通过手动编辑其 lvm 配置文件来重命名您即将挂载在系统上的卷组。
如果您备份了 raidbox 上 /etc 中的文件,您可以编辑 /etc/lvm/backup/VolGroup00 文件的副本,使其读取 VolGroup01 或 RestoreVG 或您希望在要恢复到的系统上命名的任何名称,确保编辑文件本身以重命名文件中的卷组。
如果您没有备份,您可以通过检查磁盘上的 LVM2 标头并编辑掉二进制内容来重新创建等效的 LVM2 备份文件。LVM2 通常将元数据配置的副本保存在磁盘的开头,即磁盘 1 扇区中分区表之后的头 255 个扇区中。有关更多详细信息,请参阅 /etc/lvm/lvm.conf 和 man lvm.conf。由于每个磁盘扇区通常为 512 字节,因此读取此区域将产生一个 128KB 的文件。LVM2 可能已将 LVM2 配置的几种不同的文本表示形式存储在分区本身的前 128KB 中。将这些提取到普通文件中,如下所示,然后编辑该文件
dd if=/dev/md2 bs=512 count=255 skip=1 of=/tmp/md2-raw-start vi /tmp/md2-raw-start
您将看到一些二进制乱码,但请查找纯文本位。LVM 将此元数据区域视为环形缓冲区,因此磁盘上可能存在多个配置条目。在我的磁盘上,第一个条目仅包含物理卷和卷组的详细信息,下一个条目包含逻辑卷信息。查找具有最新时间戳的文本块,并编辑掉除包含 LVM 声明的纯文本块之外的所有内容。这具有包含逻辑卷信息的卷组声明。如果需要,修复物理设备声明。如有疑问,请查看现有的 /etc/lvm/backup/VolGroup00 文件以查看其中内容。在磁盘上,文本条目的格式不如普通备份文件中的格式好,并且顺序也不同,但它们可以满足要求。将修剪后的配置另存为 VolGroup01。然后,此文件应如清单 6 所示。
清单 6. 修改后的卷组配置文件
VolGroup01 { id = "xQZqTG-V4wn-DLeQ-bJ0J-GEHB-4teF-A4PPBv" seqno = 1 status = ["RESIZEABLE", "READ", "WRITE"] extent_size = 65536 max_lv = 0 max_pv = 0 physical_volumes { pv0 { id = "tRACEy-cstP-kk18-zQFZ-ErG5-QAIV-YqHItA" device = "/dev/md2" status = ["ALLOCATABLE"] pe_start = 384 pe_count = 2365 } } # Generated by LVM2: Sun Feb 5 22:57:19 2006
获得卷组配置文件后,使用以下命令将卷组迁移到此系统vgcfgrestore,如清单 7 所示。
清单 7. 激活恢复的 LVM2 卷
[root@recoverybox ~]# vgcfgrestore -f VolGroup01 VolGroup01 [root@recoverybox ~]# vgscan Reading all physical volumes. This may take a while... Found volume group "VolGroup01" using metadata type lvm2 Found volume group "VolGroup00" using metadata type lvm2 [root@recoverybox ~]# pvscan PV /dev/md2 VG VolGroup01 lvm2 [73.91 GB / 32.00 MB free] PV /dev/hda2 VG VolGroup00 lvm2 [18.91 GB / 32.00 MB free] Total: 2 [92.81 GB] / in use: 2 [92.81 GB] / in no VG: 0 [0 ] [root@recoverybox ~]# vgchange VolGroup01 -a y 1 logical volume(s) in volume group "VolGroup01" now active [root@recoverybox ~]# lvscan ACTIVE '/dev/VolGroup01/LogVol00' [73.88 GB] inherit ACTIVE '/dev/VolGroup00/LogVol00' [18.38 GB] inherit ACTIVE '/dev/VolGroup00/LogVol01' [512.00 MB] inherit
此时,您现在可以将旧卷挂载到新系统上,并访问其中的文件,如清单 8 所示。
清单 8. 挂载恢复的卷
[root@recoverybox ~]# mount /dev/VolGroup01/LogVol00 /mnt [root@recoverybox ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup00-LogVol00 19G 4.7G 13G 28% / /dev/hda1 99M 12M 82M 13% /boot none 126M 0 126M 0% /dev/shm /dev/mapper/VolGroup01-LogVol00 73G 2.5G 67G 4% /mnt # ls -l /mnt total 200 drwxr-xr-x 2 root root 4096 Feb 6 02:36 bin drwxr-xr-x 2 root root 4096 Feb 5 18:03 boot drwxr-xr-x 4 root root 4096 Feb 5 18:03 dev drwxr-xr-x 79 root root 12288 Feb 6 23:54 etc drwxr-xr-x 3 root root 4096 Feb 6 01:11 home drwxr-xr-x 2 root root 4096 Feb 21 2005 initrd drwxr-xr-x 11 root root 4096 Feb 6 02:36 lib drwx------ 2 root root 16384 Feb 5 17:59 lost+found drwxr-xr-x 3 root root 4096 Feb 6 22:12 media drwxr-xr-x 2 root root 4096 Oct 7 09:03 misc drwxr-xr-x 2 root root 4096 Feb 21 2005 mnt drwxr-xr-x 2 root root 4096 Feb 21 2005 opt drwxr-xr-x 2 root root 4096 Feb 5 18:03 proc drwxr-x--- 5 root root 4096 Feb 7 00:19 root drwxr-xr-x 2 root root 12288 Feb 6 22:37 sbin drwxr-xr-x 2 root root 4096 Feb 5 23:04 selinux drwxr-xr-x 2 root root 4096 Feb 21 2005 srv drwxr-xr-x 2 root root 4096 Feb 5 18:03 sys drwxr-xr-x 3 root root 4096 Feb 6 00:22 tftpboot drwxrwxrwt 5 root root 4096 Feb 7 00:21 tmp drwxr-xr-x 15 root root 4096 Feb 6 22:33 usr drwxr-xr-x 20 root root 4096 Feb 5 23:15 var
现在您已访问您的数据,一个明智的最后一步是使用以下命令备份卷组信息vcfgbackup,如清单 9 所示。
清单 9. 备份恢复的卷组配置
[root@teapot-new ~]# vgcfgbackup Volume group "VolGroup01" successfully backed up. Volume group "VolGroup00" successfully backed up. [root@teapot-new ~]# ls -l /etc/lvm/backup/ total 24 -rw------- 1 root root 1350 Feb 10 09:09 VolGroup00 -rw------- 1 root root 1051 Feb 10 09:09 VolGroup01
LVM2 和 Linux 软件 RAID 使使用商品硬件创建经济、可靠的存储解决方案成为可能。其中一个权衡是,某些从故障情况中恢复的程序可能不明确。一种可以直接从磁盘可靠地提取旧卷组信息的工具将使恢复更容易。幸运的是,LVM2 系统的设计者明智地将配置的纯文本备份副本保存在磁盘本身上。通过一点耐心和一些研究,我能够重新获得对我认为丢失的逻辑卷的访问权限;愿您在您的 LVM2 和 RAID 安装中获得同样的成功。
本文的资源: /article/8948。
Richard Bullington-McGuire 是 PKR Internet, LLC 的管理合伙人,PKR Internet, LLC 是一家位于弗吉尼亚州阿灵顿的软件和系统咨询公司,专门从事 Linux、开源和 Java。自 1994 年以来,他一直是一名 Linux 系统管理员。您可以通过 rbulling@pkrinternet.com 与他联系。