UEFI 啟動(dòng)原理及qemu 虛擬化中使用

admin2024-06-21  18

UEFI 啟動(dòng)原理及qemu 虛擬化中使用

  1. 什么是BIOS?
  2. 什么是 UEFI?

什么是BIOS?

計算機啟動(dòng)時(shí)會(huì )加載 BIOS,以初始化和測試硬件功能。它使用 POST 或 Power On Self Test 來(lái)確保硬件配置有效且工作正常,然后尋找存儲引導設備的 MBR(Master Boot Records),并使用它來(lái)啟動(dòng)引導加載程序,然后是內核,然后操作系統。

所有這些在 BIOS 上的啟動(dòng)過(guò)程都稱(chēng)為 Legacy Boot,下面簡(jiǎn)單介紹一下 BIOS 上的啟動(dòng)過(guò)程。

BIOS > MBR > Bootloader > Kernel > Operating System

BIOS 被認為是舊的和過(guò)時(shí)的固件,盡管總會(huì )有人使用它。 BIOS 對于當今的計算機和現代 PC 而言功能有限,它必須在只有 1 MB 空間的 16 位處理器上運行。此外,它會(huì )同時(shí)初始化多個(gè)硬件,這使得啟動(dòng)過(guò)程變慢。

BIOS 的固件替代品是 UEFI,它在現代主板上可用。

什么是 UEFI?

UEFI 或統一可擴展固件接口被認為是 BIOS 的固件替代品。它具有更多受 BIOS 限制的特性和功能,并且在當今的主板和現代 PC 上可用。

盡管它被認為是 BIOS 的替代品,但 UEFI 的工作方式不同并且具有與 BIOS 相反的概念。 UEFI 將所有關(guān)于初始化和啟動(dòng)的信息存儲在.efi 文件中,該文件存儲在ESP(EFI System Partition)分區中。 ESP還會(huì )存儲計算機上安裝的操作系統的引導加載程序。

UEFI 使用 GPT 來(lái)存儲有關(guān)分區的所有信息,而不是 MBR。并在下面簡(jiǎn)單說(shuō)明操作系統如何在 UEFI 上啟動(dòng)。

UEFI > GPT/ESP > Kernel > Operating System

以下是傳統 BIOS 所不具備的一些值得注意的 UEFI 功能:

  • 啟動(dòng)更快

  • 處理超過(guò) 2TB 或驅動(dòng)器(這對當今環(huán)境來(lái)說(shuō)很重要)

  • 支持4個(gè)以上帶GUID分區表的分區

  • 支持安全啟動(dòng)

  • 支持 64 位現代固件設備

  • 具有簡(jiǎn)單的圖形用戶(hù)界面

KVM 虛擬化固件

默認情況下,KVM 虛擬化使用 BIOS 作為來(lái)賓虛擬機的默認固件。要在 KVM 上啟用 UEFI 支持,您必須在主機系統上安裝 OVMF(開(kāi)放虛擬機固件)包。

OVMF 項目是 qemu 虛擬機的 intels tianocore 固件的一部分。

對于基于 RHEL 的系統,如 CentOS/Fedora,您需要使用 DNF/Yum 命令安裝包 edk2-ovmf 包。

使用 virt-install 創(chuàng )建UEFI啟動(dòng)的虛擬機

sudo virt-install --name=Artix \
--os-type=Linux \
--os-variant=archlinux \
--vcpu=2 \
--ram=1024 \
--disk path=/var/lib/libvirt/images/Artix.img,size=15 \
--graphics spice \
--cdrom=/home/user/Desktop/artix-base-openrc-20210726-x86_64.iso \
--network network=default \
--boot uefi  (主要是添加此參數)

虛擬機 XML 中 loader 分析

x86

  <os>
    <type arch='x86_64' machine='pc-i440fx-7.2'>hvm</type>
    <loader readonly='yes' type='pflash'>/usr/share/OVMF/OVMF_CODE.fd</loader>
    <nvram>/var/lib/libvirt/qemu/nvram/uefi_test_VARS.fd</nvram>
    <boot dev='hd'/>
  </os>

