1.Centos 5.6的启动流程

linux:kernel +rootfs+(int)
kernel : 进程管理(系统调用),内存管理,网络管理,驱动程序,文件系统。安全功能。
rootfs:
glibc 标准库
库:函数集合, function:调用接口 库文件(二进制程序)没有自我独立的运行的入口,只能在被调用时使用。
过程调用:procedure 不返回值,只是做了一些事
函数调用:function必须有返回值
程序:
内核设计流派:
汇编语言实现的内核,效率高但是不易移植
单内核(宏内核)设计: 把所有功能做成一个程序每一个功能在程序中使用线程来实现 ()
微内核:每一功能都是由子系统实现的然后在使用中央调配系统实现某个功能就让子程序系统之间相互通信
单内核:linux
微内核:windows, solaris
linux 内核 支持模块化,.ko(内核模块,对象) 用户空间的库叫.so 支持模块的装卸载。(很多内核的都可以模块化)按需装载模块

组成部分:

1.核心文件 /boot/vmlinux-VERSION(内核的版本号)-release(rpm包的发行号)

2.模块文件:/lib/modules/内核版本号+rpm包得发行号/(内核模块相互以来的文件 )真正存放内核模块的文件在kernal目录中 /lib/modules/内核版本-rpm发行版本/kernal/中存在一下文件arch(平台相关的内容) crypto(加密隐秘安全等功能) drivers(驱动) fs(文件系统) kernel(基本核心内容) lib(库文件) mm(内存管理) net(网络) sound(声音子系统) virt drivers 驱动文件网卡驱动

3.非必要组件 randisk 基于内存的磁盘(本地回环文件吧文件当磁盘来用) (系统启动时加载内核和它) 用户操作系统完成安装后自动生成。(安装有该系统安装的文件系统驱动)。使得内存可以加载到真正的根 然后做根切换

randisk :两种格式

centos 6 7一种模拟成文件系统 有效提高效率 /boot/  initramfs-VERSION(内核的版本号)-release.img  
centos 5之前一种模拟成硬盘 /boot/initrd-VERSION(内核的版本号)-release   

centos启动流程

cpu一加电就开始运行参与硬件自检,去rom中找地址,
POST:加电自检(自检的整个过程中需要CPU的参与):硬件平台检测所需要的硬件是否能正常到的工作 由 ROM:CMOS ( BIOS:basic INput and output system 装载到rom	)   
ROM+RAM RAM特定位置  

BOOT Sequence: 加载次序逐一去加载设备 (bios提供的)即寻找系统引导盘 按设置的顺序进行。找到第一个设备中含有mbr就不会再查找。哪怕该启动盘损坏 ,还可以通过网络向往网络寻找引导程序

bootloader: 引导加载器,程序
windows ntloader
linux :
LYLO:Linux LOader (现在在安卓中还在使用)

GRUB:GRand Unifore bootloader (linux unix 都可启动)0.97第一代 centos 7 GRUB二代完全重写,只是名字还相同 放在MBR(主引导记入)
GRUB 0.x :GRUB legacy centos 5 6
GRUB 1.x: GRUB2 centos7以上
功能: 提供一个菜单,允许用户选择要启动系统或不同的内核版本,把用户选定的内核装载到内存中的特定空间中,解压展开 并把系统控制权移交给内核
MBR:
446:bootloader
64:分区表
2: 55aa
GRUB:
bootloader : 1st stage 第一阶段 找到第2阶段 1.5阶段 帮助识别文件系统 /boot/grub/下的文件就是帮助识别文件系统的 grub 将于该文件系统的相符的1.5文件放在MBR随后的一个空间上
disk: 2nd stage 文件系统上的程序。
kernel:(自解压)自身初始化 探测自身硬件,装载驱动,没有驱动的基本驱动访问,如果基本驱动访问不了,等待后期在识别。内核在完成初始化 int 之前挂载根都是以只读模式挂载的,当所有都完成时在
以读写的方式挂载根
1.自身初始化
探测可识别到的所有硬件设备
加载硬件驱动程序(有可能会借助于ramdisk加载驱动)
以只读方式挂载根文件系统
运行用户控件的第一个应用程序:/sbin/init (centos 6)

