码迷,mamicode.com
首页 > 其他好文 > 详细

CentOS启动流程

时间:2018-02-24 16:51:47      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:CentOS 5和6启动流程   CentOS 7启动流程   

一、CenOS 5和6启动流程:

CentOS启动流程总体来说有以下步骤:

POST --> BootSequence(BIOS) --> Bootloader(MBR) --> Kernel(ramdisk) --> rootfs(只读) 
--> switchroot --> init(CentOS 7为systemd) --> /etc/inittab --> 读取默认运行级别 --> 
运行系统初始化脚本, 完成系统初始化 --> 关闭对应级别下需要关闭的服务, 启动需要启动的服务 --> 设置登录终端

二、启动流程拆解

2.1 POST加电自检

系统启动的第一个步骤, 打开电源, 这时候主板上的BIOS芯片中的CMOS就会对整个硬件进行自检, 如果自检通过就会进入到下一个步骤, 引导加载次序.

2.2 BootSequence(BIOS)

这一步还是跟BIOS有关, 自检通过, BIOS按次序查找各引导设备, 第一个有引导程序的设备即为本次启动用到的设备.

2.3 bootloader(MBR)

bootloader是一个程序, 其作用是提供一个菜单, 允许用户选择要启动的系统或者不同版本的内核, 然后把用户选定的内核或者系统装载到内存特定的空间中, 解压、展开后将系统的控制权移交给内核.
目前常用的bootloader:

  • ntloader(Windows)
  • Grub(GRand Uniform Bootloader): 识别硬盘上的文件系统; 查找并列出可启动的操作系统.

2.3.1 MBR

MBR(主引导记录), 存放在硬盘的0扇区, 总共有512 Bytes, 其中446 Bytes装的是bootloader, 64 Bytes为分区表, 最后2 Bytes为MBR的有效性标识(55AA)

2.4 Kernel初始化

这一步中, 主要由以下几个步骤:

  • 探测可识别到的所有硬件设备
  • 加载硬件驱动程序, 首先加载硬盘的驱动程序(可能会借助于ramdisk加载驱动)
  • 以只读方式挂载根文件系统(rootfs)
  • 运行用户空间第一个应用程序: /sbin/init
    • SysV: CentOS 5; 配置文件(/etc/inittab)
    • Upstart: CentOS 6; 配置文件(/etc/inittab, /etc/init/*.conf)
    • Systemd: CentOS 7; 配置文件(/usr/lib/systemd/system/, /etc/systemd/system/)

2.4.1 如何加载硬盘驱动

内核要识别硬盘上的分区, 必须要有硬盘的驱动才行, 可是Linux的内核为了保持足够轻便, 硬件驱动并没有装载至内核中, 而是通过modules的形式插入内核中的, 所以这时候需要调用ramdisk文件. ramdisk中会存有装系统时当前主机的硬盘驱动, 通过ramdisk文件将硬盘驱动装载上, 使得内核可以加载各分区, 从而加载到各个硬件驱动, 然后在将控制权交回给内核.

2.5 init

init启动后会从其配置文件中读取运行级别, 总共有七个级别, 如下所示:

  • 0: shutdown
  • 1: 单用户模式(root, 无需登录), 又叫single(维护模式)
  • 2: 多用户模式, 会启动网络功能, 但不会启动NFS(维护模式)
  • 3: 多用户模式, 正常模式, 文本界面
  • 4: 预留级别, 可同3级别一样使用
  • 5: 多用户模式, 正常模式, 图形界面
  • 6: reboot

2.5.1 相关命令

2.5.1.1 init命令

init - 用户切换级别
用法: init \<\0~\6\>

2.5.1.2 查看当前级别

命令1: runlevel
命令2: who -r

2.5.1.3 chkconfig命令

chkconfig - 查看服务在所有级别的启动或关闭设定情形
查看: chkconfig [--list] [name]
添加: chkconfig --add name
删除: chkconfig --del name
修改指定级别的链接类型: chkconfig [--level levels] name \<\on|off|reset\>

# --level levels: 指定要设定的级别, 省略表示2345

NOTE: 正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,只是指向了/etc/rc.d/rc.local脚本,因此,不便或不需要写为服务的脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可以直接放置于/etc/rc.d/rc.local文件中

2.6 系统初始化脚本

CentOS 5和6中的系统初始化脚本位于/etc/rc.d/rc.sysinit, 其主要执行以下工作:

  • 设置主机名
  • 设置欢迎信息
  • 激活udev和selinux
  • 挂载/etc/fstab文件中定义的文件系统
  • 检测根文件系统, 并以读写方式重新挂载根文件系统
  • 设置系统时钟
  • 激活swap设备
  • 根据/etc/sysctl.conf文件设置内核参数
  • 激活lvm及software raid设备
  • 加载额外设备的驱动程序
  • 清理操作

2.7 /etc/rc.d/rc#.d/

此目录下定义的是对应级别下的各种服务脚本, 通过ls查看, 内如如下:

[root@localhost ~]# ls /etc/rc.d/rc3.d/
K10saslauthd  K50netconsole   K89rdisc         S08ip6tables  S10network  S12rsyslog           S25netfs      S55sshd     S90crond
K15svnserve   K87restorecond  S02lvm2-monitor  S08iptables   S11auditd   S25blk-availability  S26udev-post  S80postfix  S99local

其中S代表开机要启动的服务, K开头的是关机要执行的服务. rc#.d的#代表运行级别.

2.8 设置登录终端

这一步就是执行/bin/login程序, 等待用户登录了.

三、CentOS 7启动流程

CentOS 7启动流程与CentOS 5和6差不多, 只不过init程序改为了systemd, 下面详细解释下Systemd后的启动流程.

3.1 执行initrd.taget

这一步主要是挂载/etc/fstab中的文件系统, 挂载完成后切换到根目录.

3.2 从initramfs根文件系统切换到磁盘根目录

3.3 执行默认target配置

CentOS 7没有以前版本的运行级别概念, 但是为了向下兼容, 它对每个运行级别都有一个对应的软件界指向, 如下所示:

level 0 ==> runlevel0.target, poweroff.target
level 1 ==> runlevel1.target, rescue.target
level 2 ==> runlevel2.target, multi-user.target
level 3 ==> runlevel3.target, multi-user.target
level 4 ==> runlevel4.target, multi-user.target
level 5 ==> runlevel5.target, graphical.target
level 6 ==> runlevel6.target, reboot.target

默认启动级别由/etc/systemd/system/default.target文件指定, 这是一个软连接文件, 这个连接指向的文件即为启动时的默认级别.

[root@zabbix bin]# ls -l /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 37 Jul  5  2017 /etc/systemd/system/default.target -> /lib/systemd/system/multi-user.target

3.4 执行basic.target

初始化系统及basic.target准备操作系统, 在CentOS6上为rc.sysinit程序.

3.5 启动相关target下的服务

最后启动相关服务, 并设置登录终端.

CentOS启动流程

标签:CentOS 5和6启动流程   CentOS 7启动流程   

原文地址:http://blog.51cto.com/13501622/2072644

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!