LILO(Linux 加载器)是什么?架构、配置及与 GRUB 的比较
LILO(Linux Loader)是适用于Linux和类Unix操作系统的传统引导加载程序,它直接从安装时存储的磁盘地址加载内核,无需在引导序列期间提供文件系统驱动程序支持。它在操作系统前阶段运行——从主引导记录(MBR)或分区引导扇区——并在将Linux内核加载到内存后将CPU控制权移交给它。
对于当今大多数生产系统,LILO已被GRUB2取代。然而,了解其内部机制对于维护遗留基础设施、嵌入式系统或隔离服务器的工程师来说仍然至关重要,在这些环境中,最小化、确定性的引导加载程序是一种经过深思熟虑的架构选择。
LILO引导过程的底层工作原理
当机器开机时,BIOS执行POST(开机自检),然后读取可引导磁盘的前512字节——即MBR。如果LILO安装在那里,这512字节包含LILO的第一阶段加载程序。序列展开如下:
- 第一阶段(MBR代码):BIOS将MBR中的512字节加载到地址`0x7C00`处的内存中,并将执行权转移给它。这个微小的存根只知道一项工作:定位并加载第二阶段。
- 第二阶段(映射文件):LILO读取其映射文件(`/boot/map`),该文件在安装时由`lilo`命令写入。此映射包含每个内核镜像和链式加载程序条目的绝对磁盘块地址。此处不进行文件系统解析——LILO使用原始LBA/CHS扇区地址。
- 引导菜单显示:如果在`lilo.conf`中设置了`prompt`,LILO将显示文本菜单。`timeout`指令控制在默认启动前等待的时间。
- 内核加载:LILO从预先计算的磁盘地址将内核镜像读取到低内存中,然后解压缩并重新定位它。
- 控制权移交:LILO将内核命令行参数和初始RAM磁盘(`initrd`)位置传递给内核,内核接管硬件初始化。
关键架构含义:由于LILO在安装时对绝对磁盘块地址进行编码,对内核文件、分区布局或`lilo.conf`的任何更改都需要重新运行`/sbin/lilo`以重新生成映射。在内核更新后忘记此步骤是LILO引导失败最常见的单一原因。
LILO配置:深入了解`/etc/lilo.conf`
LILO完全通过`/etc/lilo.conf`进行配置。以下是一个具有代表性的生产示例,附有注释,涵盖原始文档经常遗漏的选项:
“`ini
Global section
boot=/dev/sda # Install LILO to the MBR of /dev/sda
map=/boot/map # Path to the map file (must be on a non-LVM, non-RAID partition)
install=/boot/boot.b # Second-stage boot loader binary
prompt # Always show the boot menu
timeout=100 # Wait 10 seconds (units are 1/10th of a second)
default=linux-stable # Default entry label
lba32 # Enable LBA32 addressing — critical for disks > 8 GB
compact # Merge adjacent read requests; speeds up boot on HDD
Linux kernel entry
image=/boot/vmlinuz-5.4.0
label=linux-stable
initrd=/boot/initrd.img-5.4.0
root=/dev/sda1
read-only # Mount root read-only initially; fsck runs before remount rw
append="quiet splash"
Fallback kernel entry
image=/boot/vmlinuz-4.19.0
label=linux-fallback
initrd=/boot/initrd.img-4.19.0
root=/dev/sda1
read-only
Chain-load Windows from a second partition
other=/dev/sda2
label=windows
table=/dev/sda # Partition table to pass to the Windows bootloader
“`
每次编辑后,使用以下命令应用更改:
“`bash
sudo /sbin/lilo -v
“`
`-v`标志启用详细输出,显示正在映射的每个内核和链式加载程序条目。始终验证退出代码——非零返回值意味着映射未成功写入。
常被忽略的配置参数
- `lba32`:在大于8 GB的磁盘上,如果没有此指令,LILO将回退到CHS寻址,并且无法定位超过8 GB边界的内核。这是一种静默失败模式,已在遗留硬件上导致无数生产中断。
- `compact`:通过合并相邻扇区读取来减少旋转磁盘上的引导时间。与某些软盘引导场景不兼容。
- `vga=`:向内核传递视频模式参数。适用于无头服务器,您希望在控制台中使用特定帧缓冲区分辨率。
- `append=`:传递任意内核命令行参数。等同于GRUB的`linux`行参数。
- `password=`:使用密码限制特定条目的引导。请注意,此密码以明文形式存储在`lilo.conf`中,因此文件权限(`chmod 600`)是强制性的。
LILO安装场景
安装到MBR
“`bash
Verify the target device
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT
Install LILO to MBR of /dev/sda
sudo /sbin/lilo -b /dev/sda
“`
安装到分区引导扇区
当使用System Commander等引导管理器时,您可能希望将LILO安装在分区的引导扇区而不是MBR上:
“`ini
boot=/dev/sda1 # Install to partition boot sector, not MBR
“`
当LILO被另一个引导加载程序链式加载时,这也是正确的方法。
删除LILO
要恢复原始MBR(例如,在替换为GRUB之前):
“`bash
Overwrite MBR with a generic boot sector, preserving the partition table
sudo dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda bs=440 count=1
“`
切勿在完整MBR上使用`dd if=/dev/zero`——它将破坏分区表。
LILO与GRUB:技术比较
下表涵盖了系统管理员在两者之间进行选择时最重要的维度,包括大多数比较中缺少的几个细微差别:
| 功能 | LILO | GRUB2 |
|---|
| — | — | — |
|---|
| **文件系统感知** | 无——使用原始磁盘块地址 | 完全支持ext2/3/4、XFS、Btrfs、ZFS、FAT、NTFS |
|---|
| **配置应用方法** | 每次更改后必须运行`/sbin/lilo` | 在引导时动态读取`grub.cfg` |
|---|
| **内核更新处理** | 需要手动重新运行;容易忘记 | `update-grub` / `grub-mkconfig`自动化此过程 |
|---|
| **引导参数编辑** | 引导时不可编辑 | 引导菜单处的交互式编辑器(按`e`) |
|---|
| **UEFI支持** | 否 | 是(GRUB2支持UEFI安全启动) |
|---|
| **GPT分区表** | 有限/不可靠 | 完全支持 |
|---|
| **磁盘大小限制** | 不使用`lba32`时为8 GB;使用时实际上无限制 | 无实际限制 |
|---|
| **网络引导(PXE)** | 否 | 是(通过`grub-efi`和tftp模块) |
|---|
| **救援/恢复模式** | 无内置功能 | 内置救援shell |
|---|
| **配置中的脚本** | 否 | 是(`grub.cfg`中类bash脚本) |
|---|
| **Initrd/initramfs支持** | 是 | 是 |
|---|
| **多操作系统检测** | 仅手动条目 | `os-prober`自动检测已安装的操作系统 |
|---|
| **二进制大小/占用空间** | 非常小(约20 KB) | 较大(含模块约1–4 MB) |
|---|
| **活跃开发** | 已停止维护(最后发布于2015年) | 积极维护中 |
|---|
| **安全启动** | 否 | 是(通过shim + 签名GRUB) |
|---|
生产系统建议:对于运行内核版本约3.x以上、使用GPT、UEFI、LVM或软件RAID的任何系统,GRUB2是正确的选择。LILO今天的价值主张仅限于嵌入式或遗留环境,在这些环境中,其确定性、文件系统无关的加载模型是一种优势而非负担。
LILO仍然是正确工具的场景
尽管年代久远,LILO在特定场景中仍然适用:
- 嵌入式Linux系统,其中引导加载程序占用空间必须低于32 KB,且内核位置从不更改。
- 遗留硬件(2000年前),其中GRUB2模块超出可用内存,或BIOS与GRUB的阶段加载存在兼容性问题。
- 取证和恢复环境,其中已知良好的最小引导加载程序优于具有脚本功能的复杂引导加载程序。
- 隔离系统,其中LILO平面配置模型的简单性和可审计性减少了攻击面。
- 教育目的——LILO的源代码和引导序列比GRUB2简单得多,使其成为操作系统内部课程的优秀教学素材。
对于任何现代部署——无论您是在配置VPS托管环境、配置独立服务器,还是在共享虚拟主机上搭建开发环境——GRUB2都是默认且正确的引导加载程序选择。
常见LILO故障模式与诊断
了解LILO的错误代码对于恢复至关重要。LILO在引导期间打印`LILO`的部分字符串以指示进度:
| 已打印字符 | 已到达阶段 | 可能的故障原因 |
|---|
| — | — | — |
|---|
| _(无内容)_ | MBR未加载 | BIOS未找到可引导设备 |
|---|
| `L` | 第一阶段已加载 | 加载第二阶段时出错;映射文件路径错误 |
|---|
| `LI` | 第二阶段已加载 | 第二阶段二进制文件不兼容或已损坏 |
|---|
| `LIL` | 映射文件已找到 | 映射文件损坏或地址错误 |
|---|
| `LIL?` | 映射文件已加载 | 从错误地址加载了映射文件 |
|---|
| `LILO` | 完全加载 | 引导菜单显示成功 |
|---|
恢复程序
如果LILO在内核更新后无法引导:
- 从Live CD或救援环境引导。
- 挂载根分区:`mount /dev/sda1 /mnt`
- Chroot:`chroot /mnt`
- 验证`/etc/lilo.conf`指向正确的内核路径。
- 重新运行:`/sbin/lilo -v`
- 重新启动。
如果映射文件本身已损坏,您可能需要重新安装`lilo`软件包以恢复`/boot/boot.b`,然后再重新运行该命令。
安全注意事项
LILO早于现代固件安全模型,存在几个重要限制:
- 不支持安全启动:LILO无法参与UEFI安全启动信任链。在需要固件完整性验证的系统上,带有签名shim的GRUB2是强制性的。
- 密码保护弱点:`lilo.conf`中的`password=`指令以明文形式存储凭据。严格限制文件权限(`chmod 600 /etc/lilo.conf`,由root拥有)。
- 物理访问漏洞:在没有BIOS/UEFI密码的情况下,具有物理访问权限的攻击者可以从外部媒体引导并完全绕过LILO。
- 无TPM集成:与带有适当模块的GRUB2不同,LILO无法执行可信引导或与TPM交互进行证明。
对于磁盘加密、可信引导或远程证明是安全架构一部分的服务器——例如带cPanel的VPS或加固的独立服务器——这些限制使LILO不适用。
从LILO迁移到GRUB2
如果您正在维护仍运行LILO的遗留系统并需要迁移:
“`bash
1. Install GRUB2
sudo apt-get install grub2 # Debian/Ubuntu
sudo yum install grub2-tools # RHEL/CentOS
2. Install GRUB2 to MBR
sudo grub-install /dev/sda
3. Generate GRUB configuration
sudo update-grub # Debian/Ubuntu
sudo grub2-mkconfig -o /boot/grub2/grub.cfg # RHEL/CentOS
4. Verify the new configuration
sudo grep -i menuentry /boot/grub/grub.cfg
5. Reboot and confirm GRUB2 loads
sudo reboot
“`
在确认GRUB2成功引导之前,请勿删除`lilo`软件包。在迁移期间保留一个Live救援USB可用。
如果您的服务器使用与引导加载程序交互的VPS控制面板(例如,用于内核切换或救援模式),请在迁移前验证面板与GRUB2的兼容性。
关键技术要点:决策矩阵
使用此清单确定LILO是否适合您的环境:
使用LILO的情况:
- 系统使用BIOS(非UEFI)固件
- 磁盘使用MBR分区表(非GPT)
- 内核和分区布局是静态的,很少更改
- 引导加载程序占用空间必须最小化(嵌入式系统)
- 您正在学习引导序列内部机制用于教育目的
不使用LILO的情况:
- 系统使用UEFI固件(LILO不兼容)
- 磁盘使用GPT分区
- 内核通过包管理器定期更新
- 您需要安全启动、TPM证明或可信引导
- 系统使用LVM、软件RAID或Btrfs作为根文件系统
- 您需要交互式引导参数编辑以进行故障排除
- 系统面向互联网或受安全合规要求约束
操作规则:每次在LILO管理的系统上编辑`/etc/lilo.conf`或更新内核时,运行`/sbin/lilo -v`不是可选的——它与编辑本身一样是强制性的。如果您的包管理器支持,请使用内核安装后钩子自动化此操作。
常见问题解答
如果我在LILO系统上更新Linux内核而不运行`/sbin/lilo`会发生什么?
LILO的映射文件仍然指向旧内核的磁盘块地址。系统将引导之前的内核,就好像更新从未发生过一样——或者,如果旧内核镜像被就地覆盖,它将加载损坏的数据并发生内核崩溃。始终在任何内核更新后立即运行`/sbin/lilo -v`。
LILO可以从GPT分区磁盘引导吗?
不可靠。LILO是为MBR分区表设计的。GPT磁盘使用保护性MBR,技术上允许安装LILO,但LILO不了解GPT分区条目,无法可靠地定位前四个分区之外的分区。对于任何GPT磁盘,请使用GRUB2。
LILO与UEFI系统兼容吗?
不兼容。LILO是BIOS时代的引导加载程序,不支持EFI应用程序。在UEFI系统上,固件期望在EFI系统分区中有PE格式的`.efi`二进制文件。LILO无法提供此功能。GRUB2、systemd-boot或rEFInd是UEFI的正确选择。
LILO的`timeout`值与实际秒数有什么区别?
`timeout`指令以十分之一秒为单位。值`50`等于5秒,`100`等于10秒。这是一种常见的配置错误——期望50秒超时而设置`timeout=50`的管理员将得到5秒的窗口。
LILO可以从LVM或软件RAID卷引导吗?
不能。由于LILO在安装时将内核位置解析为绝对磁盘块地址,它无法处理LVM或MD RAID引入的抽象层。`/boot`分区必须位于BIOS可直接访问的普通分区上。这是GRUB2在现代Linux发行版中取代LILO的主要架构原因之一。
