Linuxboot01-背景及现状-程序员宅基地

技术标签: 阿里云  服务器  uefi/linuxboot实战开发  

        随着人们对于计算资源需求的不断增长,对于硬件的需求也越来越高。云服务器的出现为这些公司或个人提供了很好的选择。比如说国外著名的亚马逊云服务器AWS,用户达到了数百万。在国内,有阿里云,腾讯云,华为云服务器,用户数也是非常之多。云服务器迎来了一个势不可挡的趋势,而目前的云服务器固件几乎均采用UEFI/Tiano方案,而这往往是安全性不高且启动速度较低的,而这并不能够很好满足企业用户高质量高效的需要。


一、LinuxBoot背景

        LinuxBIOS起源于1999年,来自Ron Minnich,Stefan Reinauer等人。这是一个将Linux作为固件运行的实验。当时,Linux对于硬件初始化项目来说还不够成熟,虽然LinuxBIOS在几个性能和可靠性关键环境中取得了成功,但它并没有被大规模采用。LinuxBIOS在2000年代初变成了coreboot,并且由于闪存尺寸的缩小,删除了Linux部分,并成为能够引导其他有效负载的更通用的板初始化工具。2017年,在Linux大会上,同样是Ron带来了NERF(Non-Extensible Reduced Firmware)。只改动了几十行代码,剥离了coreboot的ramstage,只留下romstage,在内存和一些必须的硬件初始化好了就直接加载Linux Kernel。这也就是Linuxboot的前身。

        LinuxBoot项目是Google,Facebook,Horizon Computing Solutions和Two Sigma之间的合作,旨在为基于Linux的服务器机器构建一个开放,可定制且稍微安全一些的固件。它支持不同的运行时,如Heads固件或Google的NERF。

二、LinuxBoot项目研究意义及现状

1.研究意义

        为了解决底层固件差异性和封闭性所带来的一系列问题,很多开源社区在开发新的固件方案。目前服务器主流的固件系统包括UEFI/TianoMin Platform CorebootLinuxBoot,这些固件都有特定的特点,如下表所示:

        UEFI是目前比较主流的固件方案UEFI/Tiano是一种存在较久的固件系统,生态好,但是由于其代码太过繁琐,社区活跃度低,几乎没有厂商能基于 UEFI/Tiano 的开源方案直接产品化;Min Platform定义了多个平台的最小化启动方案,以及UEFI的最小集合,用户只需要进行重构,然后拼接起来即可实现完整的功能。但是社区活跃度仍然较低,不利于开发;CoreBoot的前身是LinuxBIOS,但由于在开发过程中逐渐以core boot程序为主,为了避免误解改名CoreBoot。随着主板类型增多,CoreBoot的程序也变得越来越大,加入了更多的硬件初始化代码。系统的启动流程变得更加繁琐。为了解决Coreboot存在的问题,新的BIOS框架Linux Boot诞生了。LinuxBoot旨在通过用Linux 内核和运行时替换某些固件功能来提高系统启动性能和可靠性。

2.研究现状

        2021年9月15日字节跳动宣布开发出第一代云固件 (Cloud Firmware)。第一代云固件首批 200+ 服务器已顺利完成生产上线,并稳定支持了字节跳动部分业务的持续运行。


 三、LinuxBoot介绍

