ONIE:设计规格(4)

4.x86 CPU架构设计

4.1.x86硬件需求

对于通用交换机硬件需求,请参阅“交换机硬件需求”章节描述。

x86 CPU架构交换机硬件需求如下:

Required Hardware Purpose
1GB (最小) CPU DRAM The DRAM used by the CPU.
大容量存储器4GB(最小), 16GB (推荐) GRUB,ONIE内核及NOS驻留在大容量存储设备中。虽然最小要求4GB,但是推荐使用16GB
非易失性存储器 用于存储板卡信息、制造数据信息(如设备系列号和MAC地址等)的EEPROM(或NOR/NAND flash)
以太网管理口 用于下载操作系统安装程序

对于大容量存储设,可以使用多种介质。唯一真正的要求的BIOS将设备识别为可引导的。可以使用如下类型:

  • mSATA
  • CFast
  • SATA SSD
  • USB NAND

4.1.1.系统BIOS和SMBIOS/DMI标准

管理x86服务器的事实标准是存储在系统BIOS中的SMBIOS/DMI数据。在Linux下,dmidecode工具可以访问这些数据。

对于大型数据中心,DMI信息是自动化和配置管理的关键组件。所有主要的自动化引擎都使用DMI数据来确定他们在那种类型的盒子上。例如:

在这方面,x86交换机应该像x86服务器一样。

这对于ONIE来数并不是一个技术问题,但是对于最终用户来说却是一个操作上的问题。
有关信息,请参阅“SMBIOS参考贵干”中6.2节描述。

以下是上述自动化引擎所需的SMBIOS/DMI数据的字段。ONIE建议所有这些字段填写正确。

4.1.1.1.Required SMBIOS/DMI BIOS Information (DMI type 0) Fields

Field Comments
Vendor Required - BIOS vendor name
Version Required - version of BIOS f/w
Revision Required - version of BIOS f/w
Release Date Optional - BIOS f/w build date

4.1.1.2.Required SMBIOS/DMI System Information (DMI type 1) Fields

Field Comments
Manufacturer Required
Product Name Required - should match SKU description
Serial Number Required
Version Optional - match orderable SKU or sticker on chassis
SKU Number Optional - match orderable SKU or sticker on chassis

4.1.1.3.Required SMBIOS/DMI Chassis Information (DMI type 3) Fields

Field Comments
Manufacturer Required
Type Optional
Serial Number Required
Asset Tag Required - for null return "Not Specified"
Power Supply State Optional
Thermal State Optional
Height Optional - should be in rack units

4.2.x86 UEFI 固件支持

本设计规范定义了ONIE如何与基于x86的Unified Extensible Firmware Interface (UEFI)系统集成。

4.2.1.术语

Acronyms related to UEFI

Term Definition
BIOS Basic Input/Output System PC Firmware BIOS
CSM UEFI Compatibility Support Module CSM
ESP EFI System Partition ESP
FBM UEFI Firmware Boot Manager
GPT GUID Partition Table GPT
GRUB-x86_64-efi GRUB2 compiled for x86_64 CPU with UEFI firmware
GRUB-i386-pc GRUB2 compiled for i386/x86_64 CPU with BIOS firmware
HDOS Hardware diagnostics operating system
MBR Master Boot Record MBR
NOS Network Operating System
ONIE Open Network Install Environment
UEFI Unified Extensible Firmware Interface UEFI

4.2.2.概述

ONIE在2015.08发布的版本中增加了对UEFI的支持。更早的版本,ONIE只支持传统BIOS固件或运行于BIOS传统模式下的UEFI系统,也称为“UEFI CSM”。

虽然这也能工作,但是从引导NOS到引导ONIE再回到引导NOS的机制并不简单,并且容易出现执行错误。

UEFI简化了x86平台上的许多ONIE设计点,其好处是:

  • UEFI现在是x86服务器的标准。要求ONIE兼容系统支持特定的UEFI版本,是硬件供应商瞄准的一个非常具体的目标。
  • 与现有的基于BIOS的MBR方法相比,ONIE个NOS可以使用一种简单得多的方法进行互操作。
  • 支持在同一台机器上安装多个操作系统。
  • UEFI是支持未来ARM64平台的唯一方法。

4.2.3.ONIE需求

X86硬件需求中的所有现有要求继续适用于UEFI,另外还要求如下内容:

  • 为NOS安装程序提供一个“UEFI感知”环境来执行安装任务
  • 允许多个操作系统安装共存
  • 根据UEFI原语提供ONIE-NOS接口

4.2.4.目标UEFI版本

在撰写本文时,当前的UEFI规范版本为2.4 (errata B). Download UEFI 2.4b Specification.
根据需要,本规范将引用UEFI版本2.4 (errata B)中章节。
此处描述的设计以UEFI当前版本或更高为目标。
作为背景,读者可以阅读第三章(引导管理器)及章节12.3 (文件系统格式)以了解有关UEFI引导管理器如何定位和执行UEFI镜像的更多信息。

4.2.5.ONIE与UEFI集成

ONIE主要关注操作系统的生命周期,包括:

  • 安装OS
  • 移除OS
  • 调度要启动的OS

在UEFI系统上,固件引导管理器(FBM)通过UEFI规范定义的大量UEFI全局变量来确定引导顺序。
为了使基于Linux的ONIE与这些全局变量相互操作,需要一些额外的软件配置和程序。

4.2.5.1.Linux Kernel支持UEFI

Linux内核配置必须启用以下选项:

  • CONFIG_EFI
  • CONFIG_EFIVAR_FS

选项CONFIG_EFIVAR_FS导出UEFI全局变量到/sys/firmware/efi/efivars。
有关更多Linux支持UEFI的配置,请参阅Linux内核文档https://www.kernel.org/doc/Documentation/x86/x86_64/uefi.txt

