Доступ к данным на диске гостевой виртуальной машины

Предположим ситуацию когда имеется сервер под управлением Linux на котором установлен KVM и запущены виртуальные машины с Linux. С точки зрения производительности и удобства диски виртуальных машин нужно размещать в разделах LVM. Один LV = один диск для виртуальной машины. Однако когда потребуется достать данные с такого диска, а там установлен Linux с использованием LVM то окажется что LVM сервера не видит LVM расположенный внутри диска.

Для этого потребуется утилита kpartx которая подключит диск виртуальной машины после чего он станет виден ядру, lvm и fdisk.

Чтобы получить связные данные с диска виртуальной машины необходимо остановить виртуальную машину перед манипуляциями с LVM. А для уменьшения времени простоя возможно создание snapshot и последующая работа с ним в режиме readonly.

Забегая вперёд хочу предупредить также чтобы vgscan увидел LVM с диска после мапирования kpartx важно убедиться, что конфигуация LVM позволяет это сделать обратите внимание чтобы регулярное выражение в опции filter позволяло отобразить появившиеся разделы.

# cat /etc/lvm/lvm.conf | sed -e 's/#.*$//g' | sed -e '/^[ \t]*$/d'
    preferred_names = [ "^/dev/mpath/", "^/dev/mapper/mpath", "^/dev/[hs]d" ]
    filter = [ "a/.*/" ]

Здесь фильтр позволяет принимать accept все lvm. Это правило устанавливается по умолчанию. Опция “r/.*/” блокирует reject все lvm.

Итак нам понадобится kpartx который можно установить при помощи менеджера пакетов yum:

yum install kpartx
kpartx -av /dev/VG_GUESTS/guest1
add map guest1p1 : 0 208782 linear /dev/VG_GUESTS/guest1 63
add map guest1p2: 0 16563015 linear /dev/VG_GUESTS/guest1 208845

Теперь для того чтобы получить доступ к LVM на втором разделе нужно ресканировать LVM утилитой vgscan и активировать нужный LV раздел командой vgchange -ay:

# kpartx -a /dev/VG_GUESTS/guest1
# vgscan
Reading all physical volumes . This may take a while...
Found volume group "VolGroup00" using metadata type 1vm2
# vgchange -ay VolGroup00now
2 logical volume(s) in volume group VolGroup00 now active.
# lvs
LV VG Attr Lsize Origin Snap% Move Log Copy%
LogVol00 VolGroup00 -wi-a- 5.06G
LogVol01 VolGroup00 -wi-a- 800.00M

Теперь можно делать то ради чего это было нужно. Например, бэкап раздела в локальный файл VolGroup00-LogVol00.raw. Такой подход позволяет минимизировать время простоя виртуалки если весь LV диск большого размера, а нужен бэкап только небольшого 5-10 гиг корневого раздела несущей системы. Хотя лично я предпочитаю разносить систему и данные на разные LV и отдавать в виртуалку разные диски. Тогда для бэкапа системы не потребуется использовать kpartx.

# dd if=/dev/VolGroup00/LogVol00 of=./VolGroup00-LogVol00.raw bs=2M

Или смонтировать эти LV и получить доступ к файлам.

# mount /dev/VolGroup00/LogVol00 /mnt/
# umount /mnt/

Чтобы виртуальная машина могла стартануть необходимо деактивировать все тома в группе lvchange -an и группу томов vgchange -an, а затем удалить мапирование kpartx -d:

# lvchange -an VolGroup00
# vgchange -an VolGroup00
# kpartx -d /dev/VG_GUESTS/guest1

Ну и наконец удалить loop устройство losetup -d когда вы закончите работу с диском виртуальной машины.

По материалам статьи