1.LinuxBoot组成

         LinuxBoot是一个旨在用Linux内核和运行时替换特定固件功能的项目。LinuxBoot支持多种运行时,其前身NERF就是一种运行时,Linux boot支持Coreboot runtime(采用其硬件加载部分)。多年来,该项目已经发展到包括各种计划,其总体目标是从晦涩难懂的复杂固件迁移到更简单的开源固件。LinuxBoot由三部分组成:

        第一部分BIOS:这不一定是特定的 BIOS;目前LinuxBoot支持UEFI和coreboot。

        第二部分linux内核:可以使用Linux内核功能替换特定的UEFI功能,然后在计算机上启动实际的生产内核。特定于 LinuxBoot 的内核配置文件提供了所需的 Linux 内核功能,而不会因不必要的驱动程序而使 BIOS 的大小膨胀。

        第三部分u-root-> initramfs:当 Linux 引导时,它需要一个提供引导和启动实用程序的根文件系统。u-root就是一个这样的使用Go语言编写的文件系统,u-root是一个用户空间环境,可以提供一个 Linux 环境中工作的基本库和实用程序。LinuxBoot使用u-root来创建一个用于此目的的initramfs。initramfs 是嵌入在固件映像本身中的根文件系统。它旨在与Linux内核一起放置在闪存设备中,作为LinuxBoot固件映像的一部分。u-root 是一个 Go 用户空间(一组用 Go 编写的程序和库,用于与内核交互)。它包含标准 Linux 应用程序和命令的工具集。

         u-root 可以在两种不同的模式下创建 initramfs:源模式,其中包含:Go工具链二进制文件、一个简单的外壳、通过 shell 动态编译工具的 Go 源代码  ; Busybox (bb) 模式:这是一个类似 busybox 的二进制文件,包含所有请求的实用程序。

2.LinuxBoot过程

        LinuxBoot使用驱动本质上代替了UEFI DXE和BDS阶段,代替了coreboot的ramstage,而利用UEFI的PEI和SEC阶段,或coreboot的romstage,来进行最少的必要硬件初始化,后面的很多硬件初始化都依靠Linux内核的驱动来完成,而这些驱动也会更加安全。无论UEFI的PEI,或者说coreboot的romstage,内存和为初始化内存进行的必要硬件初始化代码只能而且应该由芯片厂商提供,在Intel就是FSP,在AMD就是AGESA,除此之外的代码量很少。

3.LinuxBoot vs UEFI

        LinuxBoot 用 Linux 应用程序取代了统一可扩展固件接口 (UEFI) 和其他固件(尤其是网络堆栈和文件系统模块)使用的许多驱动程序执行环境 (DXE) 模块。LinuxBoot将Linux内核作为Flash ROM中的DXE而不是UEFI shell。Linux 内核提供了基于 Go 的用户空间,然后可以调出要在计算机上运行的内核。LinuxBoot 固件范式支持将引导加载程序、调试、诊断和错误检测应用程序等传统固件应用程序编写为跨体系结构和跨平台可移植 Linux 应用程序。当Linux引导时,它需要一个带有实用程序的根文件系统。用于Linuxboot的一个这样的根文件系统是基于用Go编写的u-root标准实用程序。下图显示了 UEFI 启动过程的当前状态以及过渡到 LinuxBoot 的过程。

对比目前主流的UEFI,很明显Linuxboot有以下几个优点:

  • 通过将经过轻微测试的固件驱动程序替换为强化的 Linux 驱动程序来提高启动可靠性。
  • 通过删除不必要的代码缩短启动时间。通常使启动速度提高 20 倍。
  • 允许自定义 initrd 运行时以支持特定于站点的需求(设备驱动程序以及自定义可执行文件)

四.平台搭建

LinuxBoot可以支持多种BIOS,如UEFI、coreboot、u-boot等;

LinuxBoot可以启动多个操作系统(Linux,Berkeley UNIX(BSD),XEN,Windows);

LinxBoot支持以下服务器主板:

  • QEMU模拟Q35系统
  • Intel S2600WF
  • Dell R630
  • Winterfell Open Compute node(运行良好)
  • Leopard Open Compute node(运行良好)
  • Tioga Pass Open Compute node(运行良好)
  • Monolake Open Compute node (not tested)

        综上,基于现有设备,这里采用QEMU模拟Q35系统进行使用LinuxBoot中的Linux Kernel来引导设备完成识别和初始化,通过引导加载程序来启动虚拟操作系统。

五.注

专业词汇

介绍

BIOS

最初,BIOS是内置于计算机中的软件,用于向硬件发送简单的指令,允许在加载操作系统之前进行输入和输出。它是一个没有标准化结构的二进制 blob,负责初始化 CPU 和内存,并跳转到第一个磁盘驱动器的主块上的硬编码位置。BIOS已在很大程度上被UEFI取代。许多UEFI实现仍然提供“BIOS兼容模式”,这使得它的行为类似于旧的BIOS及其功能。

