Построение образа виртуальной машины

Статья охватывает особенности построения образа виртуальной машины на инструментальной машине под управлением ОС Linux

Hачиная с редакции 2020, существует возможность создания кастомизированной виртуальной машины. При построении виртуальной машины используется ряд утилит комплекта разработчика. После выполнения предложенных ниже инструкций будет получен образ целевой виртуальной машины, содержащий образ ЗОСРВ «Нейтрино» на основе указанных настроек, таких как архитектура ЦП и платформа виртуальной машины.

В ходе построения будут использованы следующие переменные окружения, а так же компоненты, располагающиеся по этим путям:


Caution: Данную инструкцию можно выполнить лишь на инструментальной системе под управлением ОС Linux.

Для создания виртуальной машины необходимо выполнить ряд действий, описанных ниже:

Подготовка корневого каталога
Создание образа диска
Создание загрузочного образа
Создание раздела диска
Запись образа на диск
Создание виртуальных машин
Создание образа диска QEMU (qcow2)
Создание виртуального жесткого диска VMware (VMDK)
Создание файла конфигурации VMware (VMX)
Удаление артефактов сборки

Подготовка корневого каталога

Прежде всего необходимо сформировать временный каталог, который будет являться корневым на целевой системе. Виртуальная основана на файловой системе Power-Safe, для функционирования которой необходимо создать файл .diskboot, а также каталог .boot.

