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

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签