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