4.2.5.2.UEFI用户空间工具

ONIE需要一些额外的用户空间工具来在UEFI环境中进行互操作。

4.2.6.Efibootmgr和efivar

工具 efibootmgr(8) 用于操作UEFI全局变量,特别是以下变量的修改:

  • Boot#### -- A boot load option. #### is a printed hex value.
  • BootOrder -- The ordered list of Boot#### load options. The firmware attempts to boot each load option in turn, starting with the first entry.
  • BootNext -- The boot entry to use for the next boot only. This option is used to load a boot option once, then returning to the order specified in BootOrder.

有关这些变量的更多详细信息,请参阅UEFI规格文档3.2节描述。
工具efibootmgr依赖于efivar库,也必须在ONIE中存在。

4.2.7.FAT文件系统支持和工具

UEFI规格要求使用EFI系统分区(ESP)的FAT文件系统。有关ESP的更多信息,请参阅UEFI规范哦文档12.3章节描述。

因此,ONIE镜像需要工具用于创建、维护和安装FAT文件系统。具体需求如下:

  • mkfs.vfat -- 创建一个FAT文件系统
  • fsck.vfat -- 检查及修复FAT文件系统

4.2.8.UEFI x86 Boot Loader (GRUB-x86_64-efi)

对于UEFI系统,ONIE将继续使用GRUB2作为引导程序,尽管其方式与传统BIOS系统完全不同。对于UEFI系统,ONIE将使用GRUB-x86_64-efi,这是为UEFI x86_64编译的GRUB2产品。GRUB-x86_64-efi不会像传统GRUB-i386-pc那样将数据安装到磁盘MBR中,而是每个操作系统(包括ONIE)都将其引导加载程序安装到EFI系统分区子目录中。

本节介绍ONIE如何使用GRUB-x86_64-efi以及如何对硬盘进行分区。除非有另作说明,在本文档中提及的GRUB 都指GRUB-x86_64-efi。

4.2.8.1.磁盘分区布局

磁盘分区布局在ONIE和安装的NOS如何协作方面起到至关重要的作用。本节介绍ONIE和NOS必须遵守的布局和指导方针。

与ONIE一起提供的Demo OS Installer和Demo OS Runtime,将执行本节中描述的所有步骤。有关Demo OS的更多信息,请参阅“Demo OS Installer”和“Demo OS Runtime”。

4.2.8.1.1.分区表格式

UEFI规格文档强烈推荐使用 GUID Partition Table格式,ONIE也建议使用。
GPT是ONIE在UEFI上唯一支持的分区类型。

4.2.8.1.2.EFI系统分区(ESP)

传统上,UEFI磁盘上的第一个分区是EFI系统分区(ESP)。UEFI规定这个分区:

  • 使用GPT分区类型GUID C12A7328-F81F-11D2-BA4B-00A0C93EC93B
  • 包含一个FAT32文件系统
  • 包含名为EFI的目录

对于ONIE,UEFI引导程序为GRUB2,UEFI应用路径为:

EFI/onie/grubx64.efi
4.2.8.1.3.ONIE-BOOT分区

与传统BIOS ONIE实现类似,一个独立的ONIE-BOOT分区包含ONIE kernel及initramfs。就像在传统BIOS情况下一样,这个分区使用GPT类型GUID 7412F7D5-A156-4B13-81DC-867174929325。

ONIE-BOOT分区类型GUID 7412F7D5-A156-4B13-81DC-867174929325由GTP fdisk如那件包中的gdisk和sgdisk工具识别。

4.2.8.2.初始ONIE安装

ONIE通过使用PXE的网络或者直连的USB存储器安装在设备上。在安装过程中,ONIE安装程序将重新初始化主硬盘,擦除所有以前的分区和数据。

以下示例假定硬盘在Linux中为/dev/sda。
在初始化磁盘配置期间,ONIE安装程序镜像将执行如下操作:

  1. 在磁盘上创建一个空的GPT分区表
  2. 用适当的GPT分区类型GUID和FAT32文件系统创建ESP
  3. 将ESP挂载在传统的挂载点上: /boot/efi
  4. 在ESP上创建需要的EFI目录如/boot/efi/EFI
  5. 使用释放的GPT分区类型GUID创建ONIE-BOOT 分区
  6. 将ONIE-BOOT分区挂载到/mnt/onie-boot
  7. 安装ONIE kernel + initramfs到ONIE-BOOT 分区
  8. 安装UEFI版本的GRUB到/boot/efi/EFI/onie/grubx64.efi
  9. 安装GRUB模块和GRUB配置文件到/mnt/onie-boot/grub
  10. 为/boot/efi/EFI/onie/grubx64.efi创建新的UEFI Boot#### 引导条目
  11. 修改UEFI BootOrder 变量以首先引导ONIE

当安装ONIE之后,磁盘布局如下:

+========================+
|                        |
|  /dev/sda1 ESP         |  <-- EFI System Partition
|                        |
+========================+
|                        |
|  /dev/sda2 ONIE-BOOT   /  <-- ONIE partition.  Installed by ONIE.  Contains
|                        |      kernel, initramfs and grub configuration.
+========================+
|                        |
|                        |
/  Free Space            /
|                        |
|                        |
+========================+

/boot/efi 中包含如下内容:

/boot/efi                         <-- mount point
/boot/efi/EFI                     <-- required UEFI directory
/boot/efi/EFI/onie                <-- ONIE OS directory
/boot/efi/EFI/onie/grubx64.efi    <-- ONIE's GRUB UEFI boot Application
UEFI BootOrder 及 BootCurrent 变量包含: 
BootCurrent: 0003
BootOrder: 0003,0000,0001,0002
Boot0000* EFI DVD/CDROM
Boot0001* EFI Network
Boot0002* EFI Internal Shell
Boot0003* ONIE: Open Network Install Environment

