通常我们linux的启动遵循以下顺序:
uefi/bios固件加载boot程序–>读取boot配置(grub.cfg或extlinux.cfg等)–>根据配置里和面指定的内核和initrd程序,加载对应的内核和initrd程序–>内核执行initrd里面的init进程,加载必须的驱动,挂载真正的文件系统等。
nvidia官网的启动流程:

bios系统和efi系统有些区别:
BIOS启动流程
开机 → BIOS初始化 → POST自检 → 按照启动顺序读取第一个可启动设备的MBR → 加载MBR中的引导加载程序(如GRUB) → 引导加载程序加载内核 → 启动操作系统。
UEFI启动流程
开机 → UEFI初始化 → 加载EFI驱动程序 → 读取EFI系统分区(ESP)中的启动加载器(如GRUB的EFI版本) → 启动加载器加载内核 → 启动操作系统。
nvida的orin agx就是使用extlinux的配置,并且有独立的esp分区,采用uefi启动的方案,并且做了双esp分区冗余。
这里有几个需要注意的点:
(1)如果我更新了boot程序,刷写了esp_alt的备份分区,想让下一次启动加载esp_alt备份分区的boot程序,应该怎么做?
这个通常是通过efibootmgr来进行管理,开机通过esc/f11进入boot选项界面也可以选择
(2)efi启动程序如何生成?
在nvdia官网记录了efi程序生成,编译的详细内容:https://docs.nvidia.com/jetson/archives/r38.2/DeveloperGuide/SD/Bootloader/UEFI.html
内核如何生成与更新:
nvdia的内核提供了开源代码可以自行编译生成以及更新,更新后放置到文件系统对应目录一块刷写或刷写独立内核分区即可
initrd 的工作流程
启动序列
BIOS/UEFI → 引导程序 (GRUB/extlinux)引导程序 → 加载内核 (vmlinuz) 和 initrd内核解压 initrd 到内存中内核执行 initrd 中的 /init 脚本init 脚本执行:
加载必要的内核模块扫描硬件设备挂载真正的根文件系统
切换到真正的根文件系统执行真正的 init 进程 (systemd/SysVinit)启动完整的系统
initrd使用initramfs管理,是通过 mkinitramfs 或 dracut 工具创建的一个临时根文件系统,包含挂载真实根文件系统所需的驱动和工具。
orin agx有划分独立内核分区,但通常并没有使用该独立内核分区,而是将内核和文件系统存放到一块,放到了/boot目录下,通常走的模式也是extlinux模式。
官方提供的刷写脚本内部流程:
9. 生成分区表
10. 编译 UEFI 和内核
11. 创建各个分区镜像
12. 刷写到设备
会帮我们把所有步骤都做了,如果是升级的时候要独立升级bootloader或内核或文件系统,对于esp,则多分区刷写,对于内核,如果使用多分区,也刷写冗余分区切换即可,如果与文件系统在一块,则根据文件系统刷写即可
附 syslinux,extlinux,uboot的一个简单对比:
SYSLINUX:
是一个用于从 FAT 文件系统(如USB驱动器)启动 Linux 的引导加载程序集合。
主要包括:SYSLINUX(用于FAT)、ISOLINUX(用于CD/DVD)、PXELINUX(用于网络启动)和EXTLINUX(用于EXT文件系统)。
设计简单,配置文件通常为syslinux.cfg。
EXTLINUX:
是 SYSLINUX 项目的一部分,专门用于从 ext2/3/4 文件系统启动。
它使用和 SYSLINUX 相同的配置文件格式(但通常命名为extlinux.conf)。
在嵌入式系统或某些特定场景下,EXTLINUX 可以被用作引导加载程序。
U-Boot:
全称 Universal Boot Loader,是一个开源的、主要用于嵌入式系统的引导加载程序。
支持多种架构(如ARM、PowerPC、MIPS等),具有丰富的功能。
通常用于嵌入式设备,如路由器、单板计算机(包括NVIDIA Orin AGX)等。
可以引导Linux、Android、VxWorks等操作系统。
















暂无评论内容