主流Bootloader对比:U-Boot、GRUB、LILO、systemd-boot的特点与适用场景

做嵌入式这些年,我接触过的Bootloader少说也有七八种。每次新项目选型,团队里总会争论一番——到底用哪个?

说实话,没有绝对的“最好”,只有“最合适”。今天我把四个主流选手拉出来遛遛:U-Boot、GRUB、LILO、systemd-boot。咱们从实战角度看看,它们各自擅长什么,又该在什么场景下选谁。

一、U-Boot:嵌入式领域的“瑞士军刀”

U-Boot(全称Das U-Boot)是嵌入式Linux世界的事实标准。我最早接触它是在一个ARM9的项目上,那时候它还只支持PowerPC和ARM,现在你看看——RISC-V、MIPS、x86,几乎全覆盖了。

核心定位:通用引导程序,专为嵌入式系统设计,支持多种架构和硬件平台。

特点一览

  • 硬件支持极广:ARM、x86、MIPS、PowerPC、RISC-V……你能想到的主流架构它都支持
  • 驱动模型完善:自带大量外设驱动(网卡、存储、串口、Flash),不需要依赖内核
  • 交互式命令行:启动时按任意键进入U-Boot Shell,可以手动加载内核、修改环境变量
  • 网络引导能力:支持TFTP、NFS、DHCP,开发阶段非常方便
  • 环境变量机制:所有配置参数存储在Flash或EEPROM中,运行时动态修改

适用场景

场景 推荐度 说明
ARM/RISC-V嵌入式产品 ★★★★★ 几乎是最佳选择,社区支持最强
FPGA+ARM异构平台 ★★★★☆ 支持设备树,方便描述复杂硬件拓扑
工业控制、IoT网关 ★★★★☆ 稳定可靠,经过大量量产验证
x86嵌入式系统 ★★★☆☆ 能用,但不如GRUB生态成熟

我的经验:U-Boot的环境变量是个双刃剑。我曾经在一个量产项目上,因为Flash坏块导致环境变量丢失,整批设备变砖。后来我强制在代码里加了环境变量备份机制,再也没出过问题。

二、GRUB:PC和服务器领域的“老大哥”

GRUB(GRand Unified Bootloader)是Linux桌面和服务器上最常见的Bootloader。你装Ubuntu、CentOS、Debian,默认就是它。GRUB有两个主要版本:GRUB Legacy(0.97)和GRUB 2(目前主流)。

我个人习惯用GRUB 2,它的模块化设计比老版本强太多了。

特点一览

  • 支持多操作系统启动:Linux、Windows、BSD……通过链式加载实现
  • 文件系统驱动丰富:可以直接读取ext4、Btrfs、XFS、NTFS等分区中的内核和配置文件
  • 动态配置生成:update-grub命令自动扫描系统,生成启动菜单
  • 脚本化配置:/etc/default/grub + /etc/grub.d/ 目录,灵活定制启动行为
  • 救援模式:启动失败时提供命令行Shell,手动指定内核和参数

适用场景

场景 推荐度 说明
Linux桌面/工作站 ★★★★★ 默认标配,用户友好
服务器(x86_64) ★★★★★ 稳定、功能全面,支持RAID/LVM
双系统启动 ★★★★☆ 自动识别Windows分区,菜单选择方便
嵌入式x86系统 ★★★☆☆ 功能过剩,体积偏大

注意:GRUB 2的配置文件语法和GRUB Legacy完全不同。如果你从老版本迁移,千万别直接复制menu.lst——我见过有人这么干,结果系统起不来,折腾了一下午。

三、LILO:曾经的经典,如今已退场

LILO(LInux LOader)是Linux早期最流行的Bootloader。我记得2000年初那会儿,装Red Hat Linux 7.3,默认就是LILO。但现在嘛……说实话,除非你在维护古董级系统,否则基本碰不到了。

特点一览

  • 极简设计:核心代码非常小,只有几十KB
  • 不依赖文件系统:直接读取磁盘的绝对扇区位置
  • 配置静态:修改配置后必须重新运行/sbin/lilo写入MBR
  • 不支持网络引导:也没有交互式命令行

为什么被淘汰?