arm

  <os>
    <type arch='aarch64' machine='virt-7.2'>hvm</type>
    <loader readonly='yes' type='pflash'>/usr/share/AAVMF/AAVMF_CODE.fd</loader>
    <nvram>/var/lib/libvirt/qemu/nvram/j_test_VARS.fd</nvram>
    <boot dev='hd'/>
  </os>

x86

# ll /usr/share/OVMF/OVMF_CODE.fd
lrwxrwxrwx. 1 root root 25 Apr 28  2023 /usr/share/OVMF/OVMF_CODE.fd -> ../edk2/ovmf/OVMF_CODE.fd

arm

# ll /usr/share/AAVMF/AAVMF_CODE.fd
lrwxrwxrwx. 1 root root 42 Jun 12  2023 /usr/share/AAVMF/AAVMF_CODE.fd -> ../edk2/aarch64/QEMU_EFI-silent-pflash.raw
  • OVMF_VARS.fd : 這是持久化的UEFI變量的firmware卷,即firmware存儲所有配置(引導條目和引導順序、安全引導密鑰等)。通常這個(gè)文件用作空變量存儲的模板,每個(gè)VM都有自己的私有副本。例如 Libvirt虛擬機管理器 將文件存儲在 /var/lib/libvirt/qemu/nvram 中。
  • OVMF_CODE.fd : 帶有代碼的firmware卷。將它和 VARS 分開(kāi)可以:
    • 確保輕松更新固件
    • 允許將只讀代碼映射到guest操作系統

UEFI 虛擬機啟動(dòng)流程分析

在引導安裝過(guò)程中由于使用 UEFI 方式,所以需要去尋找固件 OVMF_VARS.fd 和 OVMF_CODE.fd,會(huì )先遍歷 /usr/share/qemu/firmware/ 目錄,如果里面有 50-edk2-ovmf-x64-nosb.json 或 60-edk2-aarch64.json(安裝包可能會(huì )提供 edk2-ovmf/edk2-aarch64),會(huì )讀取其中文件,內容主要包含固件路徑,如果沒(méi)有這兩個(gè) json 文件,就使用 qemu.conf 默認路徑,如果有這兩個(gè) json 文件,就使用 json 文件中路徑,最終路徑會(huì )寫(xiě)入虛擬機 XML。

!!!這里會(huì )存在一個(gè)問(wèn)題!!!

問(wèn)題描述:

A ARM 環(huán)境使用自動(dòng)部署腳本創(chuàng )建虛擬機不能啟動(dòng),BARM 環(huán)境可以正常啟動(dòng)

# virsh start az2-ct2
error: Failed to start domain 'az2-ct2'
error: operation failed: unable to find any master var store for loader: /usr/share/edk2/aarch64/QEMU_EFI-silent-pflash.raw

問(wèn)題分析:

A ARM 環(huán)境中不存在 json(edk2-aarch64-202002-9.ctl3.noarch 不提供),但自動(dòng)化部署的虛擬機 XML 中固定使用 /usr/share/edk2/aarch64/QEMU_EFI-silent-pflash.raw 與 qemu 默認路徑 /usr/share/AAVMF/AAVMF_CODE.fd 不一致,會(huì )導致啟動(dòng)失敗;

B ARM 環(huán)境中存在 json(edk2-aarch64-20200602gitca407c7246bf-3.el8.noarch 提供),json 中指定路徑為/usr/share/edk2/aarch64/QEMU_EFI-silent-pflash.raw,啟動(dòng)時(shí)會(huì )優(yōu)先使用 json 中的路徑,所以沒(méi)有問(wèn)題

解決方式:

方式一,修改虛擬機 XML 中 loader 路徑,/usr/share/AAVMF/AAVMF_CODE.fd

方式二,手動(dòng)創(chuàng )建 /usr/share/qemu/firmware/xxx.json 寫(xiě)入默認路徑,/usr/share/edk2/aarch64/QEMU_EFI-silent-pflash.raw

