UEFI 启动原理及qemu 虚拟化中使用
UEFI 启动原理及qemu 虚拟化中使用
- 什么是BIOS?
- 什么是 UEFI?
什么是BIOS?
计算机启动时会加载 BIOS,以初始化和测试硬件功能。它使用 POST 或 Power On Self Test 来确保硬件配置有效且工作正常,然后寻找存储引导设备的 MBR(Master Boot Records),并使用它来启动引导加载程序,然后是内核,然后操作系统。
所有这些在 BIOS 上的启动过程都称为 Legacy Boot,下面简单介绍一下 BIOS 上的启动过程。
BIOS > MBR > Bootloader > Kernel > Operating System
BIOS 被认为是旧的和过时的固件,尽管总会有人使用它。 BIOS 对于当今的计算机和现代 PC 而言功能有限,它必须在只有 1 MB 空间的 16 位处理器上运行。此外,它会同时初始化多个硬件,这使得启动过程变慢。
BIOS 的固件替代品是 UEFI,它在现代主板上可用。
什么是 UEFI?
UEFI 或统一可扩展固件接口被认为是 BIOS 的固件替代品。它具有更多受 BIOS 限制的特性和功能,并且在当今的主板和现代 PC 上可用。
尽管它被认为是 BIOS 的替代品,但 UEFI 的工作方式不同并且具有与 BIOS 相反的概念。 UEFI 将所有关于初始化和启动的信息存储在.efi 文件中,该文件存储在ESP(EFI System Partition)分区中。 ESP还会存储计算机上安装的操作系统的引导加载程序。
UEFI 使用 GPT 来存储有关分区的所有信息,而不是 MBR。并在下面简单说明操作系统如何在 UEFI 上启动。
UEFI > GPT/ESP > Kernel > Operating System
以下是传统 BIOS 所不具备的一些值得注意的 UEFI 功能:
-
启动更快
-
处理超过 2TB 或驱动器(这对当今环境来说很重要)
-
支持4个以上带GUID分区表的分区
-
支持安全启动
-
支持 64 位现代固件设备
-
具有简单的图形用户界面
KVM 虚拟化固件
默认情况下,KVM 虚拟化使用 BIOS 作为来宾虚拟机的默认固件。要在 KVM 上启用 UEFI 支持,您必须在主机系统上安装 OVMF(开放虚拟机固件)包。
OVMF 项目是 qemu 虚拟机的 intels tianocore 固件的一部分。
对于基于 RHEL 的系统,如 CentOS/Fedora,您需要使用 DNF/Yum 命令安装包 edk2-ovmf 包。
使用 virt-install 创建UEFI启动的虚拟机
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存储所有配置(引导条目和引导顺序、安全引导密钥等)。通常这个文件用作空变量存储的模板,每个VM都有自己的私有副本。例如 Libvirt虚拟机管理器 将文件存储在/var/lib/libvirt/qemu/nvram中。OVMF_CODE.fd: 带有代码的firmware卷。将它和VARS分开可以:- 确保轻松更新固件
- 允许将只读代码映射到guest操作系统
UEFI 虚拟机启动流程分析
在引导安装过程中由于使用 UEFI 方式,所以需要去寻找固件 OVMF_VARS.fd 和 OVMF_CODE.fd,会先遍历 /usr/share/qemu/firmware/ 目录,如果里面有 50-edk2-ovmf-x64-nosb.json 或 60-edk2-aarch64.json(安装包可能会提供 edk2-ovmf/edk2-aarch64),会读取其中文件,内容主要包含固件路径,如果没有这两个 json 文件,就使用 qemu.conf 默认路径,如果有这两个 json 文件,就使用 json 文件中路径,最终路径会写入虚拟机 XML。
!!!这里会存在一个问题!!!
问题描述:
A ARM 环境使用自动部署脚本创建虚拟机不能启动,BARM 环境可以正常启动
# 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
问题分析:
A ARM 环境中不存在 json(edk2-aarch64-202002-9.ctl3.noarch 不提供),但自动化部署的虚拟机 XML 中固定使用 /usr/share/edk2/aarch64/QEMU_EFI-silent-pflash.raw 与 qemu 默认路径 /usr/share/AAVMF/AAVMF_CODE.fd 不一致,会导致启动失败;
B ARM 环境中存在 json(edk2-aarch64-20200602gitca407c7246bf-3.el8.noarch 提供),json 中指定路径为/usr/share/edk2/aarch64/QEMU_EFI-silent-pflash.raw,启动时会优先使用 json 中的路径,所以没有问题
解决方式:
方式一,修改虚拟机 XML 中 loader 路径,/usr/share/AAVMF/AAVMF_CODE.fd
方式二,手动创建 /usr/share/qemu/firmware/xxx.json 写入默认路径,/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组件时会编译其它架构的固件,我只想编译aarch64架构怎么办?
A:修改/path/to/qemu/Makefile.edk2 中的flashdevs变量,注释掉其它架构
Q:edk2中常出现的OVMF和AAVMF,以及edk2,它们之间什么关系?
A:虚拟化应用组件最开始使用seabios引导虚机内核,Indel为使UEFI可以引导虚机,发起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 创建带有 UEFI 固件的虚拟机,请在命令选项中添加选项 --boot uefi,。 下面是使用 virt-install 命令创建带有 UEFI 固件的新虚拟机 Artix 的示例。)
编译QEMU+OVMF(ARM架构) — Cloud Atlas beta 文档 (cloud-atlas.readthedocs.io)
相关文章:
UEFI 启动原理及qemu 虚拟化中使用
UEFI 启动原理及qemu 虚拟化中使用 什么是BIOS?什么是 UEFI? 什么是BIOS? 计算机启动时会加载 BIOS,以初始化和测试硬件功能。它使用 POST 或 Power On Self Test 来确保硬件配置有效且工作正常,然后寻找存储引导设…...
35、正则表达式
一、正则表达式命令 正则表达式:匹配的是文本内容,linux的文本三剑客都是针对文本内容。 grep 过滤文本内容 sed 针对文本内容进行增删改查 awk 按行取列 文本三剑客----都是按照行进行匹配。 1.1、grep筛选: grep的作用就是…...
Ubuntu20.04中复现FoundationPose
Ubuntu20.04中复现FoundationPose 文章目录 Ubuntu20.04中复现FoundationPose1.安装cuda和cudnn2.下载相关资源3.环境配置4.运行model-based demo5.运行ycbv demoReference 🚀 非常重要的环境配置 🚀 ubuntu 20.04cuda 11.8.0cudnn v8.9.7python 3.9.19…...
【Qt快速入门(四)】- QLabel文本框的使用
目录 Qt快速入门(四)- QLabel文本框的使用QLabel文本框的使用QLabel的基本用法1. 创建和设置文本2. 动态设置文本 设置文本样式1.设置字体和颜色2.文本对齐方式3.富文本显示 显示图片QLabel的交互功能可点击标签 QLabel的高级特性1.缩放图片以适应标签大…...
用Python设置Excel工作表网格线的隐藏与显示
Excel表格界面的直观性很大程度上得益于表格中的网格线设计,这些线条帮助用户精确对齐数据,清晰划分单元格。网格线是Excel界面中默认显示的辅助线,用于辅助定位,与单元格边框不痛,不影响打印输出。然而,在…...
自回归模型胜过扩散模型:用于可扩展图像生成的 Llama
📜 文献卡 Autoregressive Model Beats Diffusion: Llama for Scalable Image Generation作者: Peize Sun; Yi Jiang; Shoufa Chen; Shilong Zhang; Bingyue Peng; Ping Luo; Zehuan YuanDOI: 10.48550/arXiv.2406.06525摘要: We introduce LlamaGen, a new family …...
访问外网的安全保障——反向沙箱
反向沙箱作为一种网络安全技术,其核心理念在于通过构建一个隔离且受控的环境,来有效阻止潜在的网络威胁对真实系统的影响。在当今日益复杂的网络环境中,如何借助反向沙箱实现安全上网,已成为众多用户关注的焦点。 随着信息化的发…...
【绝对有用】C++ 字符串进行排序、vector增加内容 和 剔除值
在 C 中对字符串进行排序,可以使用标准库中的 std::sort 函数。std::sort 函数可以用于容器或范围内的元素排序,包括字符串中的字符。以下是一个简单的示例代码,展示了如何对字符串中的字符进行排序: #include <iostream> …...
GenICam标准(一)
系列文章目录 GenICam标准(一) GenICam标准(二) GenICam标准(三) GenICam标准(四) GenICam标准(五) GenICam标准(六) 文章目录 系列文…...
【Redis】分布式锁基本理论与简单实现
目录 分布式锁解释作用特性实现方式MySQL、Redis、Zookeeper三种方式对比 原理 reids分布式锁原理目的容错redis简单分布式锁实现锁接口实现类下单场景的实现容错场景1解决思路优化代码 容错场景2Lua脚本Redis利用Lua脚本解决多条命令原子性问题 释放锁的业务流程Lua脚本来表示…...
Web开发技术大作业(HTML\CSS\PHP\MYSQL\JS)
从6月13日到6月15日,经过一系列的操作,终于把老师布置的大作业写完了,虽然有很多水分,很多东西都是为了应付(特别是最后做的那几个网页),真的是惨不忍睹,不过既然花时间写了…...
【全开源】沃德会务会议管理系统(FastAdmin+ThinkPHP+Uniapp)
沃德会务会议管理系统一款基于FastAdminThinkPHPUniapp开发的会议管理系统,对会议流程、开支、数量、标准、供应商提供一种标准化的管理方法。以达到量化成本节约,风险缓解和服务质量提升的目的。适用于大型论坛、峰会、学术会议、政府大会、合作伙伴大会…...
尚硅谷大数据技术ClickHouse教程-笔记01【ClickHouse单机安装、数据类型】
视频地址:一套上手ClickHouse-OLAP分析引擎,囊括Prometheus与Grafana_哔哩哔哩_bilibili 01_尚硅谷大数据技术之ClickHouse入门V1.0 尚硅谷大数据技术ClickHouse教程-笔记01【ClickHouse单机安装、数据类型】尚硅谷大数据技术ClickHouse教程-笔记02【表引…...
生产管理系统看板,在自动化设备领域的创新应用
在自动化设备领域,生产管理系统看板的创新应用是一项引人注目的技术进步。以广州某自动化设备有限公司为例,他们是一家涂装工程设备制造企业,将讯鹏生产管理系统电子看板成功应用于全自动立式静电喷粉线、卧式静电喷粉线、氟碳喷涂生产线等领…...
分享一个图片转换工具XnConvert
目录 stablediffusion3 生成图片效果图图片转换工具XnConvertpixzip stablediffusion3 生成图片效果图 今天在使用stablediffusion3时,尝试生成了几张Java的图片,发现确实很好看,文生图的效果超出我的预期,忍不住想要给自己的csd…...
Nginx后端超时504重复请求
在一次业务中客户端请求osb平台再经过nginx转发后端,开发反馈请求次数大于1导致问题,经排查客户端请求一次,osb平台设置超时为30s,nginx配置等待上游服务器响应时最多等待30秒 部分配置文件 upstream xx {server 10.6.6.1:8080 w…...
环境配置04:Pytorch下载安装
说明: 显存大于4G的建议使用GPU版本的pytorch,低于4G建议使用CPU版本pytorch,直接使用命令安装对应版本即可 GPU版本的pytorch的使用需要显卡支持,需要先安装CUDA,即需要完成以下安装 1.查看已安装CUDA版本 GPU对应…...
【杂记-浅谈私有地址】
私有地址 一、私有IP地址概述1、私有IP地址的实用性2、私有IP地址的局限性 二、私有IP地址范围1、A类私有地址2、B类私有地址3、C类私有地址 三、私有IP地址与公网IP地址的区别 一、私有IP地址概述 私有IP地址是互联网工程任务组(IETF)为组织机构内部使…...
Java基础学习-数组
目录 数组定义 注意点: 地址值是数组在内存中实际存储的地址。 案例遍历:遍历数组得到每一个元素,求数组里面所有数据和 案例:定义数组,遍历能被3整除的数字 案例:遍历一个数组,奇数将当前…...
爬虫 pandas Linux Flume Pig填空题
目录 试卷:Python网络数据处理 答案 试卷:Pandas基础操作 答案 试卷:Linux基础指令 答案 试卷:Apache Flume基础指令 答案 试卷:Apache Pig基础指令 答案: Hadoop题 答案 试卷:Pyth…...
基于springboot框架个性化旅游线路推荐系统 景区门票 酒店 预订88u7sgf 有论文-idea maven vue
目录系统架构设计技术选型与工具数据库设计核心功能实现论文研究要点开发计划安排项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作系统架构设计 采用前后端分离架构,后端基于SpringBoot框架,前端使用Vue…...
UE4网络同步实战:AIController与RPC的避坑指南(含C++代码示例)
UE4网络同步实战:AIController与RPC的避坑指南(含C代码示例) 在多人联机游戏的开发中,网络同步始终是开发者面临的核心挑战之一。虚幻引擎4(UE4)提供了强大的网络框架,但其中AIController的服务…...
Windows系统下安装与配置FreeSWITCH完整指南
本文提供在 Windows 系统上安装 FreeSWITCH 的完整步骤,涵盖下载、安装、配置、启动测试,以及可能遇到问题的解决方案,帮助你顺利完成开发环境的搭建。 一、环境准备与下载 1.1 系统要求 项目要求操作系统Windows 7/8/10/11,Wi…...
基于LLM的智能客服系统实战:飞书集成与高并发架构设计
最近在做一个企业级的智能客服项目,客户要求必须集成到飞书工作台,并且要能扛住业务高峰期的并发压力。传统的规则引擎客服系统,在面对五花八门的用户提问时,经常“卡壳”,尤其是那些规则库没覆盖到的“长尾问题”&…...
OpenClaw+nanobot学术助手:文献自动归类与摘要生成
OpenClawnanobot学术助手:文献自动归类与摘要生成 1. 为什么需要自动化文献管理工具 作为一名经常需要阅读大量论文的研究者,我长期被文献管理问题困扰。电脑里堆积如山的PDF文件,每次需要查找特定内容时都要花费大量时间翻找。更痛苦的是&…...
低成本搭建QQ机器人:OpenClaw+nanobot消息中转方案
低成本搭建QQ机器人:OpenClawnanobot消息中转方案 1. 为什么选择OpenClawnanobot方案 去年我在管理一个小型技术社群时,经常需要处理重复性的问答和通知发布。尝试过多个机器人框架后,最终选择了OpenClawnanobot的组合方案。这个方案最吸引…...
消费级GPU福音:OpenClaw+百川2-13B量化版显存占用实测
消费级GPU福音:OpenClaw百川2-13B量化版显存占用实测 1. 为什么关注显存占用? 去年折腾大模型本地部署时,最头疼的就是显存问题。我的RTX3060显卡只有12GB显存,跑Llama2-13B原版模型时,加载阶段就直接爆显存。直到发…...
照着用就行:全学科适配的降AIGC工具 千笔·专业降AI率智能体 VS PaperRed 一站式解决降重难题
随着AI技术的迅猛发展,学术写作中对AI生成内容的识别能力也在不断提升,许多学生和研究者发现,原本依赖AI辅助撰写的论文,如今在查重系统中频频被标记出高AIGC率,甚至影响最终成绩。这种现象不仅让许多人措手不及&#…...
L1-083 谁能进图书馆,python解法
题目:为了保障安静的阅读环境,有些公共图书馆对儿童入馆做出了限制。例如“12 岁以下儿童禁止入馆,除非有 18 岁以上(包括 18 岁)的成人陪同”。现在有两位小/大朋友跑来问你,他们能不能进去?请…...
Unity入门:从零开始认识Unity编辑器界面
Unity入门:从零开始认识Unity编辑器界面📚 本章学习目标:深入理解从零开始认识Unity编辑器界面的核心概念与实践方法,掌握关键技术要点,了解实际应用场景与最佳实践。本文属于《Unity工程师成长之路教程》Unity入门篇&…...
