Linux系统的启动过程

Linux的启动过程:

这里先给一个简单的概述,后面再是详述:
a. 位于ROM的BIOS首先加电自检,然后装载MBR内容到RAM,将控制权交给RAM中的bootloader(比如GRUB);
b. bootloader进行自身的多阶段引导,装载一些文件系统的驱动等,最后将内核装载入RAM;
c. 内核首先运行,然后挂载内存文件系统initrd;
d. initrd针对当前的硬件情况,决定应加载哪些内核模块并加载之,并且挂载root filesystem(系统盘),最后用/sbin/init来代替自己的/init以起到启动1号进程init的作用;
e. init进程工作,启动系统服务,处理用户登录事宜,最终Linux系统可用。

1. BIOS引导

BIOS是位于ROM中的,所以可以说就是机器本身。相反地,磁盘就不一定算机器本身的了,因为可以远程挂载。

a. 首先,BIOS加电自检,即所谓的POST(Power On Self Test)
b. 然后,按照BIOS中设置的引导顺序(如:硬盘分区、光驱、软盘、USB设备等)读入引导块。
一般来说,从硬盘启动,引导块指的就是MBR(Master Boot Record,主引导记录)。MBR是一个 512 字节大小的扇区,位于磁盘的第一个扇区(0道 0柱面 1扇区),它在硬盘上的三维地址为(柱面,磁头,扇区)= (0,0,1)
c. 当 MBR 被加载到 RAM 中之后,BIOS就将控制权交给MBR了,而MBR中的内容可以是GRUB或LILO.

2. GRUB引导

MBR是一个512字节的区域,其中放置的是bootloader程序。bootloader是引导程序,它一般分为多阶段引导(见下面对GRUB的介绍)。常见的bootloader程序有GRUB和LILO.

GRUB(GRand Unified Bootloader),遵循FSF(Free Software Foundation)的多引导规范(Multiboot Specification),它允许用户选择一种操作系统来启动。

GRUB分为version 1和version2,前者已经是legacy了,后者才是常用的。

GRUB的引导分为3个stage:

  • Stage 1:
    boot.img刚好是446个字节,位于MBR中;
    首先,boot.img被装载到RAM中,然后它会去装载core.img;

  • Stage 1.5:
    core.img位于MBR和第一个partition之间的空的sectors里面;
    core.img会加载一些模块以及文件系统的驱动,然后它会进入Stage 2.

  • Stage 2:
    /boot/grub 位于硬盘分区上
    在这个阶段,用户可以选择一个操作系统进行启动(boot)了

    在 /boot/grub/grub.conf 文件中,存放的就是关于这些供用户选择的操作系统的信息。对于Linux操作系统来说,这个文件会指明kernel,即vmlinuz文件存放于何处,以及 initrd 存放于何处,等等。

    在选择了一个操作系统之后,就进入了内核引导阶段。

附:
GRUB和LILO的区别:(GRUB完胜)

  • LILO最多支持16个不同的boot选择,而GRUB支持的数量无上限;
  • LILO不支持网络启动,而GRUB可以;
  • 修改配置文件后,LILO需要被写入MBR,而GRUB不需要;
  • LILO不支持互动式的命令行操作,而GRUB支持

3. 内核引导

bootloader负责装载kernel image(vmlinuz)和initrd image(initramdisk)到内存中。在bootloader把控制权交给Kernel之前,vmlinuz和initrd就已经被装载在内存中了。

  • Kernel(vmlinuz)首先运行起来,直到它能够mount这个initrd所代表的ramdisk,就好像mount了一个文件系统。

  • initrd的作用是什么呢?
    因为硬件有各种各样,kernel需要怎样的模块/驱动就是不一样的,initrd会决定哪些内核模块是需要被加载以支持当前的硬件,并且会加载这些内核模块,并且保证最终root filesystem会被mount起来。
    所以,其实initrd就是一个非常小的操作系统镜像。它唯一的目的就是为真正的操作系统的启动做准备。比如,它会mount真实的root filesystem(系统盘) – 必须包含基本的二进制目录(/bin 和 /sbin),库(/lib 和 /lib64), 以及配置文件目录 (/etc). 最终,/init (详见参考文献) 会使用实际操作系统的 /sbin/init 来代替它自己,也就是使之成为init进程(1号进程)。至此,内核引导结束。

附:几个概念

  • vmlinux
    Linux Kernel静态链接的可执行文件。它只是boot过程中的一个中间过程的产物。

  • vmlinux.bin
    和vmlinux一样,但是是二进制文件格式。所有的符号(symbols)和relocation的信息都被去掉了。

  • vmlinuz
    把vmlinux文件压缩为zlib或bzip2等格式,并且添加了解压缩的能力。
    vmlinuz 是vmlinux 经过gzip和objcopy 制作出来的压缩文件,当然不再是vmlinux的一个简单的压缩版。vmlinuz是一种统称,有两种具体的表现形式zImage 和bzImage。bzimage和zImage的区别在于本身的大小,以及加载到内存时的地址不同,zImage在0~640KB,而bzImage则在1M以上的位置。

  • zImage
    small kernel(小于512KB)的早期的格式。

  • bzImage
    big zImage的意思,bzImage和bzip2无关,bzImage格式仍然是以 zlib 算法来做压缩。超过512KB的压缩的kernel. 因为现在的kernel都是超过512KB的,所以常用的是这种.

  • CPIO
    既是一种压缩格式的名称,也是一个压缩工具的名称。

4. 后续的几件工作

内核引导结束之后的事情,不是笔者目前关注的重点,所以简单写一下。
在内核引导结束之后,还有3件事情要做,之后用户就可以使用系统了。

a. init进程完成其工作:在进入某个特定的运行级别(Runlevel)时运行相应的程序,以此对各种运行级别进行管理。
b. 初始化系统的服务程序
c. 用户登录过程的处理

参考文献:

https://en.wikipedia.org/wiki/Booting
https://en.wikipedia.org/wiki/BIOS
https://en.wikipedia.org/wiki/MBR
https://en.wikipedia.org/wiki/GNU_GRUB
http://www.dedoimedo.com/computers/grub.html
https://unix.stackexchange.com/questions/5518/what-is-the-difference-between-the-following-kernel-makefile-terms-vmlinux-vml/5602#5602
https://zh.wikipedia.org/wiki/Vmlinux
https://en.wikipedia.org/wiki/Vmlinux
https://en.wikipedia.org/wiki/Cpio
http://www.linuxquestions.org/questions/linux-server-73/difference-between-initrd-and-vmlinuz-images-892868/
http://www.linuxquestions.org/questions/linux-kernel-70/creating-vmlinuz-and-initrd-on-distribution-media-590730/#post2920395

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值