“早该有人这么讲LILO配置了”:liloconfig实操复盘
提到Linux系统设置,大部分人脱口而出的是GRUB、grub-mkconfig、update-grub。但如果你刚好维护着一台老旧的Slackware,或者掏出了一台嵌入式设备里被裁剪过的Linux系统,那你就躲不开LILO——以及它的交互式配置工具liloconfig。
先说结论:liloconfig 是 LILO(Linux Loader)提供的一个菜单式配置程序,作用等同于“引导加载程序的可视化设置向导”。它不直接启动系统,而是帮你生成/更新 /etc/lilo.conf,随后自动调用 lilo 把引导信息写入磁盘主引导扇区。相比手工写配置,它能少踩很多格式坑。
这篇内容我按照自己维护生产服务器的顺序讲,从原理到实操,再到故障排查,全部都是自己踩过坑、翻过车的经验。如果你负责的老机器还在用LILO,或者说你需要给别人做一套“引导加载程序层面的系统设置教程”,这篇文章可以直接抄作业。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
1. 先搞懂 LILO 干了什么、liloconfig 又怎么用
1.1 从开机到内核:引导加载程序到底做了什么
很多人分不清“引导加载程序”和“内核启动”之间的关系,这会影响你判断 liloconfig 的配置项到底在调什么。
计算机上电后,固件(BIOS/UEFI)会依据启动顺序,把磁盘上第一个扇区的内容读入内存并执行。这个扇区就是主引导记录(MBR),LILO 的第一阶段代码就存在这里。它的核心任务只有一个:定位并加载第二阶段引导程序(通常是指向一个更大、功能更全的代码块),再由第二阶段去读取配置文件 /etc/lilo.conf,找到我们指定的内核文件(比如 /boot/vmlinuz),把它展开到内存里并把控制权交给内核。
换个生活化的比喻:MBR 上的第一段代码像一个只认路牌的引路人,它不关心你最终要去哪,只负责把你带到中转站;中转站(第二阶段)再根据你填的地址(lilo.conf)把你送到最终目的地(内核)。明白了这个链路,你就知道 liloconfig 配置的每一项都在影响“中转站怎么找地址、怎么引导最终系统”。
LILO 是 Linux 世界最古老的引导加载程序之一,也是早期 Slackware、Red Hat、Debian 等发行版的标准配置。它的优势是极简、稳定、对老硬件兼容性极好。缺点也很明显:每次修改内核或配置文件后,必须手动(或通过 liloconfig)重新运行 lilo 命令把引导信息写回扇区,否则重启不生效。这一点是它和 GRUB 最大的区别。
1.2 liloconfig 凭什么被称为“系统设置”工具
严格说,liloconfig 并不负责系统运行时的设置(比如网络、语言、键盘),它管的是“开机怎么把系统拉起来”这一件事。但由于引导结果直接决定操作系统能否启动,许多发行版都会把 liloconfig 归入系统配置工具集。
liloconfig 的实际价值体现在三块:
- 检测并选择引导加载程序的安装目标(是写进 MBR 还是写进某个分区的引导扇区);
- 交互式收集内核路径、根分区、启动参数、默认标签等关键信息;
- 自动生成
/etc/lilo.conf并执行lilo命令写入引导记录,尽量降低手工改出错的风险。
换句话说,你可以完全不看 lilo.conf 的手册页,跟着 liloconfig 的提问一步步走完,就能得到一份能用的配置。但这种“保姆级”工具我也提醒一句:对于生产环境,我强烈建议你看懂它生成了什么。后面第四节会展开解释为什么。
2. liloconfig 实操全流程:一步一步改引导
2.1 进入配置界面后每个选项到底在问什么
我以一台典型的 Slackware 系统为例。在 root 终端输入:
bash复制liloconfig
你会看到一个由 Dialog 组件画出来的菜单,英文界面,别慌。它的第一屏通常是“Please select the target drive/partition”之类的选项,中文理解就是“要把 LILO 写到哪个设备上”。
可选项一般包括:
/dev/sda:第一块硬盘的主引导记录(MBR)/dev/sdb:第二块硬盘的 MBR/dev/sda1等分区:某个分区的引导扇区- 自定义设备名
这里的原则很简单:如果 Linux 是你这台机器上的唯一系统,或者你想让开机硬盘一通电就进入 LILO 菜单,选 /dev/sda(MBR)。如果你想保持硬盘原本的引导方式,只在特定分区里装一个备用引导器,那就选择该分区设备名。多数个人电脑和服务器都选 MBR 路径,这也是最通用的做法。
选完目标后,liloconfig 会继续询问“是否使用 LBA 模式寻址”(常见描述是 Enable LBA32)。如果你是老磁盘、老 BIOS,务必选择启用 LBA32,否则磁盘容量大于 8.4GB 或柱面数超出寻址能力时,LILO 可能找不到后续的引导代码和内核。如果是固态盘和较新 BIOS,启用 LBA32 通常也没有副作用,建议一律选 Yes。
接下来是设置 linea 地址模式(linear mode),它表示以扇区线性编号方式访问磁盘,而不是使用(柱面、磁头、扇区)三维地址。从易用性角度我建议开启 liner 模式,尤其遇到盘符在 BIOS 下和系统内不一致的问题时,linear 能减少不少麻烦。
随后 liloconfig 会问内核路径(通常是 /boot/vmlinuz),以及内核命令行参数(比如 root=/dev/sda2 ro)。如果你不确定根分区是哪个,可以先退出 liloconfig,执行 mount | grep ' / ' 或 df / 查看,再回来填。
接着会问是否为每个启动项设置标签(label),比如 Linux、Windows、Fallback。标签是启动菜单上显示的名字,自己起个有意义的名字即可。还会问默认启动项和超时时间(timeout),超时单位是“0.1 秒”,默认 50 表示 5 秒,倒计时结束后自动启动默认标签。
完成这些问答后,liloconfig 会汇总生成配置,并写入扇区。若一切顺利,会显示类似 The boot loader has been successfully installed 的字样。
2.2 一次完整的交互对话(我把响应内容也放上来)
我在一台测试机上完整跑过一次,把关键交互还原如下(节选,机器输出以实际版本为准):
bash复制$ liloconfig
Please select the target drive/partition:
[*] /dev/sda First IDE hard drive (MBR)
( ) /dev/sdb Second IDE hard drive (MBR)
( ) /dev/sda1 First partition on first IDE hard drive
( ) /dev/sda2 Second partition on first IDE hard drive
Select: /dev/sda
Enable LBA32?
( ) No
[*] Yes
Enable linear mode?
( ) No
[*] Yes
Select the kernel image:
Path: /boot/vmlinuz
Kernel options: root=/dev/sda2 ro quiet
Enter a label for this entry:
Linux
Add another OS entry? (e.g. Windows on /dev/sda1)
No
Select the default boot entry:
Linux
Timeout (1/10 seconds):
50
核心信息都已齐。选 MBR、开 LBA32、开 linear、指定正确内核和根分区、设好默认标签、合理超时,重启后就能看到干净的 LILO boot: 提示符,回车或等待数秒进入系统。
3. 真正核心的事:lilo.conf 手工配置细节
3.1 配置文件核心参数拆解
liloconfig 生成的最终成果就是 /etc/lilo.conf。你完全可以用它来反查配置、排查问题。下面是我从产线运维中总结的高频项:
| 参数 | 作用 | 典型值 | 备注 |
|---|---|---|---|
boot= |
安装引导代码的目标设备 | /dev/sda |
常是 MBR;写在分区上也可 |
map= |
映射文件存放路径 | /boot/map |
保存扇区映射信息 |
lba32 |
启用 LBA32 寻址 | 存在即启用 | 老盘必须 |
linear |
启用线性扇区寻址 | 存在即启用 | 建议开启 |
prompt |
启动时等待用户输入引导标签 | 存在即启用 | 配合 timeout |
timeout= |
等待超时时间 | 50 |
单位 0.1 秒,50=5 秒 |
default= |
默认启动标签 | Linux |
可省略,默认第一个 image |
image= |
指定 Linux 内核文件 | /boot/vmlinuz |
每个 image 块一个 |
label= |
image 启动项名称 | Linux |
菜单显示名 |
root= |
根文件系统所在分区 | /dev/sda2 |
非 root=/dev/... 会失败 |
read-only |
内核挂载根分区为只读启动 | 存在即启用 | 启动后再 remount rw |
other= |
指定非 Linux 分区/系统 | /dev/sda1 |
常指 Windows |
table= |
重写指定磁盘的分区表 | /dev/sda |
双系统场景常见 |
lock、optional等 |
实验性/高级功能 | 按需 | 默认不需要 |
一个典型单系统配置如下:
bash复制# /etc/lilo.conf
boot = /dev/sda
map = /boot/map
lba32
linear
prompt
timeout = 50
default = Linux
image = /boot/vmlinuz
label = Linux
root = /dev/sda2
read-only
注意 read-only 的作用。它不是让你启动后无法写入,而是要求内核先以只读方式挂载 /,完成系统检查后再重新以读写方式挂载。这是绝大多数 Linux 发行版在引导阶段的传统做法,建议保留,别手贱删掉。
3.2 双系统/多内核场景配置示例
如果说单系统是“一镜到底”,那双系统就是“岔路口的立交桥”。liloconfig 在老版本中也能引导“其他操作系统”,常见配置是在同一台机器上装 Windows 和 Linux,由 LILO 提供启动菜单。
分两种场景:
场景一是 Windows 和 Linux 共存,Windows 在 /dev/sda1,Linux 根分区在 /dev/sda2:
bash复制boot = /dev/sda
map = /boot/map
lba32
prompt
timeout = 50
default = Linux
image = /boot/vmlinuz
label = Linux
root = /dev/sda2
read-only
other = /dev/sda1
label = Windows
table = /dev/sda
这里 other = /dev/sda1 表示从该分区启动非 Linux 系统,table = /dev/sda 则表示在引导切换前更新该硬盘分区表信息,提高对 Windows 这类系统的兼容性。
场景二是一个内核升级后,希望保留上一个可用内核做回退:
bash复制image = /boot/vmlinuz-6.6.12
label = Linux-6.6.12
root = /dev/sda2
read-only
image = /boot/vmlinuz-6.6.11
label = Linux-6.6.11
root = /dev/sda2
read-only
每次升级完内核,记得把新的内核路径放前面,默认标签指到新内核,然后重新执行 lilo。我个人的习惯是保留最近 2~3 个内核,防止新内核莫名挂掉后还能快速从旧内核救起来。
3.3 配置完成后的关键一步:重新执行 lilo
不管你是用 liloconfig 自动生成的配置,还是手工编辑了 /etc/lilo.conf,只要配置文件变了,或者内核文件换了,就必须重新执行:
bash复制lilo
没有这一步,上面的所有修改都不会生效。原因是 LILO 的引导代码每次启动时依赖一个 /boot/map 文件来定位内核在磁盘上的物理扇区位置,而这个 map 文件必须由 lilo 命令重新生成。忘了这一步,轻则启动时提示找不到内核,重则直接进不了系统。在 GRUB 时代大家习惯了改配置就能生效,但 LILO 的这套机制要求你必须多长一个心眼。
4. 调试视角:LILO 出错时怎么看报错
4.1 几个最经典的 LILO 故障和症状
LILO 的报错信息很有特色,启动时如果输出不完整或出现特定字符组合,基本能定位到问题阶段。我把常见故障整理成速查表:
| 启动显示 | 含义 | 可能原因 | 处理方向 |
|---|---|---|---|
| 无任何输出 | 第一阶段代码未加载 | 没写 MBR 或安装失败 | 用安装盘进入救援模式,重写 lilo |
LI |
第一阶段已加载但第二阶段失败 | map 文件损坏 / 超出寻址范围 | 重新运行 lilo;检查 LBA 参数 |
LIL |
第二阶段代码部分加载 | 配置错误 | 进入救援模式修复 /etc/lilo.conf |
LILO(不完全) |
中断在描述符阶段 | 内核路径/映射不符 | 重新安装引导并更新 map |
LILO(完整) |
引导成功 | 无 | 正常现象 |
还有一种场景是启动时出现 LILO boot: 提示但是按 Tab 没列出菜单。一般原因是 prompt 存在,但没有正确配置默认标签或映射文件缺失。经验做法是:先尝试输入已知标签名(如 Linux)回车看能否引导,若能,随后进入系统重新执行 lilo 重建 map。
4.2 用手工命令复现 liloconfig 流程
liloconfig 能做的每一步,基本都能用命令手动复现。调试时我喜欢手工执行,因为输出更透明,能看到每一步是否成功。
手工流程对应如下:
- 编辑
/etc/lilo.conf(可用vi或复制样例)。 - 运行
lilo -t做一次“测试运行”,只解析配置不写入boot区,看是否有语法错误; - 运行
lilo -v详细输出,查看每个步骤的状态; - 正常执行
lilo,看到提示确认成功。
-t 这个参数非常有用,它能帮你验证配置文件的语法和路径是否正确,避免直接写入一个坏配置导致重启失败。如果 -t 显示错误,通常输出会指出具体哪一行有问题,照着改即可。
例如测试输出可能会是:
bash复制$ lilo -t
The map file is corrupt.
这说明 map 文件有问题,运行 lilo 重新生成一次即可。
4.3 一条救命经验:在救援模式下救回系统
有一次我在一台老式工作站上误改了 lilo.conf,把 root= 指向了空分区,重启后直接卡在 LILO 引导界面。手头没有安装光盘,只有一张可用的 KNOPPIX Live CD。我花了几分钟把系统根分区挂载出来,直接编辑 /mnt/etc/lilo.conf 改回正确的 root,然后又执行了:
bash复制chroot /mnt /sbin/lilo -v
其实更好的做法是通过 chroot 进入原系统后完整运行 lilo,因为 LILO 需要使用原系统中的设备节点和 map 文件。如果 chroot 暂时做不到,也可以在 Live 环境下把根分区挂载到 /mnt,然后以挂载后的路径为前缀,静态编译版本的 lilo 来执行,但容易遇到设备路径不一致的问题。这类救援操作里最重要的教训是:不要慌乱改参数,先确认 /etc/lilo.conf 才是问题根因。
5. 常见问题速查与个人经验清单
5.1 问题速查表
| 问题 | 原因 | 解决办法 |
|---|---|---|
| 修改了配置但启动还是旧内核 | 没有重新执行 lilo 更新 map |
执行 lilo 再重启 |
引导时提示 LIL 或 LI |
map 损坏、寻址模式不符 | 进入救援模式,重新执行 lilo -v;检查 lba32、linear |
| 按 Tab 无菜单 | 缺少 prompt 或映射不完整 |
编辑配置增加 prompt、合理 timeout;重建 map |
| Windows 无法从菜单启动 | other/table 配置缺失或分区表更新失败 |
检查 other=/dev/sda1、table=/dev/sda,重新跑 lilo |
| 启动时默认需要手动输入 | default 没设或无法匹配 |
确保 default= 对应存在的 label |
| 磁盘更换后无法引导 | 设备名变化 | 确认新盘设备名,修改 boot= 和 root= 后重新 lilo |
误删 /boot/map |
启动后无法加载内核 | 启动救援模式,运行 lilo 重建 map |
5.2 我在实际运行中沉淀的几条“反直觉”经验
第一,liloconfig 的默认内核路径不一定正确。如果你之前手动编译过内核,/boot/vmlinuz 可能是一个软链接,也可能不是。执行 ls -l /boot/vmlinuz* 检查一下,确保 lilo.conf 里的 image= 指向真正的内核文件。这是一个非常基础但极易忽略的坑。
第二,不要把 lilo.conf 直接复制到别的机器。每台机器的根分区、磁盘控制器、BIOS 寻址方式都不同,配置文件移植性极差。生产环境最稳定的做法是:新机器上重新跑 liloconfig,或手写配置并执行 lilo -t 验证,再写入引导扇区。偷懒复制配置大概率翻车。
第三,LILO 看似老古董,但它的设计哲学值得学习:它把“菜单选择”和“定位内核”严格分开,一切以 map 文件为准,逻辑非常清晰。理解它之后再去看 GRUB 的 grub.cfg,反而能更深刻地理解现代引导器的复杂性和灵活性的由来。
5.3 liloconfig 之后还能扩展什么
如果你已经习惯用 liloconfig 管理 LILO,有两个方向很值得继续深入:
一是深入理解 LILO 的高级参数,比如 password、restricted(引导项密码保护)、fallback(备用引导项)、compact(磁盘读取优化)。虽然是老技术,但在内网安全要求高的场景下,设置一个引导密码依然是很有效的防线。
二是研究从 LILO 迁移到 GRUB 的路径。Slackware 或一些旧发行版可以用 liloconfig 配置一段时间,但新硬件和新系统(尤其支持 UEFI 转 secure boot)逐步淘汰纯 BIOS 模式之后,LILO 的局限性会越来越明显。理解 LILO 的配置方法,可以让你在维护旧系统和对新系统做引导调试时都有底气;而迁移时的重点则是把 lilo.conf 中的 image/root 对应关系翻译成 grub.cfg 中的 menuentry 和 linux 行,概念一一对应,差异不大。
我在实际运维中见过不少人一听到 LILO 转身就走,觉得它不是主流。但在处理老旧产线、嵌入式板卡、定制发行版时,那些机器恰恰只有 LILO 可用,而这个命令有时候就是救命的钥匙。