init 的类型

   1.sysv:init,centos 5 都是一脚本启动系统,完成初始化。一脚本的方式启动会创建大量进程就需要销毁进程花费大量时间造成启动慢,存在依赖性必须 启动的先后顺序有严格要求。不可以并行动。 
   配置文件  /etc/inittab  全在一个脚本文件中配置文件
   2.upstart: Centos6  ubuuntu研发。 debus  (让进程可以相互通信的,基于总线方式完成)即A依赖B B一起动A就可以启动,而不需要等待B启动完成后再启动A。以接近于并行的方式在启动。向后兼容Sysv。并没有完全按照Upstart启动
   配置文件 /etc/inittab, /etc/init/*.conf  配置文件
   3。Systemd:1. 自己就可以启动不需要脚本来实现启动。自己就有很强大的解释器。自己就可以启动一个程序并加载送给内核。2.初始化需要的服务时,告诉你启动了,实际并没有启动只有在使用时才会启动。这样就可以是的快速开机。
  Centos 7 。不以兼容56的方式启动。
  配置文件 /usr/lib/systemd/system, /etc/systemd/system 一般不能叫做配置文件了
 randisk 	  
 
 内核的特性:使用缓存和缓冲来加速对磁盘上的文件的访问。假装成磁盘那么就会新将(内存模拟)磁盘上的数据放在内存在放在磁盘上 。 而假装成文件系统则系统认为文件系统本身就有缓存功能不需要内存提供,可以直接将数据丢给文件系统
 这就是randdisk 到 ranfs的改变的原因。 centos5 initrd (mkinitrd脚本生成) centos6 initramfs(mkinitrd,或dracut脚本生成)
 LAMP
 内核在启动过程中的使命已经结束了
  
 init 工作  重新挂载系统  bash 图形界面 终端
 
 
 系统初始化
 POST --> BOOTSequence(BIOS) -->Bootloader(MBR)-->kernel(ramdisk)-->rootfs(只读)-->init(systemd)

Centos 5

 /sbin/init 下的应用程序是怎么
 启动该启动的服务。
 系统的运行级别:
      为了系统的运或维护等应用目的而设定
	  0-7 七个级别
	     0:关机
		 1:单用户模式(root 无需登录),single。维护模式(类似window的安全模式)。只开启了基本的服务。
		 2:多用户模式 会启动网络功能,但不会启动NFS:维护模式:
		 3:多用户模式,正常模式;文本界面
		 4:预留级别:可通3正常级
		 5:多用户模式:正常模式;图形界面;
		 6:重启
		 默认级别:
		 3 5
		 都是init程序来进行的。
         init  #			 
         runlevel  who -r
		 对于centos5来讲
		 配置文件 /etc/inittab
		 每一行定义一种action以及与之对应的proccess
         id:runlevel:action:proccess
		 action:
		 wait:切换至次级别运行一次;
		 respawn 此process终止,就重启
		 initdefault 设为默认运行级别:proccess省略
		 sysinit 设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit;
		 ...
		 id:3:initdefalut: 
		 si::sysinit:/etc/rc.d/rc.system; 运行级别为空表示所有级别 即无论那个级别都会运行这个 
		 
		 
		 
		 运行指定级别的
		 10:0:wait:/etc/rc.d/rc 0
         11:1:wait:/etc/rc.d/rc 1
         12:2:wait:/etc/rc.d/rc 2 
         13:3:wait:/etc/rc.d/rc 3
		 ...
		 16:6:wait
		 rc 0-->意味着读取/etc/rc.d/rc0.d/
		 K* K##文件名  ##表示为数字代表着这类文件执行的次序 依赖的新执行 k是关闭  数字越小的依赖于别的服务
		 S* S##文件名                     s开始     数字越小的越是被依赖的服务
		  for srv in /etc/rc.d/rc。d/k*;do
		    $srv start
		  done
		  for srv in /etc/rc.d/rc0.d/s*;do
		    $srv start
			done
			所有指定级别下的启动都是 软连接  连接到 /etc/rc.d/init.d/
			chkconfig 命令   --list
			chkconfig --level 3 NetworkManager off  关闭 3 的网络管理 
			chkconfig -(表示所有级别默认都以k来运行)  23(s以s时的编号)   84(以k时的编号) 旧的定义方法
            新的定义方法: Default-Start 2 3 4 5  Default-Stop 0 1 6  (在文件/etc/rc.d/init.d/相应服务的文件 中可看到)
			Required-Start:messagebus  表示启东市由消息总线来启动
			Required-Stop:messagebus   结束时由消息总线拉监控
			以上都可以被命令chkconfig 来识别 新方式是为新的命令upstart
			新启动的关闭时需要后关闭
			后启动的关闭时需要先关闭
			chkconfig 命令 
			     查看内服务在所有级别的启动或按关闭的设备
			chkconfig --list + 服务 查看该服务
			 添加: 
                Sysv的服务脚本放置于	 /etc/rc.d/init.d   (/etc/init.d)	
               chkconfig --add name		生成k还是s类型的文件由Sysv类型配置文件的 注释中 chkconfig  第一个字符决定 范围(0-6)表示是几就在该模式下创建s开头的文件 什么都没有表示
               都以k开头
               chkconfig  --del name 
               修改制定的连接类型				   
                chkconfig [--level levels] [--type type] name <on|off|reset>			
                           --level  表示要设置的级别。省略时表示2345(指不加--level时)
             		注意:正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是只想了/etc/rc.d/rc.local脚本;因此,不便或不需要写为服务脚本放置于/etc/rc.d/init.d目录,且又想开机时自启动运行的命令,
					可直接放置于/etc/rc.d/init.
					最后运行的服务其中特殊的S99local链接的不是/etc/rc.d/init.d 目录下的服务文件,而是 /etc/rc.d/rc.local文件
                    且/etc/rc.d/rc.local文件是脚本文件,所以想开机的启动到服务可以把命令放到里面
                    /etc/rc.local->rc.d/rc.local文件						
             							   
										   
    而cento6使用的upstart 因此/etc/inittab并不完全 针对 init 的一些等级没有设置应该是在Upstart中定义的
	 现在登录
	 定义的启动的终端设备,关系登录程序  shell在登录后启动
	 tty1:2345:respawn:/usr/sbin/mingetty tty1
	 tty2:2345:respawn:/usr/sbin/mingetty tty2 
	 ..... 
	 tty6:2345(表示只在2345级别启用没有1的原因是1自动会开启物理终端):respawn:/usr/sbin/mingetty):respawn:/usr/sbin/mingetty tty6	
   一开机就默认开启 6个虚拟终端		 
	 其中的respawn表示当退出时依然会弹出登录界面
      以上这些也是在/etc/inittab文件定义的?
	   (终端程序)migettty会自动调用login程序(能显示登录提示符并验证账号和密码启动默认shell进程)
	   图形界面 
     系统初始化脚本:
      /etc/rc.d/rc.sysinit	做的事情
      1.设置主机名		  
	  2.设置欢迎信息
	  3.激活udev和selinux
	  4.挂载/etc/fstab文件中定义的文件系统
	  5.去检测跟文件系统,并以读写方式重新挂载根文件系统
      6.设置系统时间
	  7。激活swap设备
      8.根据 /etc/sysctl.conf 文件来设置内核参数
      9.激活lvm及softwaare raid 设备
      10.加载额设备的驱动程序 
      11.清理操作:	  
	  总计:用户空间 执行i /sbin/init -->(/etc/inittab)-->设置默认运行级别-->运行系统初始化脚本,完成系统初始化-->关闭对应级别下的服务,启动该启动的服务。
	  -->设置登录终端
Centos 6
	init程序为:upstart,其配置文件:
		/etc/inittab:为了向下兼容
		/etc/init/*conf
		rc.conf启动服务的
		rcS.conf启动脚本的 中 exec 表示运行脚本
		tty.conf 启动终端
		注意:/etc/init/*.conf文件语法 遵循 upstart配置文件语法格式
		system可以完成脚本完成的所有脚本

GRUB(Boot Loader);

grub 0.x grub legacy
grub 1.x: grub2

grub不能识别lvm逻辑卷,软raid等通常放在基本分区上

grub 命令中的 root命令 设置(指的是grub在磁盘的位置)设置谁为根。
find   find 
      用法 find  (hd0,0)/vmlinux-VERSION(内核的版本号)-release
root (hd#,#)
find  就可以直接找到了 不需要在加 磁盘编号
kernel  指明接下来引导启用的内核文件;
initrd 必须与内核号必须完全匹配
boot 	
/boot分区的两种情况
grub 的第一阶段识别的是设备。 grub 2 是从1开始编号的