How-To: Как создать образ диска для ВМ

1. Интро

В данной статье я хочу обобщить найденный мной материал, в котором описывается процесс создания образа жесткого диска, записи на него загрузчика GRUB, преобразования формата образа для различных систем виртуализации и настройка систем виртуализации для работы с этим образом. Все примеры приведены для ОС Linux со стандартным набором системных программ.


2. Создание образа диска

Для начала создадим образ диска размером 128 Мб. Для этого воспользуемся программой dd.
~# dd if=/dev/zero of=disk.img count=262080
Размер образа указан в "блоках" (blocks), имеющих фиксированный размер в 512 байт.
Сконфигурируем образ для дальнейшей работы при помощи программы fdisk:
~# fdisk disk.img
Перейдем в режим эксперта 'x', затем выставим количество секторов в цилиндре S=63, количество головок H=16. Вычислим количество циллиндров при помощи формулы:
C*H*S = 262080
C = 260

Затем вернемся в основное меню 'r' и создадим раздел на диске.
Device   Boot         Start        End      Blocks   Id  System
disk.img 1            2048      262079      130016   83  Linux
Запомним адрес начала раздела: 2048 блоков или 2048*512=1048576 байт.

Теперь осталось только создать на нашем диске файловую систему. Для этого привяжем к нашему файлу образа так называемый loop device:
~# losetup -o 1048576 /dev/loop0 disk.img
/dev/loop0 является блочным устройством. Отформатируем это устройство:
~# mkfs.ext2 /dev/loop0
После этого отсоединим блочное устройство.
~# losetup -d /dev/loop0
На этом создание образа диска завершено. На данном этапе мы имеем отформатированный и готовый для использования файл образа диска размером около 128 Мб.

3. Установка загрузчика

Установим загрузчик GRUB на образ нашего жесткого диска. Смонтируем образ нашего жесткого диска:
~# mkdir /mnt/disk_img
~# mount -o loop,offset=1048576 disk.img /mnt/disk_img

Чтобы установить загрузчик на образ нашего диска мы должны скопировать stage1
и stage2 загрузчика из нашего дистрибутива в папку /boot/grub на образе disk.img:
~# mkdir -p /mnt/disk_img/boot/grub
~# cp /lib/grub/i386-pc/stage1 /mnt/disk_img/boot/grub
~# cp /lib/grub/i386-pc/stage2 /mnt/disk_img/boot/grub
Эти файлы находятся либо в /lib/grub, как в моем случае, либо в /usr/lib. Это можно выяснить при помощи команды find.

После этого можно отмонтировать образ.
~# umount /mnt/disk_img

Теперь для настройки grub выполним:
~# grub --device-map=/dev/null
перед нами появится стандартный интерпретатор команд загрузчика.
Последовательно введем следующие команды:
grub> device (hd0) disk.img

grub> geometry (hd0) 262080 16 63

grub> root (hd0,0)

grub> setup (hd0)

grub> quit

Если все прошло без ошибок, то теперь у нас есть образ диска с установленным и сконфигурированным загрузчиком.

4. Использование образа

Мы можем смонтировать образ как уже было показано ранее:
~# mount -o loop,offset=1048576 disk.img /mnt/disk_img

Пример использование в Qemu:
~$ qemu -hda disk.img -m 256

Для использования с VirtualBox необходимо преобразовать формат образа. Это легко сделать при помощи следующей команды:
~$ VBoxManage convertfromraw -format VDI disk.img disk.vdi
Затем этот образ можно использовать.


Ссылки:
Installing grub on virtual hard disks
Работа с VirtualBox из командной строки

2 комментария:

  1. Вместо losetup -o 1048576 /dev/loop0 disk.img очень удобна команда kpartx -a disk.img создающая устройства /dev/mapper/loopXpY для всех разделов найденных на disk.img

    ОтветитьУдалить
  2. Хочу добавить, что если разработка ОС ведется только на виртуальной машине и не требуется запускать на реальном железе, в свежей версии qemu есть возможность грузить multiboot-совместимое или bzImage ядро напрямую вот так:

    qemu-system-i386 -kernel kernel.bin

    ОтветитьУдалить