Linux lilo命令

历史背景: lilo(Linux Loader)是Linux系统中一个经典的引导加载程序,主要用于早期的Linux发行版。现代系统通常使用GRUB作为默认引导加载程序。

命令简介

lilo(Linux Loader)是Linux系统中的一个经典引导加载程序。它负责在计算机启动时加载Linux内核到内存中,并将控制权交给内核。lilo是一个相对简单的引导加载程序,直接安装在硬盘的主引导记录(MBR)中。

主要功能
  • 安装引导加载程序到MBR或分区引导扇区
  • 支持多个操作系统引导
  • 配置内核启动参数
  • 支持RAID和LVM配置
  • 密码保护引导选项
适用系统
  • 早期的Linux发行版(1990s-2000s)
  • Slackware(传统默认引导程序)
  • 某些嵌入式系统
  • 特定旧硬件环境

命令语法

lilo [选项]
lilo -C 配置文件 [选项]

参数说明

选项 说明
-C 配置文件 使用指定的配置文件(默认:/etc/lilo.conf)
-b 引导设备 指定引导设备(如:/dev/sda)
-m 映射文件 指定映射文件(默认:/boot/map)
-q 查询当前配置
-v 详细模式(显示更多信息)
-u 卸载lilo,恢复原来的引导扇区
-U 与-u相同,但不检查时间戳
-r 目录 使用指定目录作为根目录
-t 测试模式(不实际写入)
-V 显示版本信息

lilo与GRUB对比

特性 lilo GRUB
出现时间 1992年 1999年
配置文件 /etc/lilo.conf /boot/grub/grub.cfg 或 /etc/grub.d/
配置方式 静态配置,修改后需运行lilo命令 动态配置,支持运行时修改
文件系统支持 有限支持 广泛支持(ext2/3/4, FAT, NTFS等)
交互性 有限交互 丰富交互,命令行界面
现代系统使用 较少 广泛

配置文件详解

lilo的主要配置文件是/etc/lilo.conf。每次修改此文件后,必须运行lilo命令使更改生效。

lilo.conf文件结构示例

# /etc/lilo.conf 示例配置
boot=/dev/sda               # 引导设备
map=/boot/map               # 映射文件位置
install=/boot/boot.b        # 引导扇区安装文件
prompt                      # 显示引导提示符
timeout=50                  # 等待用户选择时间(0.1秒为单位)
default=linux               # 默认启动项

# 启动项1:Linux
image=/boot/vmlinuz         # 内核镜像文件
    label=linux             # 启动项标签
    read-only               # 初始只读挂载根文件系统
    root=/dev/sda1          # 根文件系统设备
    append="quiet splash"   # 内核启动参数

# 启动项2:Linux(救援模式)
image=/boot/vmlinuz
    label=rescue
    read-only
    root=/dev/sda1
    append="single"         # 单用户模式

# 启动项3:Windows
other=/dev/sda2             # 其他操作系统分区
    label=windows
    table=/dev/sda          # 分区表所在设备

常用配置指令说明

指令 说明
boot=设备 安装引导加载程序的设备
root=设备 根文件系统设备
image=内核路径 Linux内核镜像文件路径
other=分区 其他操作系统所在分区
label=名称 启动项显示名称
append=参数 传递给内核的参数
timeout=时间 引导菜单超时时间(单位:0.1秒)
prompt 显示引导提示符
read-only 以只读方式挂载根文件系统
password=密码 设置启动项密码

使用示例

注意: 以下操作需要root权限,不当操作可能导致系统无法启动。请谨慎操作。

1. 基本安装和配置

# 1. 创建基本的lilo配置文件
cat > /etc/lilo.conf << EOF
boot=/dev/sda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
default=linux

image=/boot/vmlinuz-$(uname -r)
    label=linux
    read-only
    root=/dev/sda1
EOF

# 2. 安装lilo到MBR
lilo

# 3. 查看安装信息
lilo -q

2. 多系统引导配置

# 配置Linux和Windows双系统引导
cat > /etc/lilo.conf << EOF
boot=/dev/sda
timeout=150
prompt
default=linux

# Linux启动项
image=/boot/vmlinuz
    label=linux
    read-only
    root=/dev/sda1
    append="quiet splash"

# Linux救援模式
image=/boot/vmlinuz
    label=rescue
    read-only
    root=/dev/sda1
    append="single"

