Статья была написана 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.
Помогла ли вам статья?