mkdir -p ./tmp/x86/.boot touch ./tmp/x86/.diskroot cp -r ${KPDA_TARGET}/x86/* ./tmp/x86 cp -r ${KPDA_TARGET}/etc ${KPDA_TARGET}/home ${KPDA_TARGET}/root ${KPDA_TARGET}/usr \ ${KPDA_TARGET}/var ./tmp/x86 cp -r ${KPDA_TARGET}/ship*x86* ./tmp/x86

В загружаемой файловой системе Power-Safe /.boot - это каталог, содержащий образы ОС, которые могут загружаться вторичным загрузчиком при начальной загрузке системы. В данный каталог нужно помещать загрузочные образы формата .ifs, построенные утилитой mkifs. Более подробные сведения см. в разделе Управление запуском ЗОСРВ «Нейтрино».

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

Необходимо создать файл который будет представлять диск будущей виртуальной машины. Для выделения дискового пространства используется утилита инструментальной системы fallocate. Размер диска высчитывается по формуле:

размер блока * смещение + размер диска

Например, для диска размером 2Гб и стандартном размере блока 512, и при стандартном смещении 2048, размер выделяемого пространства в байтах равен 2148532224 (512 * 2048 + 1024 * 1024 * 1024 * 2)

fallocate -l 2148532224 disk.img

Далее необходимо создать и отредактировать таблицу разделов диска. Используется утилита инструментальной системы fdisk. Для этого необходимо выполнить последовательность команд:

  1. Запустить утилиту fdisk
  2. Ввести команду o, нажать клавишу Enter, чтобы очистить таблицу разделов в памяти
  3. Ввести команду x, нажать клавишу Enter, чтобы вызвать команды дополнительной функциональности
  4. Ввести команду i, нажать клавишу Enter, чтобы изменить идентификатор диска
  5. Ввести команду 0x6164706b, нажать клавишу Enter, чтобы установить идентификатор стабильного диска
  6. Ввести команду r, нажать клавишу Enter, чтобы вернуться в главное меню
  7. Ввести команду n, нажать клавишу Enter, чтобы создать новый раздел
  8. Ввести команду p, нажать клавишу Enter, чтобы выбрать раздел как основной
  9. Ввести команду 1, нажать клавишу Enter, чтобы выбрать номер раздела 1
  10. Ввести команду 2048, нажать клавишу Enter, чтобы установить начальное смещение по умолчанию
  11. Нажать клавишу Enter, чтобы установить размер раздела по умолчанию.
  12. Ввести команду t, нажать клавишу Enter, чтобы изменить тип раздела
  13. Ввести команду b3, нажать клавишу Enter, чтобы установить тип раздела QNX6.x
  14. Ввести команду a, нажать клавишу Enter, чтобы сделать раздел загрузочным
  15. Ввести команду p, нажать клавишу Enter, чтобы распечатать таблицу разделов в памяти
  16. Ввести команду w, нажать клавишу Enter, чтобы записать таблицу разделов

Вывод утилиты будет иметь следующий вид:

$ fdisk ./disk.img Welcome to fdisk (util-linux 2.34). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): o Created a new DOS disklabel with disk identifier 0xbc2948f5. Command (m for help): x Expert command (m for help): i Enter the new disk identifier: 0x6164706b Disk identifier changed from 0xbc2948f5 to 0x6164706b. Expert command (m for help): r Command (m for help): n Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): p Partition number (1-4, default 1): 1 First sector (2048-4196351, default 2048): 2048 Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-4196351, default 4196351): Created a new partition 1 of type 'Linux' and of size 2 GiB. Command (m for help): t Selected partition 1 Hex code (type L to list all codes): b3 Changed type of partition 'Linux' to 'unknown'. Command (m for help): a Selected partition 1 The bootable flag on partition 1 is enabled now. Command (m for help): p Disk ./disk2.img: 2 GiB, 2148532224 bytes, 4196352 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 Disklabel type: dos Disk identifier: 0x6164706b Device Boot Start End Sectors Size Id Type ./disk.img1 * 2048 4196351 4194304 2G b3 unknown Command (m for help): w The partition table has been altered. Syncing disks.

Для получения информации о работе с утилитой fdisk необходимо вызвать утилиту с опцией --help, либо ввести команду m в интерактивном режиме

Все вышеперечисленные команды могут быть выполнены следующим образом:

echo -e "o\nn\np\n1\n2048\n\nt\nb3\na\nw\n" | fdisk disk.img

Создание загрузочного образа

Следующим этапом построения образа виртуальной машины является создание загрузочного образа утилитой mkifs.

Синтаксис файла построения загрузочного образа детально рассмотрен в соответствующем разделе. Примеры файла построения загрузочного образа детально рассмотрены в соответствующем разделе.

В качестве примера используем образ для платформы VMware - neutrino-apic-ksz.build (он подходит и для QEMU), который присутствует в комплекте разработчика. Файл построения данного образа в общем случае находятся в каталоге ${KPDA_TARGET}/x86/boot/build/:

mkifs -l "[uid=0 gid=0]" -vvv -nn \ "${KPDA_TARGET}"/x86/boot/build/neutrino-apic-ksz.build \ ./tmp/x86/.boot/kpda_vm.ifs

Получившийся загрузочный образ будет помещен в каталог ./tmp/x86/.boot

Создание раздела диска

Для создания образа раздела диска используется утилита mkqnx6fsimg2. В общем случае необходимо сформировать файл построения образа ФС, например, ./tmp/system.bld, добавить целевые компоненты и атрибуты файла построения образа. Более подробную информацию об атрибутах файла образа построения см. в соответствующем разделе.

Ниже представлен пример создания файла построения образа файловой системы для архитектуры x86. Для начала следует указать общие системные атрибуты файловой системы, отвечающие за загрузку и размер.

$ cat > ./tmp/system.bld <<EOF [blksize=512] [vol_name=kpda_vm] [+boot_cls] [+boot_quiet] [+boot_active] [-followlink] [num_sectors=4194304] [num_inodes=320000] [uid=0 gid=0] [boot_offset=2048] [boot_loader=${KPDA_TARGET}/x86/boot/sys/ipl-diskpc2-fsq6] [search=./tmp/x86/] EOF

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

Прежде всего следует добавить загрузочный образ, например:

echo "[type=file] /.boot/kpda_vm.ifs/=./tmp/x86/.boot/kpda_vm.ifs" >> ./tmp/system.bld

В образ ФС необходимо поместить компоненты, находящиеся в ./tmp/x86 и отдельно проиндексировать символьные ссылки:

echo "/=./tmp/x86" >> ./tmp/system.bld find ./tmp/x86 -type l -exec sh -c \ 'f={}; n=${f##./tmp/x86/}; echo "[type=link] ${n}=$(readlink "${f}")"' \; \ | sort >> ./tmp/system.bld

Обратите внимание, что в результате выполнения этой инструкции в последующем в образ ФС войдут все компоненты из директории ./tmp/x86/, включая заголовочные файлы и иные материалы, необходимые на сборочной системе. Вы можете сформировать в system.bld точный список размещаемых компонентов, включающий каталоги и файлы, используя аргументы файла построения [type=dir] и [type=file] (например, как были проиндексированы ссылки выше).

Результат этой команды будет полностью аналогичен инструкции /=./tmp/x86, указанной выше, однако, в system.bld попадёт полный список всех файлов и директорий.

Поскольку создается виртуальная машина с компонентами СЗИ, то следует дополнительно установить права доступа:

find ./tmp/x86 -path "*home/admin*" -a -type d \ -printf "[uid=10 gid=10 type=dir] %P=%P\n" | sort >> "./tmp/system.bld" find ./tmp/x86 -path "*etc/ksz*" -a -type d \ -printf "[uid=0 gid=10 type=dir] %P=%P\n" | sort >> "./tmp/system.bld" find ./tmp/x86 -path "*home/admin*" -a -type f \ -printf "[uid=10 gid=10 type=file] %P=%P\n" | sort >> "./tmp/system.bld" find ./tmp/x86 -path "*etc/ksz*" -a -type f \ -printf "[uid=0 gid=10 type=file] %P=%P\n" | sort >> "./tmp/system.bld"

В общем случае достаточно поместить в файл построения ФС временный каталог, содержащий файлы и каталоги целевой системы, однако набор файлов и каталогов может варьироваться, в зависимости от задачи. Целевые файлы, каталоги и ссылки находятся в директориях ${KPDA_TARGET} и ${KPDA_TARGET}/x86/ комплекта разработчика.

Далее следует создать образ раздела файловой системы:

mkqnx6fsimg2 -vvv ./tmp/system.bld ./tmp/qnx6.qfs

Запись образа на диск

Необходимо записать первичный загрузчик. Загрузчик расположен в каталоге ${KPDA_TARGET}/x86/boot/sys комплекта разработчика. Например, для образа виртуальной машины с архитектурой x86:

dd if="${KPDA_TARGET}"/x86/boot/sys/ipl-diskpc1 of=disk.img conv=notrunc

Далее необходимо записать получившийся ранее образ раздела целевой файловой системы:

dd if=./tmp/qnx6.qfs of=disk.img bs=512 seek=2048 conv=notrunc

Создание виртуальных машин

Существует возможность поддержки нескольких платформ виртуальных машин, на которой будет работать сгенерированный образ целевой системы. Возможными платформами являются QEMU и VMware. Для создания файла виртуальной машины используется утилита qemu-img. Данная утилита входит в состав пакета qemu-utils, который необходимо дополнительно установить на инструментальную систему (точное наименование пакета зависит от используемого дистрибутива Linux). Для получения разных типов виртуальных машин используются разные параметры.

Создание образа диска QEMU (qcow2)

Расширение файла .qcow2 представляет собой образ диска QEMU Copy On Write 2. Для получения файла следует вызвать следующую команду:

qemu-img convert -f raw -O qcow2 disk.img disk.img.qcow2

Для открытия полученной виртуальной машины достаточно открыть данный файл в программном обеспечении QEMU.

Создание виртуального жесткого диска VMware (VMDK)

Файл VMDK - виртуальный жесткий диск, используемый программой виртуализации VMware. Кроме того, данный формат поддерживает программа виртуализации VirtualBox. Для получения файла следует вызвать следующую команду:

qemu-img convert -f raw -O vmdk disk.img disk.img.vmdk

Создание файла конфигурации VMware (VMX)

Для запуска виртуальной машины VMware необходим файл VMX. Файл VMX - это файл конфигурации, используемый программным обеспечением для виртуализации VMware, который содержит параметры виртуальной машины. Данный файл необходимо создать и добавить в него строки, содержащие параметры жесткого диска, оперативной памяти, процессора и прочие настройки виртуальной машины. Пример файла VMX для виртуальной машины ЗОСРВ «Нейтрино»:

#!/usr/bin/vmware .encoding = "UTF-8" checkpoint.vmState = "" config.version = "8" displayName = "$kpda_neutrino_vm" ethernet0.addressType = "generated" ethernet0.connectionType = "nat" ethernet0.generatedAddressOffset = "0" ethernet0.present = "TRUE" ethernet0.virtualDev = "e1000" guestOS = "other" ide0:0.filename = "disk.img.vmdk" ide0:0.present = "TRUE" ide0:0.redo = "" MemAllowAutoScaleDown = "FALSE" memsize = "512" numvcpus = "2" nvram = "kpda.nvram" rtc.diffFromUTC = 0 tools.remindInstall = "FALSE" tools.syncTime = "TRUE" usb.present = "TRUE" uuid.action = "create" virtualHW.version = "12"

Для открытия полученной виртуальной машины достаточно открыть данный файл в программном обеспечении VMware.

Удаление артефактов сборки

После окончательного выполнения данной инструкции необходимо удалить каталог ./tmp, содержащий временные файлы, а также файл disk.img.




Предыдущий раздел: Тематические статьи