Предположим ситуацию когда имеется сервер под управлением Linux на котором установлен KVM и запущены виртуальные машины с Linux. С точки зрения производительности и удобства диски виртуальных машин нужно размещать в разделах LVM. Один LV = один диск для виртуальной машины. Однако когда потребуется достать данные с такого диска, а там установлен Linux с использованием LVM то окажется что LVM сервера не видит LVM расположенный внутри диска.
Для этого потребуется утилита kpartx которая подключит диск виртуальной машины после чего он станет виден ядру, lvm и fdisk.
Забегая вперёд хочу предупредить также чтобы 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 когда вы закончите работу с диском виртуальной машины.
По материалам статьи