**AARCH64" >> Conf/target.txt**

**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, на платформе x86_64 файлы OVMF_CODE.fd и OVMF_VARS.fd находятся в каталоге /home. На платформе aarch64 файлы STRATOVIRT_EFI.raw и STRATOVIRT_VAR.raw также находятся в каталоге /home.

### 2. Загрузка с ядром и корневой файловой системой
#### 2.1 Сборка ядра

Стандартная машина в StratoVirt поддерживает формат образа ядра bzImage на платформе x86_64 и формат PE на платформе aarch64. Образ ядра можно собрать следующим образом:

1. Сначала получите исходный код ядра openEuler с помощью команды:

   ```shell
   $ git clone -b kernel-5.10 --depth=1 https://gitee.com/openeuler/kernel
   $ cd kernel
   ```

2. Настройте ядро Linux. Вы должны использовать рекомендованную конфигурацию standard_vm (./kernel_config/standard_vm) и скопировать её в путь ядра как .config.

3. Соберите образ ядра:

   ```shell
   # На платформе aarch64 преобразуйте образ ядра в формат PE.
   $ make -j$(nproc) vmlinux && objcopy -O binary vmlinux vmlinux.bin

   # На платформе x86_64 получите образ формата bzImage.
   $ make -j$(nproc) bzImage
   ```
Кроме ручной сборки образа ядра, вы также можете загрузить образ с официального сайта OpenEuler.

#### 2.2 Сборка корневой файловой системы

Сборка корневой файловой системы для стандартной виртуальной машины выполняется так же, как и для microvm. Более подробную информацию см. в Приложении.


### 3. Загрузка с необработанным образом
#### 3.1 Получение необработанного образа

Вы можете скачать установленный образ qcow2 с официального веб-сайта OpenEuler. После загрузки файла выполните команду qemu-img для преобразования файла. Далее, возьмём образ qcow2 openeuler-21.03 в качестве примера и приведём конкретные команды:

```shell
$ 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
```
Теперь доступный необработанный образ получен.

### 4. Прямая загрузка с ядра

Можно напрямую загрузиться с ядра. В этом режиме UEFI и ACPI не будут использоваться. Виртуальная машина пропустит UEFI и сразу запустит ядро, чтобы сократить время загрузки.

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

```shell
/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
```
Примечание: этот режим в настоящее время поддерживает только архитектуру arm.

### 5. Пример загрузки командной строки

Обратите внимание, что стандартному устройству требуется два устройства PFlash, которые будут использовать два файла прошивки из двоичного файла EDK II. Если вам не нужно хранить загрузочную информацию, файл хранилища данных может быть опущен, единица измерения которого равна 1. Но файл хранилища кода с единицей измерения 0 необходим.

Выполните следующие команды для загрузки с ядром и корневой файловой системой:

```shell
/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 Команда для загрузки с необработанным образом следующая:

```shell
/usr/bin/stratovirt \
    -machine ${machine} \
    -smp 1 \
    -m 2G \
    -drive файл=/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 файл=/path/to/OVMF_CODE.fd,if=pflash,unit=0,readonly=true \
    -drive файл=/path/to/OVMF_VARS.fd,if=pflash,unit=1 \
    -qmp unix:/path/to/socket,server,nowait \
    -serial stdio
```

## Приложение

Ниже представлен простой способ создания образа корневой файловой системы EXT4:

1. Подготовьте файл нужного размера (например, 1 ГБ):

   ```shell
   $ dd if=/dev/zero of=./rootfs.ext4 bs=1G count=20
   ```

2. Создайте пустую файловую систему EXT4 на этом файле:

   ```shell
   $ mkfs.ext4 ./rootfs.ext4
   ```

3. Смонтируйте образ файла:

   ```shell
   $ mkdir -p /mnt/rootfs
   $ sudo mount ./rootfs.ext4 /mnt/rootfs && cd /mnt/rootfs
   ```

4. Получите последнюю версию alpine-minirootfs (http://dl-cdn.alpinelinux.org/alpine):

   ```shell
   $ arch=`uname -m`
   $ wget http://dl-cdn.alpinelinux.org/alpine/v3.13/releases/$arch/alpine-minirootfs-3.13.0-$arch.tar.gz -O alpine-minirootfs.tar.gz
   $ tar -zxvf alpine-minirootfs.tar.gz
   $ rm alpine-minirootfs.tar.gz
   ```
   Создайте простой `/sbin/init` для образа файла EXT4.

   ```shell
   $ rm sbin/init && touch sbin/init && cat > sbin/init <<EOF
   #! /bin/sh
   mount -t devtmpfs dev /dev
   mount -t proc proc /proc
   mount -t sysfs sysfs /sys
   ip link set up dev lo

   exec /sbin/getty -n -l /bin/sh 115200 /dev/ttyS0
   poweroff -f
   EOF

   $ sudo chmod +x sbin/init
   ```
   **Примечание: alpine — это пример. Вы можете использовать любую открытую корневую файловую систему с init/systemd в качестве образа корневой файловой системы.**

5. Размонтируйте образ корневой файловой системы:

    ```shell
    $ cd ~ && umount /mnt/rootfs
    ```

## Ссылки

- [EDK II wiki](https://github.com/tianocore/tianocore.github.io/wiki/EDK-II)
- [OVMF wiki](https://github.com/tianocore/tianocore.github.io/wiki/OVMF)