# Windows启动项
other=/dev/sda2
    label=windows
    table=/dev/sda
EOF

# 应用配置
lilo -v

3. 查询和测试配置

# 查询当前lilo配置
lilo -q

# 显示详细信息
lilo -v

# 测试配置而不实际写入
lilo -t

# 使用不同的配置文件
lilo -C /etc/lilo.conf.custom

4. 卸载和恢复

# 备份当前的引导扇区
dd if=/dev/sda of=/boot/boot.backup bs=512 count=1

# 卸载lilo,恢复原来的引导扇区
lilo -u

# 强制卸载(不检查时间戳)
lilo -U

故障排除

这通常表示lilo引导加载程序的第一阶段加载成功,但第二阶段失败:

  • LILO: 第一阶段加载成功
  • LILO: 第二阶段加载成功,但找不到描述符表
  • LILO 23: 描述符表地址错误
  • LILO 32: 内核签名无效

解决方法:

# 1. 使用Live CD/USB启动
# 2. 挂载原系统分区
mkdir /mnt/linux
mount /dev/sda1 /mnt/linux

# 3. 重新安装lilo
chroot /mnt/linux
lilo

# 4. 检查配置文件
vi /etc/lilo.conf
# 确保内核路径和根分区正确

每次内核更新或配置文件修改后,都必须重新运行lilo命令:

# 1. 更新内核后,重新运行lilo
lilo

# 2. 可以指定特定的内核文件
lilo -A vmlinuz-5.4.0-91-generic

# 3. 如果忘记了运行lilo,可以从旧内核启动
# 在引导提示符处按Tab键显示可用选项
# 选择旧内核启动,然后运行lilo

如果调整了分区大小或改变了分区结构,需要更新lilo配置:

# 1. 更新/etc/lilo.conf中的分区信息
vi /etc/lilo.conf
# 修改root=和boot=指向正确的设备

# 2. 重新安装lilo
lilo

# 3. 如果无法启动,使用救援模式:
# - 从Live CD/USB启动
# - 挂载原系统
# - chroot后运行lilo

高级配置

1. 密码保护

# 为特定启动项设置密码
image=/boot/vmlinuz
    label=linux
    password=secret123
    read-only
    root=/dev/sda1

# 全局密码保护(所有启动项)
password=globalpass
image=/boot/vmlinuz
    label=linux
    read-only
    root=/dev/sda1
    restricted  # 允许无密码启动,但修改内核参数需要密码

2. 多个磁盘和RAID配置

# 多磁盘配置
boot=/dev/sda
install=/boot/boot.b
map=/boot/map

# 第二个磁盘作为备用引导
disk=/dev/sdb
    bios=0x81  # 第二个磁盘的BIOS编号

# RAID配置
raid-extra-boot=/dev/sda,/dev/sdb

3. 内核参数和initrd

# 使用initrd和自定义内核参数
image=/boot/vmlinuz
    label=linux
    initrd=/boot/initrd.img
    read-only
    root=/dev/mapper/vg-root
    append="resume=/dev/sda2 splash quiet"

从lilo迁移到GRUB

现代Linux系统通常使用GRUB 2作为引导加载程序。以下是从lilo迁移到GRUB的基本步骤:
# 1. 安装GRUB软件包
# Debian/Ubuntu:
apt-get install grub2

# RHEL/CentOS:
yum install grub2

# 2. 备份lilo配置
cp /etc/lilo.conf /etc/lilo.conf.backup

# 3. 生成GRUB配置文件
# BIOS系统:
grub-install /dev/sda
update-grub  # Debian/Ubuntu
grub2-mkconfig -o /boot/grub/grub.cfg  # RHEL/CentOS

# UEFI系统:
grub-install --target=x86_64-efi --efi-directory=/boot/efi
update-grub

# 4. 验证GRUB安装
grub-probe --target=fs_uuid /boot/grub

# 5. 重启系统验证引导
reboot

实际应用场景

场景1:旧服务器维护
#!/bin/bash
# 旧服务器lilo维护脚本

echo "=== lilo维护脚本 ==="

# 检查lilo是否安装
if ! command -v lilo &> /dev/null; then
    echo "lilo未安装,尝试安装..."
    apt-get install lilo 2>/dev/null || yum install lilo 2>/dev/null
fi

