Linux启动流程

这里主要分析使用BIOS的MBR分区的启动流程
启动流程概览:

  • 加载BIOS的硬件信息,进行自检查,获取第一个启动设备(如:硬盘)
  • 读取第一个启动设备MBR的boot loader(grub)的启动信息
  • 加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备。
  • 核心执行init程序,并获取默认的运行信息(runlevel)
  • init程序执行/etc/rc.d/rc.sysinit文件,准备操作系统环境(如网络,时区等信息)
  • 启动核心的外挂模块
  • init执行获取到的runlevel对应的服务脚本
  • init执行/etc/rc.d/rc.local
  • 执行/bin/login程序,等待用户登录
  • 登录之后开始以Shell控制主机

1、BIOS

BIOS是英文"Basic Input Output System"的缩写,直译过来后中文名称就是"基本输入输出系统"。
其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。 ——百度百科

POST:Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统、 串并行接口、键盘、 CD-ROM光驱等硬件情况的检测。

这部分主要是硬件的启动和检测,就不细究了。

最关键的一部分是,BIOS要获取到第一个启动设备。

2、引导程序和grub

当BIOS完成自检并指定启动设备后,就会将对系统的控制权过渡到引导程序(Boot Loader)。

Linux用的引导程序用的是grub。

grub通常分为两个阶段,分别是第1阶段和第2阶段。

  • 1阶段
    包含在MBR(第一个启动设备的0扇区)中。由于受MBR的大小限制,第1阶段所做的几乎只是装载GRUB的下一阶段(存放在硬盘的其它位置)。- - - 1.5阶段
    包含在MBR后面的30千字节中,一般使用的文件名是/boot/initrd,它能够通过Boot Loader加载到内存当中,然后在内存中仿真成一个虚拟的一个根目录。
  • 2阶段
    通过1.5阶段提供的虚拟文件系统,kernel就能够加载需要的驱动程序,最终释放虚拟文件系统,并挂载实际的根目录文件系统。

3、runlevel

当内核加载完整后,系统就会执行第一个进程init。

init进程首先通过/etc/inittab获取到系统默认的runlevel。

  • runlevel等级

    • 0 -halt 关机
    • 1 -single user mode 单用户模式
    • 2 -multi-user,without NFS 没有NFS的多用户模式
    • 3 -Full Multi-user mode 多用户模式
    • 4 -unsed 保留
    • 5 -X11 桌面模式
    • 6 -reboot 重启
  • /etc/inittab文件在Cenos6后基本上只保留了定义默认runlevel这个功能。其格式如下:

[root@CentOS6 boot]#vim /etc/inittab
# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
# 设置默认runlevel为5模式
id:5:initdefault:

4、执行/etc/rc.d/rc.sysinit

/etc/rc.d/rc.sysinit脚本执行一系列的命令,去配置整个系统环境:
1、网络环境、主机名
2、挂载内存、usb设备等等
3、设置终端字体
...

5、执行/etc/rc.d/rc$runlevel.d

根据之前获取的runlevel,执行对应的运行级别的服务

init.d  rc  rc0.d  rc1.d  rc2.d  rc3.d  rc4.d  rc5.d  rc6.d  rc.local  rc.sysinit
[root@CentOS6 rc.d]#[root@CentOS6 boot]#cd /etc/rc.d/
-bash: [root@CentOS6: command not found
[root@CentOS6 rc.d]#[root@CentOS6 rc.d]#ls
-bash: [root@CentOS6: command not found
[root@CentOS6 rc.d]#init.d  rc  rc0.d  rc1.d  rc2.d  rc3.d  rc4.d  rc5.d  rc6.d  rc.local  rc.sysinit^C
[root@CentOS6 rc.d]#ls rc3.d
K01smartd          K60nfs             K88sssd          S10network      S24rpcgssd           S80postfix
K02oddjobd         K61nfs-rdma        K89netconsole    S11auditd       S25blk-availability  S82abrt-ccpp
K05wdaemon         K69rpcsvcgssd      K89rdisc         S11portreserve  S25cups              S82abrtd
K10psacct          K73winbind         K92pppoe-server  S12rsyslog      S25netfs             S90crond
K10saslauthd       K74ntpd            K95firstboot     S13cpuspeed     S26acpid             S95atd
K15htcacheclean    K75ntpdate         K95rdma          S13irqbalance   S26haldaemon         S99certmonger
K15httpd           K75quota_nld       K99rngd          S13rpcbind      S26udev-post         S99local
K30spice-vdagentd  K76ypbind          S01sysstat       S15mdmonitor    S27pcscd
K36mysqld          K84NetworkManager  S02lvm2-monitor  S22messagebus   S28autofs
K50dnsmasq         K84wpa_supplicant  S08ip6tables     S24nfslock      S50bluetooth
K50kdump           K87restorecond     S08iptables      S24openct       S55sshd

例如/etc/rc.d/rc3.d目录下有很多K或者S开头的文件,这些文件会被一一执行。其中K表示杀死对应服务,S表示启动对应复位。后面的数字字符串表示执行顺序。先执行K,后执行S。

6、执行/bin/login程序,等待用户登录

你可能感兴趣的:(Linux启动流程)