linux系统启动流程详解

一、 为什么要研究linux系统启动:

    或许有人会说,等它开机就好了,为什么还要研究它开机流程呢,其实如果服务器运行很好又没有人为的误操作等,或许不用研究,但是为了能在系统出问题后第一时间的修复它,又或者你忘记了root密码等情况时就非常有必要研究一下linux的开机流程了,因为只有知道了它是如何运作的,才能让它更好的服务与人类,废话不多说,正文开始

二、系统启动流程:

    不同的版本的linux系统开机可能不同,但是总的来说,大同小异,下面就以centos6.8的系统为例,介绍linux的开机过程。

post加电自检—> MBR引导–> GRUB引导—>加载内核—>启动init—>各种初始化脚本运行—>执行/bin/login —>开机过程结束

1111.png

1.   加电自检:  

    加电自检post(power on system test):加电自检主要是检查各硬件是否存在并能正常运行,包括cpu,内存,硬盘,cpu风扇,有的甚至包括键盘鼠标的外设的检测,这一段名叫BIOS的程序是存放在CMOS的硬件芯片上面,加电就是给CMOS 加电,由于CMOS是rom芯片,所以还有一个单独的ram芯片用来存放它的配置信息,这就是主板为什么要放一块电池的原因了。

2.   选择启动顺序加载MBR(master boot recoder)启用bootloader程序加载内核:

    经过一系列的硬件检测完毕后,并顺利通过后,就要加载MBR了,MBR存放在第一个可启动硬盘的第一个分区内,大小为512byte,这512个字节当中前446byte就是bootloader,以及随后的64字节的分区表,2byte分区结束标志,第一部分的bootloader部分就是主引导记录的第一部分,因为引导程序功能较为强大并且会有驱动文件,是446byte字节能存放,后续将介绍它的其它部分。第一部分的bootloader程序会调用512个字节之后的一部分扇区中的数据,这些数据包括/boot分区的驱动,因为软件和硬件的连接必须通过驱动的翻译,此时通过/boot分区的驱动,加载好了/boot,该分区中包含了grub程序的第二部分,和内核镜像文件,还有就是initramfs文件,如果此时加载  / 分区的话,因为 / 分区不一定和 /boot 分区是同一种文件系统,不同的文件系统需要的文件系统的驱动是不同的,所以grub会将initram文件加载至内存当中解压,并且此时要加载内核文件,解压后会在该文件系统形成一个类似于 / 的文件系统 在此时的 “/” 中的lib中有系统真正的 / 的各种文件系统驱动,此时就可以加载根文件系统了

