StratoVirt предоставляет два типа виртуальных машин: облегчённые и стандартные. Процесс запуска для обоих типов описан ниже.
arch=`uname -m`
if [ ${arch} = "x86_64" ]; then
con=ttyS0
machine="q35"
elif [ ${arch} = "aarch64" ]; then
con=ttyAMA0
machine="virt"
else
echo "${arch} architecture not supported."
exit 1
fi
Облегчённая виртуальная машина StratoVirt поддерживает на платформе x86_64 образы ядра в формате PE или bzImage, а на платформе aarch64 — только в формате PE. Для создания образа ядра выполните следующие шаги:
Сначала получите исходный код ядра openEuler:
$ git clone -b kernel-5.10 --depth=1 https://gitee.com/openeuler/kernel
$ cd kernel
При использовании версии openEuler 21.03 вы также можете получить исходный код с помощью yum-источника:
$ sudo yum install kernel-source
$ cd /usr/src/linux-5.10.0-0.0.0.7.oe1.$(uname -m)/
Настройте информацию о ядре Linux. Вы можете использовать предоставленный файл конфигурации облегчённой виртуальной машины (в папке ./kernel_config/micro_vm
) и переименовать его в .config
, а затем скопировать в папку kernel
. Также можно изменить параметры компиляции ядра с помощью команды:
$ make menuconfig
Создайте и преобразуйте образ ядра в формат PE:
$ make -j$(nproc) vmlinux && objcopy -O binary vmlinux vmlinux.bin
Если вы хотите скомпилировать образ ядра bzImage на платформе x86_64, используйте команду:
$ make -j$(nproc) bzImage
Образ rootfs — это образ файловой системы. Во время запуска StratoVirt можно смонтировать образ EXT4 с /sbin/init
. Подробнее см. в приложении.
/usr/bin/stratovirt \
-machine microvm \
-kernel /path/to/kernel \
-smp 1 \
-m 1024m \
-append "console=${con} pci=off reboot=k quiet panic=1 root=/dev/vda" \
-drive file=/path/to/rootfs,id=rootfs,readonly=off,direct=off \
-device virtio-blk-device,drive=rootfs,id=rootfs \
-qmp unix:/path/to/socket,server,nowait \
-serial stdio
Существует два способа запуска стандартных виртуальных машин: с использованием ядра и образа rootfs или с использованием предварительно установленного образа гостевой операционной системы в формате raw.
Далее описывается, как запустить стандартную виртуальную машину каждым из этих способов. Оба способа требуют использования стандартного загрузочного программного обеспечения.
Для запуска стандартных виртуальных машин требуется загрузочное программное обеспечение. StratoVirt поддерживается только на платформах x86_64 и aarch64 через UEFI (унифицированный расширяемый интерфейс встроенного ПО).
EDK2 — это проект с открытым исходным кодом, который реализует стандарт UEFI. Мы используем EDK2 для запуска виртуальных машин, поэтому нам нужно получить соответствующий двоичный файл EDK2.
Есть два способа получить двоичный файл EDK2: установить его напрямую или скомпилировать из исходного кода. Обратите внимание, что двоичный файл EDK2 содержит два файла: один для хранения исполняемого кода, другой — для хранения данных инициализации.
На платформе x86_64 выполните команду:
$ sudo yum install -y edk2-ovmf
На платформе aarch64 выполните команду:
$ sudo yum install -y edk2-aarch64
После установки EDK2 на платформе x86_64 файлы OVMF_CODE.fd
и OVMF_VARS.fd
будут находиться в каталоге /usr/share/edk2/ovmf
. На платформе aarch64 файлы QEMU_EFI-pflash.raw
и vars-template-pflash.raw
будут находиться в каталоге /usr/share/edk2/aarch64
.
# Установите необходимые зависимости для компиляции edk2.
yum install git nasm acpica-tools -y
# Клонируйте исходный код edk2.
git clone https://github.com/tianocore/edk2.git
cd edk2
git checkout edk2-stable202102
git submodule update --init
# Скомпилируйте edk2 и получите файлы для запуска StratoVirt.
arch=`uname -m`
if [ ${arch} = "x86_64" ]; then
echo "ACTIVE_PLATFORM = OvmfPkg/OvmfPkgX64.dsc" >> Conf/target.txt
echo "TARGET_ARCH = X64" >> Conf/target.txt
elif [ ${arch} = "aarch64" ]; then
echo "ACTIVE_PLATFORM = ArmVirtPkg/ArmVirtQemu.dsc" >> Conf/target.txt
echo "TARGET_ARCH = AARCH64" >> Conf/target.txt
else
echo "${arch} architecture not supported."
exit 1
fi
echo "TOOL_CHAIN_TAG = GCC5" >> Conf/target.txt
echo "BUILD_RULE_CONF = Conf/build_rule.txt" >> Conf/target.txt
echo "TARGET = RELEASE" >> Conf/target.txt
make -C BaseTools
. ./edksetup.sh
build
if [ ${arch} = "x86_64" ]; then
cp ./Build/OvmfX64/RELEASE_GCC5/FV/OVMF_CODE.fd /home/
cp ./Build/OvmfX64/RELEASE_GCC5/FV/OVMF_VARS.fd /home/
elif [ ${arch} = "aarch64" ]; then
dd if=/dev/zero of=/home/STRATOVIRT_EFI.raw bs=1M count=64
dd of=/home/STRATOVIRT_EFI.raw if=./Build/ArmVirtQemu-AARCH64/RELEASE_GCC5/FV/QEMU_EFI.fd conv=notrunc
dd if=/dev/zero of=/home/STRATOVIRT_VAR.raw bs=1M count=64
fi
После компиляции EDK2 файлы OVMF_CODE.fd
и OVMF_VARS.fd
на платформе x84_64 будут находиться в каталоге /home
. Файлы STRATOVIRT_EFI.raw
и STRATOVIRT_VAR.raw
на платформе aarch64 будут также находиться в каталоге /home
.
Стандартная виртуальная машина StratoVirt может использовать ядро в формате bzImage для платформы x86_64 или в формате PE для платформ x86_64 и aarch64. Создание образа ядра выполняется следующим образом:
Получите исходный код openEuler:
$ git clone -b kernel-5.10 --depth=1 https://gitee.com/openeuler/kernel
$ cd kernel
Настройте параметры ядра Linux. Можно использовать предоставленный файл конфигурации стандартной виртуальной машины (./kernel_config/standard_vm
), переименовать его в .config
и скопировать в каталог kernel
. Или же можно изменить параметры компиляции с помощью команды:
$ make menuconfig
Скомпилируйте ядро:
#
Примечание: В тексте запроса присутствуют фрагменты кода на языке программирования Shell, но они не были включены в ответ. В запросе текст на английском языке.
На платформе aarch64 преобразуйте образ ядра в формат PE: make−j(nproc) vmlinux && objcopy -O binary vmlinux vmlinux.bin
На платформе x86_64 преобразуйте образ ядра в формат bzImage: make−j(nproc) bzImage
Кроме ручного способа сборки образа ядра, можно напрямую загрузить соответствующее ядро с официального сайта OpenEuler.
Для стандартной виртуальной машины создайте образ rootfs. Процесс создания образа rootfs для виртуальной машины фактически аналогичен процессу создания образа для облегчённой виртуальной машины. Вы можете обратиться к приложению для получения более подробной информации.
Чтобы запустить стандартную виртуальную машину с использованием образа в формате raw, выполните следующие шаги:
$ xz -d openEuler-21.03-x86_64.qcow2.xz
$ qemu-img convert -f qcow2 -O raw openEuler-21.03-x86_64.qcow2 openEuler-21.03-x86_64.raw
Чтобы запустить стандартную виртуальную машину, используйте режим прямого запуска ядра (direct kernel boot). Этот режим позволяет виртуальной машине пропустить этап UEFI и сразу перейти к запуску ядра. Это ускоряет процесс запуска. Команда для запуска виртуальной машины в режиме direct kernel boot:
/usr/bin/stratovirt \
-machine virt \
-kernel /path/to/kernel \
-smp 1 \
-m 2G \
-append "console=${con} reboot=k panic=1 root=/dev/vda rw" \
-drive file=/path/to/rootfs,id=rootfs,readonly=off,direct=off \
-device virtio-blk-pci,drive=rootfs,id=blk1,bus=pcie.0,addr=0x2 \
qmp unix:/path/to/socket,server,nowait \
-serial stdio
Обратите внимание, что в настоящее время режим direct kernel boot поддерживается только для архитектур ARM.
Для запуска стандартной виртуальной машины необходимы два устройства PFlash. Они будут использовать два файла микропрограммы из EDK2. Если вам не нужно сохранять информацию о запуске, вы можете пропустить файл данных с номером единицы 1. Однако файл кода с номером единицы 0 является обязательным.
Сначала приведите пример команды для запуска с использованием ядра и образа rootfs:
/usr/bin/stratovirt \
-machine ${machine} \
-kernel /path/to/kernel \
-smp 1 \
-m 2G \
-append "console=${con} reboot=k panic=1 root=/dev/vda rw" \
-drive file=/path/to/rootfs,id=rootfs,readonly=off,direct=off \
-device virtio-blk-pci,drive=rootfs,id=blk1,bus=pcie.0,addr=0x2 \
-drive file=/path/to/OVMF_CODE.fd,if=pflash,unit=0,readonly=true \
-drive file=/path/to/OVMF_VARS.fd,if=pflash,unit=1 \
qmp unix:/path/to/socket,server,nowait \
-serial stdio
Затем приведите пример команды для запуска с использованием образа raw:
/usr/bin/stratovirt \
-machine ${machine} \
-smp 1 \
-m 2G \
-drive file=/path/to/raw_image,id=raw_image,readonly=off,direct=off \
-device virtio-blk-pci,drive=raw_image,id=blk1,bus=pcie.0,addr=0x2 \
-drive file=/path/to/OVMF_CODE.fd,if=pflash,unit=0,readonly=true \
-drive file=/path/to/OVMF_VARS.fd,if=pflash,unit=1 \
qmp unix:/path/to/socket,server,nowait \
-serial stdio
В приложении описан метод создания образа EXT4 rootfs с использованием dd и mkfs.ext4.
Обратите внимание, что это перевод текста, который может содержать неточности или ошибки.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарий ( 0 )