Восстановление томов RAID и LVM

Apr 28, 2006 By Richard Bulling
in Linux Journal

Софтверные решения по управлению массивами RAID и томами LVM - это классно, до тех пор пока вы не потеряли данные

Комбинация RAID (Redundant Array of Inexpensive Disks) и LVM2 (Logical Volume Manager, version 2), доступная в современных дистрибутивах Linux, предоставляет возможность построения как надежных так и производительных решений, но ценой такого решения вполне может стать невозможность восстановления данных с дисков, которые разбиты под использование партиций RAID и LVM2. Я обнаружил такой эффект недавно, попытавшись смонтировать системный диск, созданный с помощью сочетания RAID и LVM2, на другом компьютере. Первые попытки чтения файловой системы были страшным разочарованием. Ситуация следующая: я запихнул два жестких диска в системный блок small-form-factor, который реально предназначен для монтажа только одного диска. Затем создал на двух дисках RAID 1 (простое зеркало). Решение не заработало: через несколько часов системник вырубился автоматом из-за критического повышения температуры внутри. У меня уже был в запасе другой блок, где я и попытался переинсталлировать систему, используя только один диск.

Восстановление системы не представляет проблемы, если использовался один диск без всяких раидов-лвм-ов. Всего и дел, что смонтировать диск на другой системе и скопировать файлы. Почему же это так трудно с RAID и LVM2? Две проблемы: данные скрыты в логическом томе, который еще прячется где-то внутри RAID, кроме того, имя группы томов на устройстве RAID может иметь то же имя, что и на восстанавливаемой системе.

Многие популярные ОС (например, Red Hat Enterprise Linux, CentOS или Fedora Core) могут предлагать создать логические тома непосредственно во время установки, разбивая диски на разделы, пригодные для пометки их как тома LVM. По умолчанию эти инсталляторы задают имена групп томов как VolGroup00, с двумя логическими томами, LogVol00 and LogVol01, первый для корневой ФС, второй для раздела swap, как показано в Листинге 1.

Listing 1. Typical LVM Disk Configuration

[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 имеет три устройства: md0, md1 и md2, для /boot, swap и / соответственно. Группа томов LVM2 накладывается на самое объемное устройство, md2. Имя группы томов - VolGroup00. Выглядит как здоровая идея на текущий момент, потому что конфигурация партиций будет в точности соответствовать конфигурации, которая принята в дистрибутиве по умолчанию. Листинг 2 показывает, как выглядела конфигурация RAID на тот момент, пока она еще работала.

Listing 2. Software RAID Disk Configuration

[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]

Если вы когда-нибудь назовете две группы томов одинаковыми именами, и что-то пойдет не так, можете тоже столкнуться с проблемой невозможности доступа к данным на диске, вынутом из нерабочего системного блока. Создание конфликтующих имен - весьма несложная операция.

Восстановление доступа к устройствам, являвшимся частью RAID

Для решения проблемы первое что нужно сделать, это поместить диск в другую машину. Простой способ выполнить эту операцию заключается в помещении диска в коробочку, переносной рэк, который имеет интерфейс USB. Это уменьшит риск повреждения данных на компьютере-спасателе. Диск должен определиться как SCSI устройство, например, /dev/sda. Дальнейшее исследование заключается в определении конфигурации RAID и получении доступа к тому LVM2 внутри него. Можно воспользоваться командой sfdisk -l /dev/sda, это поможет определить разделы. Для получения конфигурации RAID будем использовать mdadm в режиме сканирования, чтобы определить UUID-ы устройств как показано в Листинге 3.

Listing 3. Scanning a Disk for RAID Array Members

[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

Этот формат подобен формату конфигурационного файла /etc/mdadm.conf, который используется утилитой mdadm. Нам нужно перенаправить вывод сканирования в файл, присоединив строки ARRAY, и всё это поставить в соответствие другому (несуществующему) устройству для передачи параметров RAID 1. Если утилита увидит массив на одном диске в деградированном состоянии, станет доступен режим восстановления.

[root@recoverybox ~]# mdadm --examine --scan  /dev/sda1 /dev/sda2 /dev/sda3 >> /etc/mdadm.conf
[root@recoverybox ~]# vi /etc/mdadm.conf

Отредактируйте /etc/mdadm.conf таким образом, чтобы статус устройств находился в тех же строках, что и определение ARRAY, как показано в Листинге 4. Добавьте “missing” устройства для заполнения вакансий массива (по два устройства на массив для создания простого зеркала). Не забудьте перенумеровать устройства, если на компьютере-восстановителе уже есть какие-то md-устройства и определения для ARRAY.

Listing 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 , чтобы быть уверенным, что устройства активированы. Листинг 5 показывает, как должен выглядеть рабочий массив.

Listing 5. Reactivating the RAID Array

[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.

Восстановление и переименование томов LVM2
Далее система должна увидеть два набора дисков LVM2, сгруппированных в VolGroup00. Обычно команда vgchange -a -y позволяет распознать новую группу томов. Это не работает, если устройства уже содержат идентичные имена групп. Утилита отрапортует, что группа VolGroup00 находится в неконсистентном состоянии и RAID-ы будут не видны. Для исправления этой ситуации необходимо переименовать группу томов, в ручную редактируя файл конфигурации lvm.

Если вы имеете резервную копию всех файлов /etc с компьютера, на котором прежде работал массив, можно отредактировать копию файла /etc/lvm/backup/VolGroup00.

Если вы не имеете резервной копии, можно пересоздать эквивалент этого файла с помощью сканирования меток LVM2 на диске и редактирования бинарного вывода. Обычно LVM2 хранит копию метаданных в начале диска, в 255 секторах, следующих за MBR, которая занимает первые 512 байт. Просмотрите /etc/lvm/lvm.conf и man lvm.conf для лучшего понимания процесса. Поскольку один сектор равен 512 байт, нужно считать начало диска в 128 килобайтный файл:

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. На самом диске текстовые записи не так хорошо форматированы и расположены не в таком порядке, как в конфиге, но работают также. Сохраните поправленную конфигурацию. Файл должен выглядеть как в Листинге 6.

Listing 6. Modified Volume Group Configuration File

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.

Listing 7. Activating the Recovered LVM2 Volume

[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.

Listing 8. Mounting the Recovered Volume

[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.

Listing 9. Backing Up Recovered Volume Group Configuration

[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 software RAID делают возможным построение недорогих решений для хранения данных на основе не специализированных комплектующих. Однако, некоторые действия по восстановлению таких массивов могут быть неочевидными. Если бы была утилита, которая читала бы конфигурацию со служебных областей диска, дело обстояло бы проще. К счастью, разработчики имели достаточно мудрости, чтобы хранить конфигурацию в служебных областях диска в виде простого текста на самом диске. С некоторым терпением в запасе можно восстановить доступ к логическим томам, которые в противном случае могли быть утеряны вместе со всеми файлами на них.

Richard Bullington-McGuire is the Managing Partner of PKR Internet, LLC, a software and systems consulting firm in Arlington, Virginia, specializing in Linux, Open Source and Java. He has been a Linux sysadmin since 1994. You can reach him at rbulling@pkrinternet.com.



Назад в тематический каталог
Назад на страницу переводов из Linux Journal