3.   启动init以及各种启动脚本:

    加载好根文件系统就要启动用户的第一个执行程序/sbin/init*, 其中包括/etc/inittab ,/etc/init/*.conf(在centos5中是直接一个/inittab文件,顺序执行,速度较慢,到了6时许多被依赖的程序服务等先执行,并且没有依赖关系的也同时执行,到了7时配置文件变成了/usr/lib/systemd/* 此时系统的启动就已经非常快了,许多服务都可以同时启动,即使是被依赖的也可以并行启动,加快了开机速度)

  init文件主要定义了下面的几项:

(1) 开机启动级别选择0-6共七个:

            0:关闭所有服务关机

            1: 维护模式的单用户模式

            2: 维护模式的多用户模式

            3:正常级别,多用户模式

            4:未定义

            5:正常级别,带有图形化的多用户模式

            6:关闭所有服务重启

            注:可以使用runlevel,或者who -r 命令检查当前系统的运行级别

 

(2)   使用/etc/rc.d/rc.sysinit 进行系统初始化

            a)     根据配置文件进行设置主机名

            b)     打印文本欢迎信息

            c)     激活Selinux和udev

            d)     挂载所有定义在/etc/fstab文件的文件系统

            e)     激活swap分区

            f)      检测根文件系统并实现以读写挂载根

            g)    设置系统时钟

            h)    根据/etc/sysctl.conf文件设定内核参数

            i)      激活LVM和RAID设备

            j)     加载额外的设备驱动

            k)    清理操作

 

(3)   执行选择了开机启动的级别下相应的脚本/etc/rc.d/rc#.d

    /etc/rc.d/rc#.d/ 该目录的执行需要根据/etc/init/rc 文件选择是否启动什么服务,在rc文件当中执行一个for循环先执行K*的文件的服务进行stop,S开头的服务启动在相应的启动级别下面都是许多个软链接文件,这些文件指向/etc/rc.d/下面的服务脚本,并且这些软链接文件分别是以S开头和K开头的文件,S表示在该运行级别要启动的服务,K开头的表示该级别不需要启动的服务,有人会说,在开机是该服务就没有启动,为什么还要停一次呢?本来服务就没有启动,停它干啥?确实是这样,但是你有没有想过,假如在运行级别3已经开启了该服务,但是你想要切换至运行级别5,而5的级别恰巧不需要启动该服务怎么办?当然应该停掉了!所以,在rc脚本中for循环里使用了判断如果在/var/lock/subsys/下面有该服务时,循环执行continue,跳过启动语句执行下一次循环,知道循环结束,/var/lock/subsys/目录中只要启动一个服务在这个锁文件目录中就会产生一个文件。这样通过执行/etc/init/init#.d/ 下面的所有服务脚本,就可以启动所有系统的脚本了。

    如果自己想定义一个脚本想要像是系统服务那样启动怎样做?

在/etc/init/init.d/下面有大量的服务脚本,可以参考,要想系统定义的脚本那样包括#!/bin/bash 这一行的shell定义,chkconfig定义,以及描述相关的description:将写好的脚本放在该目录下面使用chkconfig –{add|del} 脚本名字添加或者删除脚本。

附:服务脚本头部示例:

[root@cnode6_8 init.d]# head -n 12 nfs
#!/bin/sh
#
# nfs           This shell script takes care of starting and stopping
#               the NFS services.
#
# chkconfig: - 30 60
# description: NFS is a popular protocol for file sharing across networks.
#              This service provides NFS server functionality, which is \
#              configured via the /etc/exports file.
# probe: true
# config: /etc/sysconfig/nfs

当然在也/etc/rc.local 或者/etc/rc.d/rc.local两个文件中定义自己的脚本执行路径,只不过在该文件中定义的文件执行优先级为最低的,要等到所有的系统服务脚本执行完,才能执行

(4)   配置ctrl+alt+del键的功能,建议关闭此功能防止误操作重启服务器。

该配置在centos5中就直接在/etc/inittab中,到了6之后可以通过/etc/inittab文件的注释看到该配置已经转移到了/etc/init/control-alt-delete.conf当中将该行注释掉即可

(5)   配置不断电系统pf,pr两种机制

这两种机制是为了保护系统,在系统突然断电时,保证系统能正常关机,但是有可能是因为电源不稳定而突然断电,然后再很短的时间内电源再次有了电,此时就应该取消关机,默认是在2min之后关机,但是在2min之内有电后会取消关机

(6)   启动mingetty 6个终端

在6个终端中因为有前面定义respawn关键字,所以这6个终端变成了打不死的小强,当你用kill将它们其中一个杀死后,系统会换一个进程号重新启动它

(7)   如果选择5级别,则会启动 /etc/X11/prefdm -nodaemon启动图形化界面

   

至此系统已经能正常进入启动状态啦!

 

原创文章,作者:jack_cui,如若转载,请注明出处:http://www.178linux.com/45823

(0)
jack_cuijack_cui
上一篇 2016-09-13 11:17
下一篇 2016-09-13 11:17

相关推荐

  • 第十八周作业

    1.LNMP架构添加Memcached支持,并验证其缓存结果 Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。 Memcached是以守护程序(监听)方式运行于一…

    2017-07-07
  • 马哥教育网络班22期+第8周课程练习

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。 网桥:是连接两个局域网的基于MAC地址数据存储转发设备,工作于数据链路层 集线器:所有端口处于同一个广播域和冲突域中,带宽共享,工作于物理层 二层交换机:多端口网桥,一个端口一个冲突域,默认所有端口位于同一个广播域中,可以划分vlan,隔离广播域,带宽独享 三层交换机:具有路由功…

    Linux干货 2016-10-17
  • ansible自动化运维工具使用详解

    一、ansible简介   1.ansible        ansible是新出现的自动化运维工具,基于Python研发。糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。仅需在管理工作站上安装ansible程序配置被管控主机的IP信息,被…

    2016-04-30
  • SQL Server 2012 故障转移群集最佳实践

    一、Windows server  2012 系统主域的安装配置 功能介绍:  SQL Server 故障转移群集在网络上显示为一台计算机上的单个 SQL Server 实例。在群集内部,一次只有一个节点拥有群集资源组,满足针对该故障转移群集实例的所有客户端请求。在出现故障(硬件故障、操作系统故障、应用程序或服务故障)或进行计划升级时,组…

    Linux干货 2015-10-27
  • 重定向和管道

     重定向    程序:指令+数据    读入数据:Input    输出数据:Output  linux给程序提供三种I/O设备    标准输入(stdin)-0 默认接受来自键盘的输入    标准输出(stdinout)-1默认输出到终端…

    Linux干货 2016-08-10
  • 网络管理3

    七、网络接口配置-bonding     Bonding         就是将多块网卡绑定同一IP地址对外提供服务,可以实现高可用或者负载均衡。当然,直接给两块网卡设置同一IP地址是不可能的。通过bonding,虚拟一块网卡对外提供连接,…

    Linux干货 2016-09-10

评论列表(1条)

  • 马哥教育
    马哥教育 2016-09-23 13:15

    写的很详细,图片是自己画的吗?很不错哦,