UEFI固件从ESP中找到引导程序。在这种方案中,不像传统BIOS固件方式那样使用MBR。

这里的理念是安装NOS创建所需的所有分区,并将其UEFI安装引导程序安装到ESP中的/boot/efi/EFI/<OS>/中。
之后,为NOS创建一个新的UEFI Boot####条目。这允许多个操作系统共存于一个硬盘上。

有关ESP的目录结构,请参考UEFI规格文档12.3.1.3章节描述。

最初的ONIE GRUB菜单如下:

  GNU GRUB  version 2.02~beta2+e4a1fe391
+------------------------------+
|*ONIE: Install OS             |
| ONIE: Rescue                 |
| ONIE: Uninstall OS           |
| ONIE: Update ONIE            |
| ONIE: Embed ONIE             |
|                              |
|                              |
+------------------------------+

4.2.9.NOS安装程序镜像

继续上面的例子,本节将检查NOS安装程序。NOS安装程序的操作与ONIE安装程序类似,只是此时ESP已经存在,无需再次创建。

NOS安装程序执行如下操作:

  1. 为NOS运行时文件创建分区及文件系统
  2. 将NOS文件(kernels,、initramfs等) 安装到分区中
  3. 安装UEFI引导程序到/boot/efi/EFI/<NOS>/<NOS loader image>
  4. 为/boot/efi/EFI/<NOS>/<NOS loader image>创建新的UEFI Boot#### 引导条目
  5. 修改UEFI BootOrder 变量使得首先引导NOS
  6. 对于基于GRUB的操作系统,为ONIE创建 :ref:chainload_onie ???

接着上面的例子,我们将在剩下的空间中安装CentOS。
磁盘空间如下:

+===========================+
|                           |
|  /dev/sda1 ESP            |  <-- EFI System Partition
|                           |
+===========================+
|                           |
|  /dev/sda2 ONIE-BOOT      /  <-- ONIE partition.  Installed by ONIE.  Contains
|                           |      kernel and initramfs.
+===========================+
|                           |
|                           |
/  /dev/sda3 CentOS         /  <-- CentOS partition.  Installed by CentOS.  Contains
|                           |      kernel, initramfs and GRUB configuration.
|                           |
+===========================+

/boot/efi 目录包括:

/boot/efi                         <-- mount point
/boot/efi/EFI                     <-- required UEFI directory
/boot/efi/EFI/fedora              <-- Fedora OS directory
/boot/efi/EFI/fedora/grubx64.efi  <-- Fedora's GRUB UEFI Application
/boot/efi/EFI/onie                <-- ONIE OS directory
/boot/efi/EFI/onie/grubx64.efi    <-- ONIE's GRUB UEFI Application

UEFI BootOrder及BootCurrent变量包含:

BootCurrent: 0004
BootOrder: 0004,0003,0000,0001,0002
Boot0000* EFI DVD/CDROM
Boot0001* EFI Network
Boot0002* EFI Internal Shell
Boot0003* ONIE: Open Network Install Environment
Boot0004* CentOS

CentOS安装其GRUB版本到/boot/efi/EFI/fedora,而不会干扰ONIE分区或文件。

4.2.10.ONIE加载链

使用GRUB的NOS可能会发现为ONIE创建一个GRUB菜单条目很有用。当用户想要手动选择GRUB菜单条目时就会用到该菜单。这种使用一个GRUB菜单条目来加载和启动引导程序的方法称为链式加载。

ONIE实现必须提供一个GRUB帮助脚本,为NOS GRUB配置创建合适的ONIE GRUB加载链条目。ONIE源码仓库提供了脚本50_onie_grub用于实现这个功能。

该脚本适合放在NOS的/etc/grub.d目录中。当重新生成grub.cfg文件时,许多操作系统提供者使用的update-grub(8)命令使用帮助脚本。

继续前面的例子,在创建ONIE chainload菜单后,CentOS的GRUB菜单在重启后如下:

GNU GRUB  version 2.02~beta2+e4a1fe391
+---------------------------------+
|*CentOS 6.5-x86_64               |
| ONIE                            |
|                                 |
|                                 |
+---------------------------------+

这是ONIE chainload GRUB-x86_64-efi菜单条目的例子:

# Menu entry to chainload ONIE UEFI
menuentry ONIE {
        set root='(hd0,gpt1)'
        search --no-floppy --fs-uuid --set=root 9A49-4F6B
        echo    'Loading ONIE ...'
        chainloader /EFI/onie/grubx64.efi
}

Demo OS installer通过安装GRUB-x86_64-efi并创建连接加载ONIE的初始化grub.cfg文件。参阅demo_os章节获取更多信息。

4.2.11.UEFI ONIE NOS接口

用于UEFI的ONIE NOS接口与传统的BIOS相似,仅在实现上有所不同。
要审查,NOS必须能在以下模式下启动ONIE:

  • install
  • uninstall
  • rescue
  • update
  • embed

4.2.11.1.ONIE引导模式

从NOS重新引导到ONIE的过程需要分成两步:

  1. 配置系统在下一次启动时进入ONIE
  2. 配置ONIE引导装载程序以选择请求模式

为了便于一次性重新引导到ONIE,UEFI系统将UEFI BootNext变量设置为对应于ONIE的Boot####条目。设置后,此变量将使UEFI引导管理器仅引导一次所请求的引导选项,并返回BootOrder所指定的顺序以用于后续引导。

为了选择"ONIE模式",NOS使用由ONIE提供的onie-boot-mode工具,就像传统的BIOS一样。有关cmd_onie_boot_mode请参阅相关章节。

