引导程序:LILO与GRUB
前几天看到一篇很好的文章,将LILO和GRUB两种引导程序描述了一遍。刚好搭建了这个博客,就发上来看看,既是记录,也是分享。本文参考的文章放在开头表达对原作最大敬意: 《引导加载程序之争:了解 LILO 和 GRUB》:https://blog.51cto.com/u_15930680/5990075 《BIOS、UEFI、Boot Loader都是些什么》:https://zhuanlan.zhihu.com/p/336441128
BIOS与Bootloader
无论在PC,还是嵌入式系统,需要运行操作系统,就绕不开引导加载程序,复杂的PC引导程序可以由BIOS来完成,实际上BIOS是闭源的,没有严格的标准,不同的厂商做的BIOS不同,也有采用开源UEFI,有的称UEFI BIOS,总而言之,传统的BIOS已经很少见了,计算机要考虑效率、性能、安全等问题,UEFI、BIOS、Bootloader都是混合在用,只是习惯上还是叫BIOS而已,主要功能一般描述为:对硬件进行初始化,对软件进行抽象。现在的BIOS固化发展过程: ROM(不能修改)->PROM(一次性修改)->EPROM(强紫外线擦除)->EEPROM(电擦除)->FLASH(专用程序修改);当 BIOS 引导时,它会寻找硬盘驱动器第一个扇区(MBR)中存储的数据;BIOS 使用存储在 MBR 中的数据激活引导加载程序。 对于嵌入式系统而言往往没有BIOS这样的固件,而采用了Bootloader。Bootloader启动过程一般分为两个步骤: 首先进行硬件设备的初始化,为步骤2准备RAM空间,将Bootloader复制到RAM空间、设置堆栈等 其次,再初始化需要的硬件,Bootloader将内核Kernel、文件系统从flash读入RAM等。
GRUB使用的一些常见问题
在Ubuntu版的Linux上GRUB命令一般是grub2,已经不支持在终端进入grub引导界面了,在编译完Linux内核得到image镜像文件、做完根文件系统后,还需要编写grub文本配置。由于最后是从U盘进入BIOS来启动引导,所以需要在U盘先创建一个grub分区,这个可以配置好文件系统类型(如fat32),由终端来进行安装,但是安装前U盘必须挂载到EFI分区......我自认我是谨慎得得过了度的人,由于每个人划分EFI分区习惯不同,我的EFI分区貌似已经由系统使用,我将U盘挂载到系统EFI分区,新建了文件夹挂载,安装成功,删除grub,取消挂载,我确认删除的是新建文件夹下的grub,然而当我打算从BIOS进入时,系统无法自动寻找Grub分区,果然系统分区没事还是不要改文件。解决方法是从grub手动寻找内核文件和文件系统,我对Linux安装位置还算了解,尝试了三个分区就找到了,一个一个试也可以,找到vmlinuz-X.X.XX-XX文件,同文件夹下找到根文件系统文件initrd-X.X.XX-XX.img,boot--成功开机,进入Linux后必须修复Grub,确保系统能自动运行才算成功,否则要么每次进入要手动配置、且Windows系统无法进入。值得一提的是,Linux和Windows的引导分区都安装在MBR,如果先安装Windows,再安装Linux,Linux会贴心地为你创建引导文件用于选择进入的系统;但是装了Linux又重装了Windows,Windows会覆盖MBR分区,会无法进入Linux。此外,现如今的系统的BIOS、Grub已经不完全是面向底层的操作了,厂商面向用户提供了良好的交互界面,这点是LILO以及传统BIOS所不具备的。
GRUB的配置
GRUB 的配置都是通过位于
/boot/grub/grub.conf的一个配置文件来完成的,示例文件(为1版,2版会略有改动,但原理基本一样):
1
2
3
4
5
6
7
8
9
10
11
12
13default=0 #默认顺序
timeout=10 #选择时间
splashimage=(hd1,3)/grub/splash.xpm.gz #启动菜单背景
password --md5 $1$opeVt0$Y.br.18LyAasRsGdSKLYlp1
title Red Hat Linux #系统名字
password --md5 $1$0peVt0$Y.br.18LyAasRsGdSKLYlp1
root (hd1,3) #根位置设定
kernel /vmlinuz-2.4.18-14 ro root=LABEL=/ #内核位置
initrd /initrd-2.4.18-14.img #根文件系统
title Windows XP #windows引导
password --md5 $1$0peVt0$Y.br.18LyAasRsGdSKLYlp1
rootnoverify (hd0,0)
chainloader +11
2
3
4grub> set root=(hdn,m) #根路径
grub> linux /boot/vmlinuz-3.13.0-29-generic root=/dev/sdxy #内核
grub> initrd /boot/initrd.img-3.13.0-29-generic #文件系统
grub> boot #开机
LILO
曾经是Linux系统传统的引导程序,可惜大多场合已经比较少用,我接触也少,直接看配置方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15boot=/dev/hda #引导分区
map=/boot/map #描述符表,引导期间 LILO 内部使用的映射文件
install=/boot/boot.b #含有引导加载程序的主要部分和二级部分文件
prompt #等待用户响应
timeout=100 #等待时间
compact #续的读磁盘的请求合并为一个单独的请求
default=Linux #默认系统
image=/boot/vmlinuz-2.4.18-14 #内核
label=Linux #选择显示的文本
root=/dev/hdb3 #根文件位置
read-only #只读装载
password=linux
other=/dev/... #其他系统
label=WindowsXP
table=/dev/... #与other连用指明位置
GRUB与LILO的不同
所有引导加载程序都以类似的方式工作,满足共同的目的。不过,LILO 和 GRUB 之间有很多不同之处: LILO 没有交互式命令界面,而 GRUB 拥有。 LILO 不支持网络引导,而 GRUB 支持。 LILO 将关于可以引导的操作系统位置的信息物理上存储在 MBR 中。如果修改了 LILO 配置文件,必须将 LILO 第一阶段引导加载程序重写到 MBR。相对于 GRUB,这是一个更为危险的选择,因为错误配置的 MBR 可能会让系统无法引导。使用 GRUB,如果配置文件配置错误,则只是默认转到 GRUB 命令行界面,因此,GRUB比LILO更适合应用在PC等场合的引导需求上。