busybox

Busybox 是一个单一用户空间二进制文件,它包括大量系统命令的版本,包括一个shell。此包对于从某些类型的系统故障(尤其是涉及损坏的共享库的系统故障)中恢复非常有用。busybox 有多个实现,例如git.busybox.net/busybox 和 github.com/u-root/u-root。

coreboot

为各种体系结构开发开源启动固件的项目。它的设计理念是做最低限度的必要工作,以确保硬件可用,然后将控制权传递给称为有效载荷的不同程序。然后,有效负载可以提供用户界面,文件系统驱动程序,各种策略等来加载操作系统。

EDK II

UEFI 兼容固件的开源参考实现,最初由英特尔开发。请参阅 https://github.com/tianocore/edk2

firmware

为设备的特定硬件提供低级控制的特定类计算机软件。它是在制造时安装的,并且是计算机打开时运行的第一个程序。它检查计算设备具有哪些硬件组件,唤醒组件,并将它们移交给要安装在计算机上的操作系统。当前的 x86 固件基于英特尔的通用可扩展固件接口 (UEFI)。

Heads

适用于笔记本电脑和服务器的开源固件,旨在实现强大的平台安全性。由Trammell Hudson开发,基于剥离的UEFI和Linux,以及BusyBox而不是you-root。更多信息请见Heads - Trammell Hudson's Projects

iSCSI

一种协议,它提供了一种使网络连接存储看起来像是使用它的主机的本地设备的方法,允许它(除其他事项外)作为常规本地文件系统挂载。

kexec

一种系统调用,使您能够从当前运行的内核加载并引导到另一个内核。kexec 从内核中执行引导加载程序的功能。

LinuxBIOS

一个项目起源于1999年,来自Ron Minnich,Stefan Reinauer等人。这是一个将Linux作为固件运行的实验。当时,Linux对于硬件初始化项目来说还不够成熟,虽然LinuxBIOS在几个性能和可靠性关键环境中取得了成功,但它并没有被大规模采用。它后来成为coreboot。

LinuxBoot

LinuxBoot不是一个产品,而是一个概念。这是使用Linux(系统固件)启动Linux(OS)的想法。在某种程度上,LinuxBIOS开创了同样的概念。它就像一个Linux发行版,但用于固件。它是各种开源组件的集合,组合在一起作为一致的固件操作系统工作。

NERF

LinuxBoot项目的原始名称由剥离的UEFI加上Linux加上u-root组成。该名称代表不可扩展的简化固件,而不是UEFI的统一可扩展固件接口。NERF 是 UEFI 的替代品,它更紧凑且可扩展性更低。虽然可扩展性很好,而且通常是可取的,但太多的可扩展性会使复杂的项目很难维护和保持安全。

Open Source Firmware

OSF 可用于引用开源固件或开放系统固件,具体取决于上下文。

Open System Firmware (OSF)

开放计算项目 (OCP) 的官方子项目。OSF是由OCP的各种成员在开放中开发的,他们对开源系统固件感兴趣。OSF定义了一套指导方针,其中包括微软,谷歌,Facebook,英特尔,9elements,TwoSigma和其他几家公司的贡献。

OVMF

打开虚拟机固件。开放式虚拟机固件是用于虚拟机的 EDK II 版本。它包括对 UEFI 的完全支持,包括安全启动,允许在 EFI 初始化 (PEI) 中使用 UEFI 代替传统的 BIOS。

production kernel

LinuxBoot不是一个运行时生产内核;相反,它旨在使用Linux内核功能替换特定的UEFI功能,然后在计算机上启动实际的生产内核(prodkernel)。特定于 LinuxBoot 的内核配置文件提供了所需的 Linux 内核功能,而不会因不必要的驱动程序而使 BIOS 的大小膨胀。

QEMU

执行硬件虚拟化的仿真器。QEMU 是托管的虚拟机监视器。