4.2.12.硬件诊断操作系统(可选)

硬件诊断操作系统(HDOS)的处理方式与常规的NOS非常类似。创建分区和更新UEFI引导变量的概念也用于HDOS。

HDOS安装程序与常规NOS安装程序不同的主要地方时创建GPT分区。

4.2.12.1.HDOS磁盘分区

UEFI固件设备上安装的HDOS必须实现如下操作:

  • 将诊断GPT分区命名为 <SOMETHING>-DIAG。有关详细信息请参阅 sgdisk 程序和 --change-name选项。其中 <SOMETHING> 可以是硬件供应商的任意有意义的字符串。
  • 设置GPT系统分区属性位(bit 0)。请参阅 sgdisk 程序和 --attributes选项。
  • 当在诊断分区上创建文件系统时,将文件系统标签设置为 <SOMETHING>-DIAG,与用于GPT分区标签的字符串相同。参考 mkfs.ext4 程序及 -L 选项。

GPT分区名称和GPT系统分区位的 -DIAG后缀通告给符合ONIE和NOS安装镜像,该分区非常重要,不能修改。
ONIE卸载操作不能删除或修改满足上面要求的分区。
NOS下载操作不能删除或修改满足上面要求的分区。

4.2.12.2.GRUB注意事项

本节考查符合ONIE标准的HDOS安装镜像的操作任务。这与前面讨论的NOS安装镜像操作顺序非常类似。
HDOS安装程序镜像执行如下操作:

  1. 按照“HDOS磁盘分区”描述创建磁盘分区和文件系统
  2. 将HDOS文件(kernels, initramfs, diagnostic programs, etc) 安装到-DIAG分区中
  3. 安装UEFI引导程序到/boot/efi/EFI/<HDOS>/<HDOS loader image>
  4. 为/boot/efi/EFI/<HDOS>/<HDOS loader image>创建新的UEFI Boot####条目
  5. 添加ONIE加载链条目到HDOS's GRUB菜单

例如,考虑硬件制造商在安装ONIE后立即安装HDOS的情况。
磁盘分区如下:

+============================+
|                            |
|  /dev/sda1 ESP             |  <-- EFI System Partition
|                            |
+============================+
|                            |
|  /dev/sda2 ONIE-BOOT       |  <-- ONIE partition.  Installed by ONIE.  Contains
|                            |      kernel and initramfs.
+============================+
|                            |
|                            |
/  /dev/sda3 HDOS-DIAG       /  <-- HDOS partition.  Contains kernel, initramfs,
|                            |      diagnostic programs and GRUB configuration.
|                            |
+============================+

/boot/efi包含:

/boot/efi                         <-- mount point
/boot/efi/EFI                     <-- required UEFI directory
/boot/efi/EFI/HDOS                <-- HDOS directory
/boot/efi/EFI/HDOS/grubx64.efi    <-- HDOS's GRUB UEFI Application
/boot/efi/EFI/onie                <-- ONIE OS directory
/boot/efi/EFI/onie/grubx64.efi    <-- ONIE's GRUB UEFI Application

UEFI BootOrder及BootCurrent变量为:

BootCurrent: 0003
BootOrder: 0003,0004,0000,0001,0002
Boot0000* EFI DVD/CDROM
Boot0001* EFI Network
Boot0002* EFI Internal Shell
Boot0003* ONIE: Open Network Install Environment
Boot0004* HDOS

上面的字符串'HDOS'仅仅是一个例子,其他字符串只要符合HDOS分区需求都可以。

安装HDOS之后,请注意系统仍然配置为接下来启动ONIE。这里的意图是,从工厂发货的系统设置为安装程序默认启动ONIE。

符合ONIE标准的HDOS应该使用提供的50_onie_grub脚本为HDOS GRUB创建合适的ONIE GRUB加载链条目。这会将ONIE GRUB菜单项添加到HDOS GRUB菜单并添加 DIAG GRUB菜单到ONIE GRUB菜单。

此后,HDOS GRUB菜单显示如下:

GNU GRUB  version 2.02~beta2+e4a1fe391
+--------------------------------+
|*Hardware Vendor Diag           |
| ONIE                           |
|                                |
|                                |
+--------------------------------+

ONIE GRUB菜单显示如下:

GNU GRUB  version 2.02~beta2+e4a1fe391
+--------------------------------+
|*ONIE: Install OS               |
| ONIE: Rescue                   |
| ONIE: Uninstall OS             |
| ONIE: Update ONIE              |
| ONIE: Embed ONIE               |
| Hardware Vendor Diag           |
|                                |
+--------------------------------+

4.2.13.UEFI 参考文档

4.3.x86传统BIOS引导(GRUB2)

本节介绍旧BIOS固平台上的ONIE如何使用GRUB2以及磁盘如何分区。

对于UEFI固件系统,请参考“x86 UEFI固件支持”章节。

对于传统BIOS系统,理念是NOS拥有引导装载程序,NOS必须自己安装自己的GRUB(或其他bootloader)。
ONIE kernel和initramfs驻留在一个独立的分区中。安装的NOS控制它如何管理MBR和GRUB。

4.3.1.磁盘分区布局

磁盘分区布局在ONIE和NOS如何协作方面起到至关重要的作用。本节介绍了布局,并列出了ONIE和NOS必须遵守的规则。

本节中所描述的步骤均通过与ONIE一起提供的Demo OS Installer和Demo OS Runtime执行。有关Demo OS的信息,请参阅“Demo OS Installer及Demo OS Runtime”章节。

4.3.1.1.磁盘分区类型

每台设备可与选择是否使用GUID Partition Table (GPT)或者MS-DOS磁盘标签。通过将PARTITION_TYPE设置为msdos或gpt可以在$MACHINE/machine.make文件中指定。

