Неделя восстановления: Работа с образами дисков
24.12.2007

При восстановлении системы иногда полезно создать образ диска, с которым можно будет работать в другой системе. Это особенно полезно, например, когда диск «сыпется» (быстро появляются новые сбойные сектора). Можно создать образ диска по сети, использую команду:

# ssh -C user@remotehost "cat >disk1.img" </dev/sda

Опция -C обозначает компрессию. Ее использовать нужно, если в вас медленное сетевое соединение, а процессоры на удаленном и вашем компьютерах довольно мощные. Полученный файл (disk1.img) — это точная копия данных на оригинальном диске. Файл такого же типа используется в Xen и KVM виртуальных средах. Команда file выводит информацию о файле:

# file disk1.img
disk1.img: x86 boot sector; partition 2: ID=0x83, starthead 0, startsector 208845, 1012095 sectors; partition 3: ID=0x83, starthead 0, startsector 1220940, 6972210 sectors

Можно также вывести таблицу разделов диска, с которого снят образ, использую команду fdisk -l. Однако, для доступа к какому-либо из разделов образа, сначала нужно организовать доступ к файлу как к блочному устройству. Для этого используется команда losetup:

# losetup -f -v disk1.img
Loop device is /dev/loop0

Теперь содержимое файла disk1.img доступно через блочное устройство /dev/loop0. Опция -f означает, что нужно использовать первое доступное устройство вида /dev/loopN, а опция -v означает включение режима подробного выполнения команды, что позволит увидеть имя этого устройства. Теперь можно воспользоваться kpartx для создания блочного устройства для каждого раздела образа:

# kpartx -a -v /dev/loop0
add map loop0p1 : 0 208782 linear /dev/loop0 63
add map loop0p2 : 0 1012095 linear /dev/loop0 208845
add map loop0p3 : 0 6972210 linear /dev/loop0 1220940

Файлы блочных устройств появятся в директории /dev/mapper. Имена их будут начинаться с имени блочного устройства всего диска (loop0), буквы p и номера раздела. Команда file -s проанализирует содержимое каждого раздела:

# file -s /dev/mapper/loop0p*
/dev/mapper/loop0p1: Linux rev 1.0 ext3 filesystem data
/dev/mapper/loop0p2: Linux/i386 swap file (new style) 1 (4K pages) size 126510 pages
/dev/mapper/loop0p3: LVM2 (Linux Logical Volume Manager) , UUID: 5zG5aVBny87KnCdsicTz3RQbt3w37db

В этом примере первый раздел содержит файловую систему, которая может быть немедленно примонтированна (mkdir /mnt/x1 ; mount /dev/mapper/loop0p1 /mnt/x1).

Второй раздел — это swap-раздел (раздел подкачки), который нам не интересен. Третий раздел содержит таблицу LVM. Для организации доступа к логическим дискам этого раздела можно использовать vgscan и vgchange:

# vgscan
Reading all physical volumes. This may take a while...
Found volume group "zephyr" using metadata type lvm2
Found volume group "main" using metadata type lvm2

# vgchange -ay
2 logical volume(s) in volume group "zephyr" now active
4 logical volume(s) in volume group "main" now active

# file -s /dev/mapper/zephyr-*
/dev/mapper/zephyr-home: Linux rev 1.0 ext3 filesystem data (large files)
/dev/mapper/zephyr-root: Linux rev 1.0 ext3 filesystem data (large files)

При сканировании обноружено имя группы — zephyr. После выполнения всех этих команд логические разделы группы zephyr могут быть подмонтированны.

Примечание: Если имя группы образа диска конфликтует с именем группы в системе, то необходимо переименовать имя группы системы. Однако это непростая задача. Поэтому рекомендуется давать уникальные имена группам сразу при их создании. Использовать для имени главной группы имя хоста системы является неплохим решением.

Когда вы закончите работать с образом диска, нужно отключить его:

# vgchange -an zephyr
0 logical volume(s) in volume group "zephyr" now active
# kpartx -d /dev/loop0
# losetup -d /dev/loop0