Secure Boot Preverifier (SEC)

在 UEFI 中,SEC 阶段初始化 CPU 缓存即 RAM (CAR), 并将控制权交给 PEI 调度程序。它是 99.9% 的汇编代码(32 位保护模式)。

u-boot

一个非常流行的开源固件和引导加载程序。不要与u-root混淆。

u-root

适用于 Linux 的现代嵌入式用户空间环境,带有引导加载程序工具。请参阅有关 u-root 的部分。

UEFI

统一的可扩展固件接口。这是英特尔对系统固件标准的规范。UEFI定义了从闪存芯片上的布局到如何连接到外围设备,从磁盘或网络启动,定义UEFI应用程序如何工作等所有内容。它不是一个实现,而是一个标准。EDK II 和 OpenEDK II 是 UEFI 实现。UEFI本身不是闭源的,但在实践中,大多数实现都是。

userland/userspace

一组用于与内核交互的程序和库。

六.参考文献汇总

https://www.linuxboot.org/

https://github.com/linuxboot/book

Linuxboot : linux as UEFI,linux over UEFI

下一代BIOS标准探讨之三:Linux固件的回归—LinuxBoot

LinuxBoot 34c3

LinuxBoot: Linux as firmware

下一代BIOS标准探讨引子:之各种Bootloader大比拼

下一代BIOS标准探讨之四:UEFI界中的乐高—MinPlatform

字节跳动首发云固件

https://linux.cn/article-10257-1.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_46695411/article/details/125563427

智能推荐

VUE{{}}中数据渲染出现undefined_vue undefined-程序员宅基地

文章浏览阅读2.5k次。VUE{{}}中数据渲染出现undefinedBackground在前端编码过程中,常常会出现在mustache表达式 {{}} 中undefine的某属性报错。原因是如果 {{}} 仅仅是个变量如 {{a}} 是不会报错的,a可以是undefine或者null。但是如果{{a.b}} 或者 {{a['b']}} ,那么当a是undefine的时候就会报错。并且因为Ajax是异步加载所以常常出现加载数据之前报出这个错误。Solution利用在标签上面添加v-if:例如: <div v-if_vue undefined

设计模式课程-高琪-专题视频课程-程序员宅基地

文章浏览阅读254次。设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结!_设计模式 高琪

Java锁比较全的入门整理_java锁入门-程序员宅基地

文章浏览阅读485次。一、锁的7大分类需要首先指出的是,这些多种多样的分类,是评价一个事物的多种标准,比如评价一个城市,标准有人口多少、经济发达与否、城市面积大小等。而一个城市可能同时占据多个标准,以北京而言,人口多,经济发达,同时城市面积还很大。同理,对于 Java 中的锁而言,一把锁也有可能同时占有多个标准,符合多种分类,比如 ReentrantLock 既是可中断锁,又是可重入锁。根据分类标准我们把锁分为以下 7 大类别,分别是:偏向锁/轻量级锁/重量级锁;可重入锁/非可重入锁;共享锁/独占锁;公平锁/非公_java锁入门

golang,Python,我们该怎么选_golang python 数据分析-程序员宅基地

文章浏览阅读404次。在这些编程语言中,Go语言和Python语言都属于高级编程语言,它们在不同领域和场景下有着广泛的应用。本文将从以下几个方面对Go语言和Python进行优缺点对比:速度、并发处理、强类型、学习曲线、库支持、多用途性、社区支持、可移植性、性能调优等。综上所述,Golang和Python都有自己独特的优缺点,并且适用于不同的场景。相反,Python属于解释型语言,因此它的性能调优需要使用一些特殊的技巧和工具。在选择一种编程语言时,不仅要考虑它的优缺点,还要考虑其他因素,如可维护性、团队成员技能、部署效率等。_golang python 数据分析

字符串匹配之后缀树_后缀树 字符串匹配-程序员宅基地