这个选择取决于硬件供应商。onie-sysinfo -t命令报告正在使用的机器的磁盘标签。NOS安装程序可以使用此命令来确定如何为自己分区磁盘。

如果未指定,默认使用GPT。

4.3.1.2.初始ONIE安装(嵌入式)

在工厂初次安装ONIE时,硬盘是空白的。假设第一次使用PXE启动(或USB)来安装ONIE。

下面的例子使用GPT作为磁盘标签。MS-DOS磁盘标签的机制也差不多,唯一的区别是GPT需要创建"BIOS GRUB"分区而MS-DOS不用。

例如,假设硬件磁盘在Linux中的/dev/sda。

当安装ONIE之后,磁盘如下:

+============================+
|                            |
|  Sector LBA 0 aka MBR      |  <-- 1st stage boot loader in LBA-0.  Installed by ONIE
|                            |      during grub-install.  Loads additional code from
|  1st stage boot loader     |      /dev/sda1 and configuration from /dev/sda2.
|                            |
+============================+
|                            |
|  /dev/sda1 GRUB            |  <-- Additional data stored and used by GRUB for GPT disk
|                            |      labels.  Installed by ONIE during grub-install.
|  BIOS GRUB                 |      MS-DOS partition type does not have this.
|                            |
+============================+
|                            |
|  /dev/sda2 ONIE-BOOT       |  <-- ONIE partition.  Installed by ONIE.  Contains
|                            |      kernel and initramfs.  The GRUB 1st stage loader is
|  ONIE Installs GRUB        |      *also* installed on this partition.
|                            |
+============================+
|                            |
|                            |
/  Free Space                /
|                            |
|                            |
+============================+

在初始磁盘配置期间,ONIE安装程序执行如下操作:

  1. 由于磁盘空白,我们正在嵌入ONIE,需要创建分区表。安装程序创建以一个磁盘标签(根据计算机配置,可能是msdos 或 gpt),本例默认使用 gpt。
  2. 创建所需的分区(gpt两个,如是 msdos则创建一个)。两种情况都需要创建ONIE-BOOT 分区。
  3. 安装ONIE kernel+initramfs到ONIE-BOOT 分区。
  4. 安装GRUB到/dev/sda,使用/dev/sda2 作为GRUB --boot-directory。这将允许系统在没有安装NOS的情况下启动。
  5. 再次将GRUB安装到ONIE-BOOT 分区/dev/sda2。这有利于链式加载ONIE。

OS通常将GRUB第一阶段加载器安装到/dev/sda (对于GPT也在/dev/sda1)。GRUB配置和相关的文件安装到/dev/sda2,通常挂载为/boot。

另一个支持的选项是将GRUB第一阶段安装到分区中,如/dev/sda2。使用这种方法,您可以从NOS的GRUB菜单中链式加载ONIE。

在工厂安装时,ONIE安装程序将GRUB 第一阶段安装到/dev/sda和/dev/sda2中。其中/dev/sda中的GRUB第一阶段加载器是一次性的,安装GRUB时由NOS覆盖,一次性使用的一阶段加载只是第一次启动ONIE,然后有NOS安装程序接管。

这里的理念是安装的NOS拥有安装GRUB第一阶段/dev/sda MBR。ONIE拥有/dev/sda2中的所有内容。只要NOS程序保持/dev/sda2就可以。

对于GPT磁盘标签,ONIE-BOO分区类型GUID是7412F7D5-A156-4B13-81DC-867174929325。GUID 被gdisk及sgdisk工具识别。

最初的GRUB菜单如下所示:

     GNU GRUB  version 2.02~beta2+e4a1fe391
+--------------------------------+
|*ONIE: Install OS               |
| ONIE: Rescue                   |
| ONIE: Uninstall OS             |
| ONIE: Update ONIE              |
| ONIE: Embed ONIE               |
|                                |
|                                |
+--------------------------------+

4.3.1.3.NOS安装程序运行之后

接着上面的例子,我们看看NOS安装镜像需要做什么。NOS安装程序将创建分区并安装自己的GRUB版本(甚至可以是GRUB传统版本或LILO)。

例如,假设用户将CentOS安装到剩余的空闲空间中。

磁盘现在布局如下:

+============================+
|                            |
|  Sector LBA 0 aka MBR      |  <-- 1st stage boot loader in LBA-0.  Installed by CentOS
|                            |      during grub-install.  Loads additional code from
|  1st stage boot loader     |      /dev/sda1 and configuration from /dev/sda3.
|                            |
+============================+
|                            |
|  /dev/sda1 GRUB            |  <-- Additional data stored and used by GRUB for GPT disk
|                            |      labels.  Installed by CentOS during grub-install.
|  BIOS GRUB                 |      MSDOS partition type does not have this.
|                            |
+============================+
|                            |
|  /dev/sda2 ONIE-BOOT       |  <-- ONIE partition.  Untouched by the CentOS installer.
|                            |
|  ONIE Installs GRUB        |
|                            |
+============================+
|                            |
|                            |
/  /dev/sda3 CentOS          /  <-- CentOS partition.  Installed by CentOS.  Contains
|                            |      kernel, initramfs and GRUB configuration.
|                            |
+============================+

CentOS将其GRUB版本的第一阶段安装到/dev/sda,覆盖工厂安装的ONIE。
CentOS GRUB将引用/dev/sda3中的GRUB配置文件和模块。它不影响安装在/dev/sda2中的ONIE。

4.3.1.4.Chainloading and Selecting ONIE Mode

为了便于从NOS返回ONIE,NOS添加了一个GRUB菜单条目来链式加载ONIE。

在/etc/grub.d中提供的示例文件是onie/rootconf/x86_64/sysroot-lib-onie/50_onie_grub。
要选择在NOS中启动ONIE模式,使用ONIE提供的名为onie-boot-mode工具。

