Linux系统启动过程

面试的时候被问到Linux启动过程,没有答得很好。回来收集了一些资料,发现有一篇博客写得不错,不过是英文的。特翻译过来供广大小伙伴们参考:)

原文: http://www.thegeekstuff.com/2011/02/linux-boot-process/

———————————————————- 我是背景 ——————————————————–

通常,我们按下开机键,几秒钟后,我们就能看到Linux的登录界面。

但是你有没有想过,在屏幕的背后,这一切是怎么发生的呢?

下面会为大家分六个阶段简述一下一个典型的Linux操作系统的启动过程。

linux-boot-process

1. BIOS

  • BIOS,即 Basic Input/Output System BIOS,基本输入输出系统。
  • 对系统做完整性检查,即计算机硬件能否满足运行的基本条件。如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止,比如内存卡没有插好。
  • 查找,加载以及执行引导装载程序。
  • 它会在软盘、光盘或者硬盘驱动器等上查找引导装载程序。你也可以在BIOS启动过程中按F12或者F2(一般来说是这两个键)来改变这个顺序。比如重装系统的时候,你在BIOS阶段按F12,然后选择从U盘启动。
  • 一旦引导装载程序被找到并且加载到了内存中,BIOS就将计算机的控制权交给它了。
  • 简单来说,BIOS阶段就是加载并执行MBR

2. MBR

  • MBR,即Master Boot Record. MBR, 主引导记录。
  • 位于启动盘的第一扇区,一般为 /dev/hda或者/dev/sda
  • MBR 共有512位,由三个部分组成,1)第1-446位,主引导加载程序信息 2)接下来64位存放分区表 3)最后两位用来存储MBR有效标记
  • 它包含了GRUB的信息(或者在一些老系统上的LILO信息)
  • 简单来说,MBR阶段就是加载并执行GRUB

3. GRUB

    • GRUB,即Grand Unified Bootloader,启动管理器。
    • 如果你在操作系统分区中装了好几个内核,通过GRUB,你就可以选择启动哪一个。
    • GRUB会展示一个初始化的界面,等待你的选择,如果过了等待时间,它就会加载在grub配置文件中指定的默认内核镜像。
    • GRUB能够识别文件系统(在老Linux系统上的LILO并不能识别文件系统)。
    • Grub 配置文件在 /boot/grub/grub.conf (/etc/grub.conf 只是一个链接)。下面是一个CentOS中的grub.conf文件信息
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-194.el5PAE)
          root (hd0,0)
          kernel /boot/vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/
          initrd /boot/initrd-2.6.18-194.el5PAE.img
  • 正如你从上面所看到的那样,它包含了内核以及initrd镜像的信息,initrd中含有内核所需的一些基本模块驱动。
  • 简单来说,GRUB阶段就是加载并执行内核以及initrd镜像。

4. Kernel

  • 挂载根文件系统,这个已经在grub.conf文件中”root=”指出。
  • 运行/sbin/init 程序来初始化系统环境
  • 由于/sbin/init 是第一个被Linux内核所执行的程序,它的进程ID号为1。可以通过命令“ps -ef | grep init”看到。
  • initrd,即 Initial RAM Disk,是用内存模拟的磁盘,一个临时文件系统。
  • 在真正的根文件系统被挂载之前,initrd被内核作为一个临时的文件系统,其中含有内核所需的一些基本模块驱动,内核启动时展开该initrd来加载相应的驱动,在该驱动的补充之下从而挂载上根分区;

5. Init

  • 根据/etc/inittab 文件来设定LInux的运行级别。
  • Linux的运行等级设定如下:
    • 0 – halt,关机
    • 1 – Single user mode,单用户模式
    • 2 – Multiuser, without NFS,无网络支持的多用户模式
    • 3 – Full multiuser mode,有网络支持的多用户模式
    • 4 – unused,保留,未使用
    • 5 – X11,有网络支持有X-Window支持的多用户模式
    • 6 – reboot,重新启动
  • Init程序根据/etc/inittab指定的默认运行等级来加载适当的程序。
  • 执行命令‘grep initdefault /etc/inittab’可以看到系统默认的运行等级
  • 如果你想给自己找点儿麻烦,你可以把默认运行等级设置为0或者6,鉴于你已经知道了0和6代表什么,我估计你不会那样干:)
  • 通常你会设置默认运行等级为3或者5

6. Runlevel programs

  • 当Linux系统启动以来以后,你会看到有很多服务也跟着运行起来了。比如你可能会看到“starting sendmail …. OK”。这些就是设置运行等级以后会对应加载的程序了。
  • 系统会根据你设置的系统运行等级来运行下面某一个目录中的所有程序。
    • Run level 0 – /etc/rc.d/rc0.d/
    • Run level 1 – /etc/rc.d/rc1.d/
    • Run level 2 – /etc/rc.d/rc2.d/
    • Run level 3 – /etc/rc.d/rc3.d/
    • Run level 4 – /etc/rc.d/rc4.d/
    • Run level 5 – /etc/rc.d/rc5.d/
    • Run level 6 – /etc/rc.d/rc6.d/
  • 请注意,这里面也包含直接指向/etc目录下的符号链接。也就是说,/etc/rc0.d 是指向/etc/rc.d/rc0.d的链接。
  • 在 /etc/rc.d/rc*.d/ 这些目录下面,你可以看到很多名字以S或者K开头的程序
  • 以S开头的程序是在启动过程中使用的,S代表startup。
  • 以K开头的程序是在关闭过程中使用的,K代表kill。
  • 这里还有数字出现在S或者K的后面,它们代表了程序的执行顺序。
  • 比如说,S12syslog 是用来启动syslog deamon,他的启动顺序是12,S80sendmail是用来启动sendmail daemon,他的启动顺序是80。那么显然syslog会先于sendmail启动。

好了,就是这些,这就是在Linux启动过程中所发生的事情。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.