文章浏览阅读1.8k次。引言试想有这样一个问题,有一个长度为N的字符串A(N值很大),还有一个模式串B,B的长度为M(N/M很大,说明B只是一个小片段),此时需要判断B是否是A的字串。如果我们使用KMP算法的话,那么复杂度为O(N),对A串进行K次模式匹配的话就是KO(N),此时为了降低复杂度,我们可以考虑预处理长字符串A,是的,如果我们预先处理好A的后缀树,那么搜索子串的复杂度就降为O(M),进行K次匹配为KO(M_后缀树 字符串匹配

ubuntu 16.04 + Qt 5.7.1 无法输入中文的解决方法(转)_qt5.7.1无法输入中文-程序员宅基地

文章浏览阅读186次。转自 https://blog.csdn.net/lql0716/article/details/54973160author@jason_ql http://blog.csdn.net/lql0716安装fcitx-frontend-qt5sudo apt-get install fcitx-frontend-qt5找到以下路径的文件/usr/lib/x86_64-linux-gnu/qt5/p..._qt5.7.1无法输入中文

随便推点

如何为微信小程序添加定位导航和地图标注功能_小程序地图导航-程序员宅基地

文章浏览阅读1.3k次。在JavaScript代码中,我们需要将获取到的用户位置信息设置为map组件的latitude和longitude属性,并创建一个标注点并设置在markers属性中。在获取到用户的地理位置信息后,我们需要将用户的位置在地图上进行标注。在JavaScript代码中,我们需要在数据中添加路线规划相关信息,并在路线规划成功的回调函数中更新数据。同样的,我们在实现地图标注功能时,也需要获取用户的地理位置信息。至此,我们已经成功地实现了获取用户地理位置信息并在地图上标注出用户位置的功能。二、地图标注功能的实现。_小程序地图导航

DML DDL DCL TCL_dml is used to: 数据操纵语言用于: a. add /modify/delete da-程序员宅基地

文章浏览阅读288次。接着上篇说起,数据库操作语句,看了网上说的,有很多种说法,我现在总结的为DML DDL DCL TCL.DML (Data Manipulation Language)数据操纵语言statements are used for managing data within schema objects.由DBMS提供,用于让用户或程序员使用,实现对数据库中数据的操作。DML分成交互型DML和_dml is used to: 数据操纵语言用于: a. add /modify/delete data in the table b.

Hive安装及启动异常解决_启动hive session id一直-程序员宅基地

文章浏览阅读5.8k次,点赞4次,收藏19次。前期准备1、关于Hive的安装包和文档可以从这里获取:Hive官方文档Hive下载地址Hive源码地址2、Hive依赖于Hadoop,关于Hadoop的安装可以查看这里:Hadoop安装——启动模式,基本配置,启动方式Hadoop集群搭建——环境配置3、安装mysql由于Hive需要在数据库中存储元数据信息,所以安装hive之前需要先安装mysql。hive有一个默认的存放在内存中的数据库,企业开发_启动hive session id一直

在Qt designer中实现按钮的圆角设置_qt designer border-radius:10px;-程序员宅基地

文章浏览阅读9.2k次,点赞12次,收藏40次。放入按钮按键,在StyleSheet中设置:QPushButton{background-color: rgb(170, 170, 255);#背景颜色 color: white; #字体颜色 border-radius: 10px; border: 2px groove gray;#圆角设置 border-style: outset;#..._qt designer border-radius:10px;

ssh远程连接出现 Permission denied, please try again问题_permission denied, please try again.-程序员宅基地

ssh远程连接出现Permission denied问题的解决方法是:检查是否安装了SSH服务,如果已安装,需要打开配置文件并将PermitRootLogin设置为yes,然后重启SSH服务。

LRNNet :上海交大最新提出0.68M超轻量实时语义分割模型,简化Non-local计算量-程序员宅基地

文章浏览阅读2.8k次。点击上方“AI算法修炼营”,选择“星标”公众号精选作品,第一时间送达论文地址:https://arxiv.org/pdf/2006.02706.pdf本文是上海交通大学团队提出的轻量级实..._lrnnet

推荐文章

热门文章

相关标签