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程序,等待用户登录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 系统启动是一项非常复杂的程序,因为内核得先检测硬件并加载适当的驱动程序后,接下来则必须要调用程序来准备好系统运行的...
    Zhang21阅读 12,366评论 3 10
  • 一:简述 Linux-Ceentos系统开机启动流程简述如下,后续小节会对重要节点做详细描述 1:加电自检 --...
    mapipi阅读 426评论 0 1
  • 经过对Linux系统有了一定了解和熟悉后,想对其更深层次的东西做进一步探究。这当中就包括系统的启动流程、文件系统的...
    大福技术阅读 1,867评论 0 13
  • Linux的启动流程如下: 1.计算机加载BISO,它其中一项很重要的功能是对自身的健康进行检查,只有在硬件没有问...
    疯狂的老鸟阅读 196评论 0 0
  • 我们都知道,由于linux的稳定性,通常被作为服务器系统,要想称为一个PHP的高手,linux是必修之课。那么li...
    李劲辉阅读 142评论 0 0

友情链接更多精彩内容