您的位置:首页 > 运维架构 > Linux

CentOs 系统启动流程相关

2017-05-13 07:19 344 查看

CentOS的启动流程

1)加载BIOS 的硬件信息,获取第一个启动设备

2)读取第一个启动设备MBR 的引导加载程序(grub) 的启动信息

3)加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备

4)核心执行init 程序,并获取默认的运行信息

5)init 程序执行/etc/rc.d/rc.sysinit 文件

6)启动核心的外挂模块

7)init 执行运行的各个批处理文件(scripts)

8)init 执行/etc/rc.d/rc.local

9)执行/bin/login 程序,等待用户登录

10)登录之后开始以Shell控制主机

接下来我们根据CentOS的启动流程进行一步步的详解,介绍的内容不深但是能让你对大概流程有个大概的映像。

1)步骤是加载BIOS的硬件信息,获取第一个启动设备

      这个步骤的主要是: POST(power on system test):加电自检,主要步骤检测CPU、内存、硬盘等内部设备是否能够正常运行,以及外部设备是否正常存在,自检是由BIOS这个基本输入输出系统实现,它是装载在硬件芯片CMOS之上,CMOS上面有一些配置信息会去读取其他的硬件设备信息检测是否能够正常运行,接下来进行硬件设备的初始化,当初始化步骤完成以后BIOS会列出可以启动的装置,由于不同操作系统文件系统之间的不同,为了避免一个格式信息不兼容会将启动一个管理程序Boot loader,这时我们进入第二个阶段。

 

2)读取第一个启动设备MBR 的引导加载程序(grub) 的启动信息

3)加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备

   Boot loader存在于硬盘第一个扇区内就是在MBR(主引导记录)前446字节当中。boot loader的主要功能是为了识别,加载操作系统中的核心文件,并提交到内存中运行,进而来启动对应的操作系统,在boot loader中会提供菜单信息向使用这提供不同的启动项目,来加载不同的操作系统,并将启动管理功能转交给其他的加载程序。

     这个时候又到了grub的阶段,在这里有三个阶段    #这个软件有好几个部分,MBR部分就是第一个阶段

    primary boot loader :

    1st stage      #第一阶段里面存放在硬盘的第一个扇区里的446字节也就是MBR部分,这里存放这第二阶段内容的指向

[root@magedu6 ~]# hexdump -C -n 512 /dev/sda -v  #MBR的前446字节
00000000  eb 48 90 10 8e d0 bc 00  b0 b8 00 00 8e d8 8e c0  |.H..............|
00000010  fb be 00 7c bf 00 06 b9  00 02 f3 a4 ea 21 06 00  |...|.........!..|
00000020  00 be be 07 38 04 75 0b  83 c6 10 81 fe fe 07 75  |....8.u........u|
00000030  f3 eb 16 b4 02 b0 01 bb  00 7c b2 80 8a 74 03 02  |........q...q...|
...省略
000001e0  ff ff 82 fe ff ff 00 08  e2 04 00 80 3e 00 00 fe  |............>...|
000001f0  ff ff 05 fe ff ff 00 88  20 05 00 78 5f 07 55 aa  |........ ..x_.U.|

   1.5 stage      #1.5阶段让我们识别/boot驱动446字节记录找到2阶段的内容。意思是通过1阶段里记录的2阶段的内容去模拟一个ext4的文件系统去加载第二阶段的内容。

[root@station159 boot]# ls /boot/grub
device.map     grub.conf         minix_stage1_5     stage2
e2fs_stage1_5  iso9660_stage1_5  reiserfs_stage1_5  ufs2_stage1_5
fat_stage1_5   jfs_stage1_5      splash.xpm.gz      vstafs_stage1_5
ffs_stage1_5   menu.lst          stage1             xfs_stage1_5 

    secondary boot loader :2nd stage ,分区文件

      这里就是boot loader的最后一个阶段了,这个时候内核可以在虚拟的根文件系统上加载合适的驱动程序来加载硬盘等设备,之后释放虚拟的根文件系统,并以只读的方式挂载磁盘上的根文件系统,之后开始正常的启动过程了    #这个时候以只读的方式挂载原因是防止一些破坏性的操作,等操作系统启动到一定步骤的时候还会重新以读写的方式重新挂载。

  ramdisk :辅助的伪根系统,这个系统能够通过boot loader程序将其加载到内存当中,然后这个文件会被解压缩并且在内存中模拟一个根文件系统,这个根文件系统能够提供一个可以运行的程序,这个程序用来加载启动过程中需要的核心模块(RAID,LVM/SCSI等文件系统与磁盘的驱动程序等),加载完成后会协助内核重新呼叫/sbin/init来执行后续的正常启动,而这个程序存在/boot下,属于安装系统的时候临时生成的。这个文件是一个压缩文件