/etc/libvirt/qemu.conf 默認路徑

#nvram = [
#   "/usr/share/OVMF/OVMF_CODE.fd:/usr/share/OVMF/OVMF_VARS.fd",
#   "/usr/share/OVMF/OVMF_CODE.secboot.fd:/usr/share/OVMF/OVMF_VARS.fd",
#   "/usr/share/AAVMF/AAVMF_CODE.fd:/usr/share/AAVMF/AAVMF_VARS.fd",
#   "/usr/share/AAVMF/AAVMF32_CODE.fd:/usr/share/AAVMF/AAVMF32_VARS.fd"
#]

/usr/share/qemu/firmware/60-edk2-aarch64.json

{
    "description": "UEFI firmware for ARM64 virtual machines",
    "interface-types": [
        "uefi"
    ],
    "mapping": {
        "device": "flash",
        "executable": {
            "filename": "/usr/share/edk2/aarch64/QEMU_EFI-silent-pflash.raw",
            "format": "raw"
        },
        "nvram-template": {
            "filename": "/usr/share/edk2/aarch64/vars-template-pflash.raw",
            "format": "raw"
        }
    },
    "targets": [
        {
            "architecture": "aarch64",
            "machines": [
                "virt-*"
            ]
        }
    ],
    "features": [

    ],
    "tags": [

    ]
}

/usr/share/qemu/firmware/50-edk2-ovmf-x64-nosb.json

{
    "description": "OVMF without SB+SMM, empty varstore",
    "interface-types": [
        "uefi"
    ],
    "mapping": {
        "device": "flash",
        "executable": {
            "filename": "/usr/share/edk2/ovmf/OVMF_CODE.fd",
            "format": "raw"
        },
        "nvram-template": {
            "filename": "/usr/share/edk2/ovmf/OVMF_VARS.fd",
            "format": "raw"
        }
    },
    "targets": [
        {
            "architecture": "x86_64",
            "machines": [
                "pc-i440fx-*",
                "pc-q35-*"
            ]
        }
    ],
    "features": [
        "acpi-s3",
        "amd-sev",
        "amd-sev-es",
        "verbose-dynamic"
    ],
    "tags": [

    ]
}

Q&A

Q:qemu編譯edk2組件時(shí)會(huì )編譯其它架構的固件,我只想編譯aarch64架構怎么辦?
A:修改/path/to/qemu/Makefile.edk2 中的flashdevs變量,注釋掉其它架構

Q:edk2中常出現的OVMF和AAVMF,以及edk2,它們之間什么關(guān)系?
A:虛擬化應用組件最開(kāi)始使用seabios引導虛機內核,Indel為使UEFI可以引導虛機,發(fā)起EDK/EDK2(Intel’s EFI Development Kit II)項目。OVMF(Open Virtual Machine Firmware)作為edk2的子項目,用于在X86平臺使用UEFI引導虛機,AAVMF用于在aarch64平臺應用UEFI固件引導虛機。

參考:

[在 KVM 虛擬化中啟用 UEFI 支持 (linux-console.net)](https://cn.linux-console.net/?p=3254#:~:text=要使用命令行 virt-install 創(chuàng )建帶有 UEFI 固件的虛擬機,請在命令選項中添加選項 --boot uefi,。 下面是使用 virt-install 命令創(chuàng )建帶有 UEFI 固件的新虛擬機 Artix 的示例。)

編譯QEMU+OVMF(ARM架構) — Cloud Atlas beta 文檔 (cloud-atlas.readthedocs.io)

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲空間服務(wù),不擁有所有權,不承擔相關(guān)法律責任。如若轉載,請注明原文出處。如若內容造成侵權/違法違規/事實(shí)不符,請聯(lián)系SD編程學(xué)習網(wǎng):675289112@qq.com進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!
一级毛片在线一区二区-亚洲精品无码专区土豆网在线播放-亚洲无乱码一区二区三区-亚洲一区二区三区精品