Прозрачные образы дисков

Статья была написана 23 ноября 2010 г. Перенесена из старого блога.

Уже около года я упорно изучаю технологии виртуализации а в частности очень симпатизирующий мне KVM. За все время работы в этом «виртуальным мире» я познал многие практические прелести виртуализации. Парой мне кажется, что виртуализация делает нас злодеями, по отношению к гостевым операционным системам. С помощью этой технологии мы с легкостью обманываем гостевые системы подсовывая им различное оборудование, унизительно тесним в файлах, или гоняем по цепочке физических серверов…

В этой и последующей за ней статье, я расскажу  Вам как можно без остановки ВМ получить доступ к ее файловой системе из хост системы. Это очень удобно при резервном копировании. В частности это позволяет применять инкрементальное резервное копирование. Такие вот мы негодяи, вертим ВМ как хотим)

Прежде чем я начну практическую часть необходимо отметить, что техника описанная в этой статье эффективна только если VM размещена на RAW-диске или LVM-томе. Для дисковых образов в формате QCOW2 и VMDK доступна специальная библиотека(libguestfs), в состав которой входя утилиты позволяющие работать с файловой системой ВМ. Средствам входящим в libguestfs будет посвящена вторая часть статьи.
Дополнительным ограничением является то, что файловая система используемая в гостевой ОС должна поддерживаться хостом иначе она не может быть смонтирована. И последнее ограничение, это необходимость снять ограничения — стать root’ом.

Технические детали

CentOS 5.5 x86_68
kvm-83-164.el5
libvirt-0.6.3-33.el5_5.3
lvm2-2.02.56-8.el5
parted-1.8.1-27.el5
Gparted-1.6-LiveCD — в качестве гостевой системы

Построение задачи

Собственно сложность реализации заключается в том, что ВМ на подключенных вами дисковых образах создает собственную таблицу разделов и какое то количество логических томов, это уже больше зависит от Вас.
После того как диск размечен, созданы разделы и возможно уже записаны данные на эти разделы, простое монтирование такого диска в хост системе закончится не удачей.
Сообщение типа «Не найден суперблок» Вы увидеть при монтировании LVM-тома или «не верный тип файловой системы» может выдать команда mount при монтировании RAW-образа. Все это закономерно, так как команде mount не известна карта  диска ВМ и собственно расположение логических томов с расположенными на них файловыми системами. Нашей задачей как раз и является, помочь mount разобраться в этой ситуации а точнее определить смещение интересующих разделов диска.

Практика

1. Начнем с того, что образ диска создан и ВМ уже работает с ними, предварительно  разметив  и создав разделы по вашему усмотрению. Остановка гостевой системы не требуется.
К гостевой системе, образы дисков я чаще всего подключаю как scsi-диски или на более свежих ядрах как virtio-диски.

2. Узнаем смещение интересующего нас раздела. Смещение — это некоторое число служебных байт сразу за которыми начинается непосредственно раздел диска.

Запускаем parted с одним единственным параметром — это путь к нашему образу диска в формате RAW
#parted /STORAGE/vm_storage/Gparted-001-HDA.img
GNU Parted 1.8.1
Using /STORAGE/vm_storage/Gparted-001-HDA.img
Welcome to GNU Parted! Type ‘help’ to view a list of commands.
(parted) unit
здесь, в приглашении командной строки вводим unit, что бы изменить единицы измерения
Unit? [compact]? B
вводим B, что означает байты
(parted) print
выводим таблицу разделов нашего диска и дополнительную служебную информацию
Model: (file)
Disk /STORAGE/vm_storage/Gparted-001-HDA.img: 2147483647B
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number    Start             End                           Size                      Type          File system    Flags
1              32256B         2146798079B 2146765824B     основной       ext3
красным выделено искомое нами смещение
(parted) q
q — выход из интерпретатора parted

3. Делаем наш образ диска блочным устройством. В этом нам поможет маленькая но очень интересная утилита losetup.

#losetup -o 32256 /dev/loop0 /STORAGE/vm_storage/Gparted-001-HDA.img
здесь losetup превращает наш образ в стандартное блочное устройство /dev/loop0 а опция -o 32256 говорит losetup о том, что нужно читать образ диска  с указанного байта.

В случае если в вашем дистрибутиве по каким то невероятным причинам не оказалась losetup можно воспользоваться стандартным mount.

#mount -t ext3 -o loop,ro,offset= 32256 /STORAGE/vm_storage/Gparted-001-HDA.img /mnt
здесь nount монтирует файл как блочное устройство с правами только для чтения начиная читать его с указанного байта.

При использовании mount, пункт №4 уже можно опустить.

4. Монтируем наше новоиспеченное блочное устройство

#mount /dev/loop0 /mnt

5. Получаем файловую систему ВМ.

#cd /mnt

Что касается LVM-томов, то здесь все точно так же только в обязательном порядке необходимо создать снапшот тома и проделывать все уже со снапшотом. Пункт №3 опускаем так как LVM-том уже является блочным устройством.

Настоятельно рекомендую монтировать файловые системы гостевых VM, в режиме только для чтения(ro)! Этого достаточно для бекапа данных.
Запись данных на виртуальный диск работающей VM, реальна но очень не безопасна!

Во второй части я расскажу об утилитах входящих в состав библиотеки libguestfs, позволяющих получить доступ к файловой системе ВМ расположенной на дисковых образах в формате qcow2, vmdk.

Добавить комментарий