学习笔记之Centos6的启动流程。

来源:互联网 发布:天刀脸型数据女萝莉 编辑:程序博客网 时间:2024/06/05 15:46

      由于centos7和6相比做出了很大的改观。首先就是启动加载器不同了。

centos6采用 GRUB Legacy,而7采用GRUB2.差异还包括Centos7为了支持大数据环境而使用xfs文件系统。

默认数据库为了迎合未来市场而采用mariadb而不是mysql。最重要的是centos7还采用了systemd初始进程而不是init了

后面还会讲7的启动


一.centos6的启动流程

由于我没有装centos6,就用redhat6代替了,其实2个都一样(redhat和centos是双胞胎兄弟)


首先看一下我的操作系统环境。


其红帽子6的启动流程大致如下图


第一步:POST 加电自检

                 检查硬件的是否健康。如cpu风扇是否正常,内存是否正常,时钟是否正常,这个过程是读取ROM上的指令执行的

               


第二步:加载BOIS

                 Boot-Sequence。CPU要寻找外部I/O哪里有操作系统可以启动。并设置启动优先级(操作系统可以安装的地方很多啊,硬盘,U盘,甚至网络PXE)。bois通过INT 13取得boot loader

              

    

第三步:读取MBR

                 硬盘上的第0磁道的第一个扇区被称作MBR,Master Boot Record(主引导记录)共512字节。这里存放着分区表和主引导程序。其中引导程序446字节,分区表64字节,魔数2字节。


第四步:Boot Loader

                 446字节。找到操作系统所在分区.其中Grub,Lilo就是常见的Loader。其中redhat6是grub。系统会读取grub配置信息。并按照配置信息去驱动不同的操作系统(下图就是grub的配置信息).详细的后面有说

         

也就是说。boot loader 可以提供菜单,载入内核,也可以转交其他的loader



第五步:加载内核

                 将内核加载进内存。在内存完成解压缩(这时,屏幕一般会出现“OK, booting the kernel”)。内核会接管件,BootLoader退出。内核开始探测各个硬件,提供文件系统,进程管理,网络管理。并加载硬件驱动。完成Linux核心环境。基于Linux的程序开始运行。

          

这里稍微提一下(Linux是单内核,所以对线程支持不是太好,再linux中线程是LWP<轻量级进程>)


   值得注意的一个很重要的过程是linux通过动态加载内核模块。而这些模块在/lib/modules内。而/在硬盘上。内核不认识硬盘,而想要认识硬盘就必须加载modules里的模块。这就成了鸡生蛋,蛋生鸡的问题了。

   为了解决,则出现了虚拟文件系统(initrd)。他也可以通过boot loader加载进内存,并解压缩成一个仿真的根目录,这里面就有需要的模块。

/boot目录  (核心档案说的就是内核)

               

加入虚根后的启动详细流程

            


第六步:用户层init执行

                用户空间的初号进程诞生。/sbin/init  (其PID为1)

init                 (8)  - Upstart process management daemon

       

读取/etc/inittab文件,并依据此文件来进行初始化工作。指明linux主机需要运行再什么级别上

Linux的运行等级如下

0:关机

1:单用户模式              直接以超级用户身份登录,不需要密码

2:无网络支持的多用户模式       如果有nfs。就不会去挂载nfs

3:有网络支持的多用户模式       就是常用的字符界面

4:保留

5:图形界面                   有X-Windows。有图形界面

6:重启


第七步 : init进程执行初始化脚本

                     init进程去执行/etc/rc.d/rc.sysinit脚本程序。他是一个bash脚本。工作很多,其如下

激活udev和selinux

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

设定时钟

装载键盘映射

设置主机名

根文件系统检测,并以读写方式重新挂载

激活raid和lvm

启用磁盘配额

根据/etc/fstab挂载其他的文件系统

清理过期的锁文件

看看脚本执行时的屏幕输出


第八步:启动其他内核模块(可以和上步合成一步)

                    其过程是在/etc/rc/rc.sysinit内执行的,所以可以说是上面那步装载相应的内核模块。依据/etc/modules.conf或者/etc/sysconf/modules下的内容来装载内核模块

                          

 

第九步:根据运行级别执行初始化工作并且启动相应的服务

                    首先运行rc.d判断运行级别后执行相应的脚本就是rc3.d下(假设为3级别)下的那些K和S开头的文件。后面的附加3有详细的说明

                  

第十步 : 执行/bin/login。等待用户登录









附加1:这里提一下引导的详细步骤。在bootloader时期的引导以grub为主。(Lilo在嵌入式上用的比较多)

步骤1.grub1


步骤2.grub1_5


步骤3.grub2


其中下图为配置文件

default=0     #默认启动哪个timeout=5     #等待时间splashimage=(hd0,0)/grub/splash.xpm.gz    #启动图片hiddenmenu    #隐藏菜单title Red Hat Enterprise Linux (2.6.32-431.el6.x86_64)    #标题        root (hd0,0)     #内核文件所在设备        kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=041526d3-9b42-46cd-9d1e-3bfb8ac25b61 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet        initrd /initramfs-2.6.32-431.el6.x86_64.img    #虚根



附加2:装载第一个进程init

第一个进程,也就是所有进程的鼻祖。我们知道,所有进程都是一个一个fork复制出来的。再exec。所以第一个进程很重要

传统init是串行启动,就是一个接一个的启动

最新的有ubuntu开发的upstart也是init进程,但他支持并行的启动好多进程 ,他基于d-bus。进程间通信,统一管理。基于事件来完成启动。(红6就是用这个)

   他的启动放在了不同文件。所有的启动都是基于事件驱动。

 在/etc/init目录下有配置文件,/etc/init.d下有相关脚本





还有就是centos7 的systemd,就是纯粹的并行启动 (centos7)



附加3:/etc/rc.d/rc5.d下的下的脚本

在rc.d下会执行这些文件。这些文件是干什么的呢

里面有K开头的脚本和S开头的脚本。数字是有顺序

也就是说会先按顺序执行按K开头的文件,再执行按S开头的文件

K代表停止某服务,S代表开启某服务。

其都是链接文件。每个脚本会在开机时被执行一边。这些都是sysV风格的脚本

在/var下有个lock文件,这个文件会在服务启动时,创建一个锁文件。当服务停止,就删除这个锁文件

系统通过锁文件来判断服务是否启动


其中有一个脚本大家一定很熟悉。那就是rc.local。这个文件当我们写入命令后,开机就会执行



附加4:守护进程的类型

            独立守护进程

                        xinetd:超级守护进程(代理人)用来管理瞬时守护进程

            瞬时守护进程,不需要关联至运行级别。


1 0