Статья охватывает особенности построения образа виртуальной машины на инструментальной машине под управлением ОС Linux
Hачиная с редакции 2020, существует возможность создания кастомизированной виртуальной машины. При построении виртуальной машины используется ряд утилит комплекта разработчика. После выполнения предложенных ниже инструкций будет получен образ целевой виртуальной машины, содержащий образ ЗОСРВ «Нейтрино» на основе указанных настроек, таких как архитектура ЦП и платформа виртуальной машины.
В ходе построения будут использованы следующие переменные окружения, а так же компоненты, располагающиеся по этим путям:
${KPDA_TARGET}
- компоненты целевой системы ${KPDA_TARGET}/x86
— компоненты архитектуры ЦП, для которой будет построена целевая виртуальная машина. В данной статье будет рассмотрен пример для построения образа виртуальной машины с архитектурой x86
Данную инструкцию можно выполнить лишь на инструментальной системе под управлением ОС Linux. |
Для создания виртуальной машины необходимо выполнить ряд действий, описанных ниже:
Прежде всего необходимо сформировать временный каталог, который будет являться корневым на целевой системе. Виртуальная основана на файловой системе 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. Для этого необходимо выполнить последовательность команд:
Enter
, чтобы очистить таблицу разделов в памяти Enter
, чтобы вызвать команды дополнительной функциональности Enter
, чтобы изменить идентификатор диска Enter
, чтобы установить идентификатор стабильного диска Enter
, чтобы вернуться в главное меню Enter
, чтобы создать новый раздел Enter
, чтобы выбрать раздел как основной Enter
, чтобы выбрать номер раздела 1 Enter
, чтобы установить начальное смещение по умолчанию Enter
, чтобы установить размер раздела по умолчанию. Enter
, чтобы изменить тип раздела Enter
, чтобы установить тип раздела QNX6.x Enter
, чтобы сделать раздел загрузочным Enter
, чтобы распечатать таблицу разделов в памяти 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). Для получения разных типов виртуальных машин используются разные параметры.
Расширение файла .qcow2
представляет собой образ диска QEMU Copy On Write 2. Для получения файла следует вызвать следующую команду:
qemu-img convert -f raw -O qcow2 disk.img disk.img.qcow2
Для открытия полученной виртуальной машины достаточно открыть данный файл в программном обеспечении QEMU.
Файл VMDK - виртуальный жесткий диск, используемый программой виртуализации VMware. Кроме того, данный формат поддерживает программа виртуализации VirtualBox. Для получения файла следует вызвать следующую команду:
qemu-img convert -f raw -O vmdk disk.img disk.img.vmdk
Для запуска виртуальной машины 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
.
Предыдущий раздел: Тематические статьи