Работа с raw образами виртуального сервера libvirt
Для человека непосвящённого может показаться, что сам заголовок статьи содержит лишь бессмысленный набор слов, но для нас, админов, это если не таинство, то вполне так полезная информация. Как-то понадобилось мне скопировать с системного раздела винчестера в раздел виртуального диска нужные мне файлы, и стал я думать, как это сделать быстро и без хлопот. Запустить виртуальную машину и подключиться к хосту через ssh? Можно, но системы на виртуальной машине нет. Загрузиться с live-cd? А зачем дополнительная прослойка, если файловую систему изнутри образа диска можно смонтировать? Итак, работаем с raw образами виртуального сервера!
Создавать образы можно с помощью virt-manager, с помощью dd, а можно и «срезать» с готового винчестера командой:
sudo cat /dev/sdd>sdd.img
При этом cat должна выполняться с правами root, а копирование в файл — не обязательно.
Образы можно выгружать на реальные винчестеры командой:
sudo cp ./sdd.img /dev/sdd
Можно просматривать таблицу разделов виртуального винчестера командой:
sudo fdisk -l ./sdd.img
Можно монтировать файловые системы разделов изнутри образа в реальную систему, для этого надо просмотреть таблицу разделов
sudo fdisk -l ./sdd.img
Выводит:
Disk ./sdd.img: 85.9 GB, 85899345920 bytes 255 heads, 63 sectors/track, 10443 cylinders, total 167772160 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x95929592 Device Boot Start End Blocks Id System ./sdd1 * 63 167766794 83883366 7 HPFS/NTFS/exFAT
Здесь мы видим один основной раздел с файловой системой ntfs. Посмотрим, как его надо монтировать. Раздел начинается с 63 «юнита», один «юнит» соответствует 1 сектору и равен 512 байт (см выше жирным шифтом). Умножаем одно на другое 🙂 63*512=32256
sudo mount -t ntfs-3g -o loop,offset=32256 ./sdd.img /mnt
Вуаля! Можно обмениваться информацией с файловой системой внутри образа или даже чрутиться в нее (если архитектура вашей ОС соответствует виртуальной).
Отключение файловой системы:
sudo umount ./sdd.img
Ещё одну замечательную возможность работы с образами дисков даёт обращение к ним как к loop-устройствам:
sudo losetup -f -v ./sdd.img
Ответ: Loop device is /dev/loop0
Появляется устройство /dev/loop0. Аналогично работе с файлом, можно посмотреть или создать на нём разделы командами:
sudo fdisk -l ./sdd.img
sudo fdisk ./sdd.img
Но можно пойти дальше и установить kpartx:
sudo aptitude install kpartx
Запускаем:
sudo kpartx -av /dev/loop0 ls /dev/mapper
и видим:
control loop0p1
Теперь с устройством /dev/mapper/loop0p1 запросто можно работать, как с разделом на диске, например, создать там файловую систему:
sudo mkfs.ext4 /dev/mapper/loop0p1 -L / sudo fdisk -l ./sdd.img
Видим:
Disk /dev/loop0: 85.9 GB, 85899345920 bytes 255 heads, 63 sectors/track, 10443 cylinders, total 167772160 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x95929592 Device Boot Start End Blocks Id System /dev/loop0p1 * 63 167766794 83883366 83 Linux
На /dev/loop0 можно установить grub; /dev/mapper/loop0p1 можно куда-нибудь смонтировать, установить туда Linux, чрутнуться в него, сделать нужные настройки и т.д.
Закончили работу с разделами виртуального диска? Командуем:
sudo kpartx -d /dev/loop0 sudo losetup -d /dev/loop0