grub-reboot在这里很有用,可以在一次启动的时候重启链接加载ONIE,然后返回默认的GRUB菜单。

使用ONIE chainload菜单,GRUB菜单在重启之后如下:

  GNU GRUB  version 2.02~beta2+e4a1fe391
+---------------------------------+
|*CentOS 6.5-x86_64               |
| Memory test (memtest86+)        |
| ONIE                            |
|                                 |
----------------------------------+

安装GRUB及创建初始grub.cfg文件的操作在Demo OS installer中有展示。

以下是ONIE chainload GRUB菜单条目示例:

# Menu entry to chainload ONIE
menuentry ONIE {
        search --no-floppy --label --set=root ONIE-BOOT
        echo    'Loading ONIE ...'
        chainloader +1
}

这是一个脚本示例,在NOS环境下运行,可以将系统重新启动为ONIE应急模式:

#!/bin/sh

echo "Rebooting into ONIE rescue mode..."

grub-reboot ONIE
/mnt/onie-boot/onie/tools/bin/onie-boot-mode -q -o rescue

4.3.1.5.ONIE Boot Commands in GRUB Prompt

在ONIE GRUB提示符下有几个命令用于在各种模式下引导ONIE:

  • onie_install
  • onie_rescue
  • onie_uninstall
  • onie_update
  • onie_embed
  • diag_bootcmd

这些命令对于自动测试直接启动特定目标来说非常方便。

在执行该命令之前,通过在GRUB菜单页面中按c键输入GRUB提示符:

                    GNU GRUB  version 2.02~beta2+e4a1fe391
+----------------------------------------------------+
|*ONIE: Install OS                                   |
| ONIE: Rescue                                       |
| ONIE: Uninstall OS                                 |
| ONIE: Update ONIE                                  |
| ONIE: Embed ONIE                                   |
|                                                    |
|                                                    |
+----------------------------------------------------+

     Use the ^ and v keys to select which entry is highlighted.
     Press enter to boot the selected OS, `e' to edit the commands
     before booting or `c' for a command-line.

在GRUB提示符下,键入命令来启动所需的目标。以onie_rescue为例:

                     GNU GRUB  version 2.02~beta2+e4a1fe391
   Minimal BASH-like line editing is supported. For the first word, TAB
   lists possible command completions. Anywhere else TAB lists possible
   device or file completions. ESC at any time exits.

grub> onie_rescue

4.4.x86 Linux内核及集成

大多数x86平台都可以与ONIE x86内核协作,但是一些平台特定的修改可能是必要的。

4.4.1.内核修改

要为特定平台的内核添加支持,必须创建或修改以下Linux内核文件:

File Purpose
linux/drivers/platform/x86/vendor_machine.c 平台支持c文件。基本的初始化和重置。
linux/drivers/platform/x86/Kconfig 内核配置片段,允许选择新平台。
linux/drivers/platform/x86/Makefile Makefile片段,详细说明在选择平台时要编译的文件

平台特定的内核文件需要涉及的内容因平台而异。添加特定于平台的内核代码的一些常见原因:

  • 特殊的复位顺序,可能需要访问特定的CPLD
  • 将GPIO线路映射到特定的东西,如I2C多路复用器或前面板LED

生成的stg内核补丁存储在$MACHINE/kernel目录,这里放置的补丁将自动由构建系统应用。
有关如何创建stg补丁的信息,请参阅Patching ONIE Using stgit章节描述。

4.4.2.电路板EEPROM访问 -- onie-syseeprom

在x86平台上,使用onie-syseeprom来访问电路板上的EEPROM。命令行语法如下:

ONIE:/ # onie-syseeprom -h
Display and program the system EEPROM data block.
Usage: sys-eeprom [-h][-l] [-e] [-s <code>=<value>,...]
   With no arguments display the EEPROM contents.
   -h --help
      Display usage
   -l --list
      List the understood TLV codes and names.
   -e --erase
      Reset the EEPROM data.
   -g --get <code>
      Look up a TLV by code and write the value to stdout.
   -s --set <code>=<value>,<code>=<value>...
      Set a TLV code to a value.
      If no value, TLV is deleted.

有关EEPROM数据和可用TLV字段格式的更多信息,请参阅“电路板EEPROM信息格式”章节。

为了是这个工具能正常工具,每个平台必须定义如何访问EEPROM。每个平台至少需要在sys_eeprom_platform.h中定义如下内容:

SYS_EEPROM_SIZE       : size of usable eeprom
SYS_EEPROM_I2C_DEVICE : i2c-bus
SYS_EEPROM_I2C_ADDR   : address on the bus

以下内容也可以在这个文件中定义,未定义时将使用默认值:

SYS_EEPROM_MAX_SIZE : Total size of the eeprom
SYS_EEPROM_OFFSET   : offset from where the ONIE TLV header starts

更多详细信息,请参阅onie-syseeprom补丁onie/patches/i2ctools/i2ctools-sys-eeprom.patch。
在x86架构上,onie-sysinfo命令使用onie-syseeprom命令生成其输出的一部分。有关onie-sysinfo命令的信息,请参阅“系统信息”章节描述。

4.5.x86接口详细信息

本节介绍用于实现NOS接口的x86特定方法。参考“网络操作系统接口”章节获取更多NOS接口信息。

4.5.1.x86 NOS接口

在x86上,NOS和ONIE使用存储在ONIE-BOOT分区的GRUB环境变量进行通信。
ONIE提供了onie-boot-mode工具,NOS用于将ONIE引导设置为如下模式:

  • install
  • uninstall
  • rescue
  • update
  • embed
  • diag

完整的帮助信息如下:

