由于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
stage1:/boot/grub中的stage1文件大小为512b,它是引导扇区中引导程序(前446字节为引导程序)的备份文件,功能是用来装载 stage1.5或stage2的。
stage1.5:因为STAGE2较大,通常都是放在一个文件系统当中的,但是STAGE1并不能识别文件系统格式,所以才需要STAGE1.5来引导位于某个文件系统当中的STAGE2,根据文件系统格式的不同,STAGE1.5也需要相应的文件,如:e2fs_stage1_5,fat_stage1_5,分别用于识别ext和fat的文件系统格式
stage2:grub能让用户以选项方式将OS加载、改变参数、修改选项,这些全都是stage2程序的功能。stage2可以去获取grub.conf以及menu.lst等文件的内容。
其中下图为配置文件
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:超级守护进程(代理人)用来管理瞬时守护进程
瞬时守护进程,不需要关联至运行级别。