说白了,LILO的设计太“原始”了。每次修改内核或配置,都得重新写MBR。而且它不认识文件系统——你移动了内核文件的位置,它就找不到了。GRUB 2出现后,LILO基本就退出了历史舞台。

现状:LILO已经停止维护多年。除非你在维护2005年以前的系统,否则不建议使用。

四、systemd-boot:UEFI时代的“轻量级选手”

systemd-boot(原名gummiboot)是systemd家族的一员,专门为UEFI系统设计。它不依赖BIOS的MBR机制,直接使用UEFI固件的引导服务。我最近几个新项目都开始用这个,原因很简单——简单、干净、快。

特点一览

  • 极简配置:配置文件是纯文本,放在/boot/loader/entries/目录下
  • 原生UEFI支持:直接加载EFI可执行文件(.efi),不需要链式加载
  • 安全启动兼容:支持UEFI Secure Boot,签名验证
  • 启动速度快:代码量小,初始化流程短
  • 与systemd集成:可以通过bootctl命令管理,和systemd生态无缝配合

适用场景

场景 推荐度 说明
UEFI-only的x86_64系统 ★★★★★ 原生支持,配置简单
Arch Linux、Fedora等现代发行版 ★★★★☆ 社区支持好,文档完善
嵌入式UEFI系统 ★★★★☆ 轻量、可控,适合定制
需要安全启动的场景 ★★★★☆ 原生支持签名验证

我的建议:如果你用的是纯UEFI系统,没有Legacy BIOS兼容需求,systemd-boot绝对值得一试。它的配置文件比GRUB简单太多了——一个.conf文件就搞定,不用学复杂的脚本语法。

五、横向对比:一张表看懂

特性 U-Boot GRUB 2 LILO systemd-boot
架构支持 ARM/x86/RISC-V/MIPS等 x86/x86_64为主 x86 x86_64 (UEFI)
固件依赖 BIOS/UEFI/裸机 BIOS/UEFI BIOS UEFI only
文件系统支持 有限(ext2/FAT) 丰富(ext4/Btrfs/XFS/NTFS) 不支持 仅FAT (ESP分区)
网络引导 支持(TFTP/NFS) 支持(PXE) 不支持 不支持
交互式Shell 强大 中等 无 有限
配置复杂度 中等 较高 低 低
代码体积 中等(~500KB) 较大(~2MB) 极小(~50KB) 小(~200KB)
维护状态 活跃 活跃 停止 活跃

六、选型决策:我该用哪个?

这个问题没有标准答案,但我可以给你一个实用的判断流程:

  1. 先看硬件架构:ARM/RISC-V?直接选U-Boot。x86?继续往下看。
  2. 再看固件类型:纯UEFI?systemd-boot优先。Legacy BIOS或兼容模式?GRUB 2。
  3. 然后看需求:需要网络引导?U-Boot或GRUB。需要多系统启动?GRUB。需要安全启动?systemd-boot。
  4. 最后看团队:团队熟悉哪个就用哪个——再好的Bootloader,没人会用也是白搭。

避坑提醒:我曾经在一个项目上,硬件团队选了UEFI固件,软件团队却坚持用GRUB的Legacy模式。结果两边折腾了两周,才发现UEFI固件根本没开启CSM兼容模块。嗯,选型之前,先和硬件团队对齐固件配置。

七、知识体系总览

下面这张图把四个Bootloader的核心关系画出来了,方便你快速建立整体认知:

主流Bootloader对比知识体系 主流Bootloader对比知识体系 Bootloader选型 U-Boot GRUB 2 LILO systemd-boot 适用场景 ARM/RISC-V嵌入式 网络引导开发 多架构支持 适用场景 Linux桌面/服务器 多系统启动 RAID/LVM支持 适用场景 古董级系统维护 极简环境 已停止维护 适用场景 UEFI-only系统 安全启动 轻量快速 选型核心:硬件架构 → 固件类型 → 功能需求 → 团队能力 没有最好的Bootloader,只有最合适的

这张图把四个Bootloader的定位和适用场景串起来了。你可以把它当作选型时的快速参考——从中心出发,根据你的硬件和需求,找到对应的分支。