ONIE:/ # onie-boot-mode -h
usage: onie-boot-mode [-o <onie_mode>] [-lhvq]
Get or set the default GRUB boot entry.  The default is to show
the current default entry.

COMMAND LINE OPTIONS
        -o
                Set the default GRUB boot entry to a particular "ONIE
                mode".  Available ONIE modes are:

                install   -- ONIE OS installer mode
                rescue    -- ONIE rescue mode
                uninstall -- ONIE OS uninstall mode
                update    -- ONIE self update mode
                embed     -- ONIE self update mode and embed ONIE
                diag      -- Hardware Vendor's Diagnostic
                none      -- Use system default boot mode

                Some platforms may offer additional modes.  Check with
                your hardware vendor.

                The 'none' mode will use the first ONIE boot menu entry.
        -l
                List the current default entry.  This is the default.
        -h
                Help.  Print this message.
        -q
                Quiet.  No printing, except for errors.
        -v
                Be verbose.  Print what is happening.

该工具位于ONIE-BOOT分区onie/tools/bin/onie-boot-mode目录下。NOS可以使用磁盘卷标签ONIE-BOOT方便地安装ONIE-BOOT分区,例如,以下命令将ONIE-BOOT分区挂载到Linux文件系统上:

NOS:/ # mkdir /mnt/onie-boot
NOS:/ # mount LABEL=ONIE-BOOT /mnt/onie-boot

此后,可以在文件下使用这个工具了:

NOS:/ # /mnt/onie-boot/onie/tools/bin/onie-boot-mode

该工具是grub-editenv命令的一个简单包,它将onie_mode变量设置为所需的值。

4.5.1.1.x86 NOS安装程序镜像

X86上NOS安装程序的主要职责是:

  • 创建分区并格式化文件系统
  • 安装NOS软件到新分区
  • 安装GRUB到MBR
  • 设置其GRUB配置

安装GRUB并设置GRUB配置是这里描述的最重要的部分。

X86传统BIOS引导加载程序(GRUB2)部分介绍了安装GRUB和设置GRUB的步骤。
所提供的Demo OS Installer也将执行本节中所介绍的所有步骤。

在随后的章节中,对NOS做出如下假设:

  1. NOS是基于Linux的
  2. NOS在/mnt/onie-boot 上挂载了ONIE-BOOT 分区读写
  3. NOS创建了一个GRUB菜单,名为ONIE
  4. NOS具有grub-reboot 命令可用

grub-reboot命令允许NOS的GRUB启动一次ONIE chainload入口,一次启动之后,NOS的GRUB将恢复到默认的NOS GRUB菜单项。

4.5.1.2.x86重装或安装其他NOS

为了调用安装操作,NOS运行以下命令:

NOS:/ # grub-reboot ONIE
NOS:/ # /mnt/onie-boot/onie/tools/bin/onie-boot-mode -o install

有关NOS重装程序接口的信息,请参阅“重装或安装其他NOS”章节描述。

4.5.1.3.x86 NOS卸载

为了调用卸载操作系统操作,NOS运行如下命令:

NOS:/ # grub-reboot ONIE
NOS:/ # /mnt/onie-boot/onie/tools/bin/onie-boot-mode -o uninstall

在卸载流程之后,系统返回到发现和安装阶段。
有关NOS卸载的更多信息,请参阅“NOS卸载”章节描述。

4.5.1.4.x86应急和恢复

为了调用应急操作,NOS执行如下命令:

NOS:/ # grub-reboot ONIE
NOS:/ # /mnt/onie-boot/onie/tools/bin/onie-boot-mode -o rescue

4.5.1.5.x86更新及嵌入ONIE

在x86上,更新操作和嵌入操作有所区别。

嵌入操作是破坏性的,将会擦除一切(包括任何安装的NOS)并安装新版本的ONIE。通常这是在客户收到产品之前在制造就完成的。

更新操作不具有破坏性,此操作只会更新ONIE-BOOT分区。通常,在现场使用这个来跟新当前的ONIE版本,同时保持安装的NOS不变。

要调用更新操作,NOS将运行以下命令:\

NOS:/ # grub-reboot ONIE
NOS:/ # /mnt/onie-boot/onie/tools/bin/onie-boot-mode -o update

要调用嵌入操作,NOS将运行以下命令:

NOS:/ # grub-reboot ONIE
NOS:/ # /mnt/onie-boot/onie/tools/bin/onie-boot-mode -o embed

有关NOS更新接口的更多信息,请参阅“更新及嵌入ONIE”章节描述。

4.5.2.x86硬件诊断接口[可选]

本节介绍为x86平台提供的硬件诊断方法。有关硬件诊断的更多信息,请参阅“硬件诊断”章节描述。

安装诊断程序该像安装NOS一样。使用NOS安装程序机制将诊断程序镜像安装到其自己的分区中,这将允许硬件供应商独立于ONIE更新诊断程序镜像。

所有在本节中指定的要求都由ONIE源码附带的Demo Diag OS说明。更多详细信息,请参阅“Demo Diagnostic OS Installer”章节。

4.5.2.1.磁盘分区

诊断镜像驻留在磁盘分区中,本节介绍磁盘分区的属性。

4.5.2.1.1.GPT分区表

基于GPT的设备上的诊断镜像安装程序必须执行如下操作:

  • 命名诊断分区为 <SOMETHING>-DIAG。参考 sgdisk 程序及 --change-name 选项获取更多信息。其中 <SOMETHING> 可以是硬件提供商有意义的任意字符串。
  • 设置GPT system partition 属性位(bit 0)。参考 sgdisk 程序及 --attributes选项。
  • 在诊断分区上创建文件系统时,将文件系统标签设置为 <SOMETHING>-DIAG,与用于GPT诊断分区标签的字符串相同,参考 mkfs.ext4 程序及 -L 选项。

-DIAG后缀和系统分区位通告内ONIE和NOS安装程序,这些分区很重要,不应该被修改。
ONIE卸载操作不能删除或修改满足上述要求的分区。
ONIE标准的NOS不能删除或修改满足上述要求的分区。

4.5.2.1.2.MSDOS分区表

对于使用MSDOS分区表的设备,我们只能用文件系统标签。在diag分区上创建文件系统时,将文件系统标签设置为<SOMETHING>-DIAG. 以mkfs.ext4 程序及 -L 选项为例。
ONIE卸载操作不能删除或修改满足上述需求的分区。
ONIE标准的NOS不能删除或修改满足上述要求的分区。

4.5.2.2.GRUB注意事项

安装诊断镜像时,将GRUB安装到MBR中,就像正常的操作系统一样。
此外,将GRUB也安装到diag分区,这样允许NOS以chainload的方式来启动diag OS。

Diag分区的grub.cfg文件必须包含diag OS所需的所有GRUB菜单条目,以及一个chainload ONIE条目。

对于2015.11之前的ONIE版本,诊断镜像会将GRUB安装到MBR中。之后更高级的ONIE不再推荐将GRUB安装到MBR中。

如果诊断镜像安装在早期版本中,则只应该将GRUB安装在诊断分区中,而不要将ONIE设置为默认菜单条目。这使得ONIE和diag OS上的GRUb之间的启动顺序是固定的。

如果诊断镜像安装在2015.11之后的新版本中,则不应将GRUB同时安装到MBR和diag分区。更高版本支持diag安装程序提供的启动命令。此功能使ONIE与诊断操作系统共享GRUB。即diag没有自己的GRUB实例和grub.cfg。要启用该功能,需要修改diag安装程序以满足该功能。请参考ONIE 2016.02中的Demo Diag OS。

4.6.x86初始安装和恢复

在具有空白硬盘驱动设备的机器上安装ONIE会带来一些挑战。传统的操作系统安装技术被用来克服这一点。

4.6.1.PXE网络安装

如何配置特定的PXE引导将不在本文中描述。但是,ONIE构建系统会生成合适于PXE引导的内核和initramfs镜像。

recovery-initrd Makefile目标生成一个ONIE initrd,其中还包含一个ONIE更新程序镜像。
假设您已经设置了PXE引导,几个内核命令行选项可以帮助自动安装ONIE:

  • boot_env=recovery
  • boot_reason
  • install_url

boot_env=recovery参数告诉正在运行的ONIE系统磁盘没有格式化,这使得ONIE不会尝试挂载任何分区。

boot_reason变量可以采用任何ONIE启动模式,但这里游泳的是rescueand embed。
使用boot_reason=rescue您可以引导到系统中,并手动使用onie-self-update -e /lib/onie/onie-updater命令来嵌入recovery-initrd中包含的ONIE镜像。

要嵌入ONIE,需要onie-self-update命令的-e选项。嵌入操作将分区和格式化磁盘。
对于自动嵌入操作,请设置boot_reason=embed及install_url=file:///lib/onie/onie-updater。当ONIE启动时,它将自动开始嵌入recovery-initrd中包含的ONIE镜像。
您也可以将install_url设置为任何有效的URL。例如,您可以将它指向HTTP服务器上的ONIE更新镜像。

4.6.2.USB 安装

对于有能力的机器,从USB安装是一个更方便的选择。如何配置单个机器从USB启动不在这里描述。

第一步是创建一个适合安装在USB存储器上的ISO镜像,构建recovery-iso Makefile target。
recovery-iso镜像也可以用来从CD-ROM启动。

下一步是使用dd命令从Linux工作站将ISO拷贝到USB设备中。
这将删除USB设备的内容。
还要确保你使用正确的/dev/sdX否则你将清除Linux工作站。
在将U盘插入之后,您可以通过多dmesg命令找到正确的/dev/sdX。
使用dd命令将ISO拷贝到USb设备的操作:

$ sudo dd if=onie-recovery-x86_64-<machine>-r0.iso of=/dev/sdX bs=10M

USB设备现在已经准备好了。

当系统起机时你将看到如下菜单:

+------------------------------------------+
|            ONIE Installer                |
|                                          |
|  ONIE: Rescue                            |
|  ONIE: Embed ONIE                        |
|                                          |

您可以通过编辑onie/build-config/recovery/syslinux.cfg文件来定制内核命令行参数。请参阅上面有关使用 install_urlkernel参数的注释。

4.7.x86虚拟设备

ONIE发行版附带一个基于KVM的虚拟机。
有关使用虚拟机的更多信息,请参阅ONIE源码树说明。这些指令位于源码onie/machine/kvm_x86_64/INSTALL目录下。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容

  • 转载声明:本文虽然不是本人100%原创,但也是辛辛苦苦整理的,可以转载,但请注明出处 这篇文章是关于折腾Windo...
    SOMCENT阅读 7,997评论 3 37
  • tags: Linux OS GRUB 硬盘分区 背景 2016年双十一入手了一块500G的 SSD(Solid ...
    CntChen阅读 11,073评论 2 20
  • 从Intel 6系列主板之后,就开始提供UEFI BIOS支持,正式支持GPT硬盘分区表,一举取代了此前的MBR分...
    DecadeHeart阅读 1,687评论 0 1
  • 先读一下前面这段话,以决定是否要看下去: 这是写给纯小白的Arch Linux安装步骤。Arch的可配置自由度太高...
    沉沦的菩提阅读 31,399评论 73 193
  • 安装教程 前期准备 安装介质 在安装之前我们先要准备一个安装介质,在这里只推荐U盘作为安装介质。 到https:/...
    Otis4631阅读 5,424评论 0 5