主流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) |
| 维护状态 | 活跃 | 活跃 | 停止 | 活跃 |
六、选型决策:我该用哪个?
这个问题没有标准答案,但我可以给你一个实用的判断流程:
- 先看硬件架构:ARM/RISC-V?直接选U-Boot。x86?继续往下看。
- 再看固件类型:纯UEFI?systemd-boot优先。Legacy BIOS或兼容模式?GRUB 2。
- 然后看需求:需要网络引导?U-Boot或GRUB。需要多系统启动?GRUB。需要安全启动?systemd-boot。
- 最后看团队:团队熟悉哪个就用哪个——再好的Bootloader,没人会用也是白搭。
避坑提醒:我曾经在一个项目上,硬件团队选了UEFI固件,软件团队却坚持用GRUB的Legacy模式。结果两边折腾了两周,才发现UEFI固件根本没开启CSM兼容模块。嗯,选型之前,先和硬件团队对齐固件配置。
七、知识体系总览
下面这张图把四个Bootloader的核心关系画出来了,方便你快速建立整体认知:
这张图把四个Bootloader的定位和适用场景串起来了。你可以把它当作选型时的快速参考——从中心出发,根据你的硬件和需求,找到对应的分支。