[root@magedu6 ~]# cat /etc/inittab
# inittab is only used by upstart for the default runlevel.
#
...省略
id:5:initdefault:
在6里这个文件重要的一行代码只有这行,设置的默认启动级别,而它其他的配置写在了/etc/init/*.conf里了
[root@magedu6 ~]# ls /etc/init/
ck-log-system-restart.conf  rcS.conf
ck-log-system-start.conf    rcS-emergency.conf
ck-log-system-stop.conf     rcS-sulogin.conf
control-alt-delete.conf     readahead-collector.conf
init-system-dbus.conf       readahead.conf
kexec-disable.conf          readahead-disable-services.conf
plymouth-shutdown.conf      serial.conf
prefdm.conf                 splash-manager.conf
quit-plymouth.conf          start-ttys.conf
rc.conf                     tty.conf
View Code Systemd :systemd, CentOS 7 #在7中的启动速度最快的原因是采用Systemd的方式,其特点是服务只有第一次被访问时才会真正的启动起来。 配置文件:/usr/lib/systemd/system /etc/systemd/system #7里暂时不做详细介绍,以后有时间再来整理。

 

5)init 程序执行/etc/rc.d/rc.sysinit 文件    

 在init执行的第二步执行系统初始化过程。

/etc/rc.d/rc.sysinit: 系统初始化脚本 (1) 设置主机名 (读取/etc/sysconfig/network文件中的HOSTNAME进行) (2) 设置欢迎信息 (3) 激活udev 和selinux (4) 挂载/etc/fstab 文件中定义的文件系统 (5) 检测根文件系统,并以读写方式重新挂载根文件系统 只读模式挂载,最后才改成可读可写 (6) 设置系统时钟 (7) 激活swap 设备 (8) 根据/etc/sysctl.conf 文件设置内核参数 (9) 激活lvm 及software raid 设备 (10) 加载额外设备的驱动程序 (11) 清理操作

6)启动核心的外挂模块

7)init 执行运行的各个批处理文件(scripts)

    在系统/etc/rc.d/rc.sysinit初始化完成系统之后,此时系统就已经可以正常工作了,只是还缺少启动时所需要的各项服务,这样主机才能提供一些我们需要的功能,如网络服务、dhcp服务等功能这里通过inittab里面提到的l3:3:wait:/etc/rc.d/rc 3配置了,而这里其实是通过/etc/rc.d/rc3.d/下所有链接文件来决定如何启动或关闭服务;素有以S开头的都被传递start参数启动,所有以K开头的,都被传递stop参数以停止。

    而/etc/rc.d/rc3.d/下的所有链接文件都是在/etc/init下面的所有脚本,而这些脚本都必须至少接受四个最基本的参数,{start|stop|status|restart}

脚本在指定级别启动还是停止的控制方法:

这些脚本开头:

#chkconfig : S N N K N   #这里的S N N两个N都是表示优先启动级别   而K那里的N则是停止服务时候的级别。 

 #description:             #这一行在centos5里必须准确写,而6里能帮你识别。

而这些符号链接的创建可通过chkconfig命令来实现

  -add:为某存放在/etc/init.d的服务在对应的/etc/rc.d/rc0-6.d目录添加符号链接:

  -del:把指定SVC_SCRIPTS的在7个级别符号链接统统删除

[root@station159 ~]# chkconfig --list  #打印列表
NetworkManager  0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭
acpid           0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
anacron         0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
....省略
ypbind          0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭
yum-updatesd    0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
[root@station159 ~]# chkconfig nfs on  #开启服务
nfs             0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
[root@station159 ~]# chkconfig nfs off  #关闭服务
nfs             0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭
[root@station159 ~]# chkconfig --level 135 nfs on #开启指定级别的服务
[root@station159 ~]# chkconfig --list
nfs             0:关闭  1:启用  2:关闭  3:启用  4:关闭  5:启用  6:关闭

#基于 xinetd 的服务: #这里分为独立服务和非独立服务
#xinetd #被称为超级守护进程,他也是服务,被他服务的,叫非独立服务,在centos 7里全部是非独立服务了。

chargen-dgram:  关闭
...省略
time-dgram:     关闭
time-stream:    关闭

[root@station159 ~]# ls /etc/init.d/ #这里的服务都能通过chkconfig 命令修改状态,当然也能通过上面说的修改文件上面的两行。
acpid               dund        killall         nscd             single
anacron             firstboot   krb524          ntpd             smartd
apmd                functions   kudzu           pand             squid
atd                 gpm         libvirtd        pcscd            sshd
auditd              haldaemon   lvm2-monitor    portmap          syslog
autofs              halt        mcstrans        psacct           tux
avahi-daemon        hidd        mdmonitor       rawdevices       vncserver
avahi-dnsconfd      hplip       mdmpd           rdisc            wdaemon
bluetooth           httpd       messagebus      readahead_early  winbind
capi                ip6tables   microcode_ctl   readahead_later  wpa_supplicant
conman              ipmi        multipathd      restorecond      xfs
cpuspeed            iptables    netconsole      rhnsd            xinetd
crond               irda        netfs           rpcgssd          ypbind
cups                irqbalance  netplugd        rpcidmapd        yum-updatesd
cups-config-daemon  iscsi       network         rpcsvcgssd
dc_client           iscsid      NetworkManager  saslauthd
dc_server           isdn        nfs             sendmail
dnsmasq             kdump       nfslock         setroubleshoot

8)init 执行/etc/rc.d/rc.local

注意:正常级别下,最后启动一个服务S99local 没有链接至/etc/rc.d/init.d 一个服务脚本,而是指向/etc/rc.d/rc.local 脚本 不便或不需写为服务脚本放置于/etc/rc.d/init.d/ 目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local 文件中 • /etc/rc.d/rc.local 在指定运行级别脚本后运行 • 可以根据情况,进行自定义修改

9)执行/bin/login 程序,等待用户登录

10)登录之后开始以Shell控制主机

 

启动流程的简单版本:post-mbrstage1 --stage1.5--stage2 grub.conf--vmlinuz root=/dev/sda2 , initramf---init--/etc/inittab--/etc/rc.c/rc.sysinit---/etc/rcn.d/s* k*---/etc/rc.d/rc.local--login --X

CentOS 6 启动流程:POST --> Boot Sequence(BIOS) --> Boot Loader -->Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 别 设定默认运行级别 --> 系统初始化脚本 rc.sysinit --> 务 关闭或启动对应级别的服务 --> 启动终端

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: