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安装程序镜像将执行如下操作:
- 在磁盘上创建一个空的GPT分区表
- 用适当的GPT分区类型GUID和FAT32文件系统创建ESP
- 将ESP挂载在传统的挂载点上: /boot/efi
- 在ESP上创建需要的EFI目录如/boot/efi/EFI
- 使用释放的GPT分区类型GUID创建ONIE-BOOT 分区
- 将ONIE-BOOT分区挂载到/mnt/onie-boot
- 安装ONIE kernel + initramfs到ONIE-BOOT 分区
- 安装UEFI版本的GRUB到/boot/efi/EFI/onie/grubx64.efi
- 安装GRUB模块和GRUB配置文件到/mnt/onie-boot/grub
- 为/boot/efi/EFI/onie/grubx64.efi创建新的UEFI Boot#### 引导条目
- 修改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安装程序执行如下操作:
- 为NOS运行时文件创建分区及文件系统
- 将NOS文件(kernels,、initramfs等) 安装到分区中
- 安装UEFI引导程序到/boot/efi/EFI/<NOS>/<NOS loader image>
- 为/boot/efi/EFI/<NOS>/<NOS loader image>创建新的UEFI Boot#### 引导条目
- 修改UEFI BootOrder 变量使得首先引导NOS
- 对于基于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的过程需要分成两步:
- 配置系统在下一次启动时进入ONIE
- 配置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安装程序镜像执行如下操作:
- 按照“HDOS磁盘分区”描述创建磁盘分区和文件系统
- 将HDOS文件(kernels, initramfs, diagnostic programs, etc) 安装到-DIAG分区中
- 安装UEFI引导程序到/boot/efi/EFI/<HDOS>/<HDOS loader image>
- 为/boot/efi/EFI/<HDOS>/<HDOS loader image>创建新的UEFI Boot####条目
- 添加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 参考文档
- UEFI Home Page
- GUID Partition Table
- UEFI boot: how does that actually work, then?
- Demystifying UEFI, the long-overdue BIOS replacement
- The EFI System Partition and the Default Boot Behavior
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安装程序执行如下操作:
- 由于磁盘空白,我们正在嵌入ONIE,需要创建分区表。安装程序创建以一个磁盘标签(根据计算机配置,可能是msdos 或 gpt),本例默认使用 gpt。
- 创建所需的分区(gpt两个,如是 msdos则创建一个)。两种情况都需要创建ONIE-BOOT 分区。
- 安装ONIE kernel+initramfs到ONIE-BOOT 分区。
- 安装GRUB到/dev/sda,使用/dev/sda2 作为GRUB --boot-directory。这将允许系统在没有安装NOS的情况下启动。
- 再次将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做出如下假设:
- NOS是基于Linux的
- NOS在/mnt/onie-boot 上挂载了ONIE-BOOT 分区读写
- NOS创建了一个GRUB菜单,名为ONIE
- 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目录下。