# 备份当前配置
BACKUP_DIR="/backup/lilo/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
cp /etc/lilo.conf $BACKUP_DIR/
dd if=/dev/sda of=$BACKUP_DIR/mbr.backup bs=512 count=1

echo "配置备份到: $BACKUP_DIR"

# 检查配置文件语法
if lilo -t; then
    echo "lilo配置语法检查通过"

    # 应用配置
    echo "应用lilo配置..."
    lilo -v

    # 显示当前配置
    echo "=== 当前lilo配置 ==="
    lilo -q
else
    echo "lilo配置有错误,请检查/etc/lilo.conf"
    exit 1
fi

echo "维护完成"
场景2:嵌入式系统配置
#!/bin/bash
# 嵌入式系统lilo配置

echo "=== 嵌入式系统lilo配置 ==="

# 嵌入式系统通常使用简单配置
cat > /etc/lilo.conf.embedded << EOF
boot=/dev/mmcblk0
compact          # 合并读请求,加速引导
delay=20         # 20毫秒延迟
timeout=0        # 不显示菜单,立即启动
vga=normal       # 正常VGA模式
image=/boot/zImage
    label=EmbeddedLinux
    read-only
    root=/dev/ram0
    append="console=ttyS0,115200n8 rootwait"
EOF

# 使用嵌入式配置
cp /etc/lilo.conf.embedded /etc/lilo.conf

# 安装到存储设备
echo "安装lilo到嵌入式存储..."
lilo -C /etc/lilo.conf -b /dev/mmcblk0

echo "嵌入式lilo配置完成"
echo "注意:这仅适用于特定嵌入式硬件配置"

常见问题解答

A: 主要区别:

  • lilo: 简单直接,配置静态,修改后必须重新运行lilo命令
  • GRUB: 功能丰富,支持动态配置,文件系统支持更广泛
  • 选择建议:
    • 新系统:使用GRUB 2
    • 旧系统维护:保持原有lilo配置
    • 嵌入式/特殊环境:根据需求选择

A: lilo的工作原理:

  1. lilo读取/etc/lilo.conf配置文件
  2. 根据配置计算内核和其他文件在磁盘上的物理位置
  3. 将这些位置信息写入引导扇区和映射文件(/boot/map)
  4. 引导时直接使用这些物理位置信息加载系统

因此,任何配置变更都需要重新运行lilo来更新这些位置信息。

A: 不支持。lilo是一个传统的BIOS/MBR引导加载程序,不支持UEFI引导模式。UEFI系统需要使用:

  • GRUB 2(支持UEFI)
  • systemd-boot(某些发行版)
  • UEFI直接引导(配置.efi文件)

A: 恢复Windows引导的方法:

# 方法1:使用Windows安装盘修复
# 1. 从Windows安装介质启动
# 2. 选择"修复计算机"
# 3. 打开命令提示符
# 4. 执行:bootrec /fixmbr

# 方法2:使用Linux工具
# 1. 备份当前MBR
dd if=/dev/sda of=/backup/mbr.lilo bs=512 count=1

# 2. 清除lilo,写入空MBR
dd if=/dev/zero of=/dev/sda bs=512 count=1

# 3. 使用Windows修复或重新安装引导

# 方法3:使用lilo卸载
lilo -u  # 如果有备份的原始引导扇区
命令总结
  • lilo 是Linux的经典引导加载程序,主要用于早期的Linux系统
  • 配置文件: /etc/lilo.conf,修改后必须运行lilo命令
  • 安装位置: 硬盘的MBR或分区引导扇区
  • 主要缺点: 配置静态,不支持文件系统内查找文件
  • 现代替代: GRUB 2是目前Linux系统的主流引导加载程序
  • 适用场景: 旧系统维护、特定嵌入式环境、学习研究
  • 重要提示: 操作引导加载程序有风险,务必提前备份重要数据

历史意义

lilo在Linux发展史上具有重要地位:

  • 1992年: Werner Almesberger开发了第一个版本
  • 早期Linux: 是大多数Linux发行版的默认引导程序
  • 简单可靠: 在资源有限的环境下表现出色
  • 被替代: 2000年后逐渐被功能更强大的GRUB取代
  • 遗产: 其设计思想影响了后续引导加载程序的发展

虽然现代系统很少使用lilo,但了解它对于理解Linux引导过程和系统历史很有帮助。