一. Linux的引导过程

(1) 开机自检(BIOS):BIOS(Basic Input/Output System),基本输入输出系统,该系统存储于主板的ROM芯片上,计算机在开机时,会最先读取该系统,然后会有一个加电自检过程,这个过程其实就是检查CPU和内存,计算机最基本的组成单元(控制器、运算器和存储器),还会检查其他硬件,若没有异常就开始加载BIOS程序到内存当中。详细的BIOS功能,这边就不说了,BIOS主要的一个功能就是存储了磁盘的启动顺序,BIOS会按照启动顺序去查找第一个磁盘头的MBR信息,并加载和执行MBR中的Bootloader程序,若第一个磁盘不存在MBR,则会继续查找第二个磁盘(PS:启动顺序可以在BIOS的界面中进行设置),一旦BootLoader程序被检测并加载内存中,BIOS就将控制权交接给了BootLoader程序。
(2) MBR引导: MBR(Master Boot Record),主引导记录,MBR存储于磁盘的头部,大小为512bytes,其中,446bytes用于存储BootLoader程序,64bytes用于存储分区表信息,最后2bytes用于MBR的有效性检查。
(3) GRUB菜单:
GRUB(Grand Unified Bootloader),多系统启动程序,其执行过程可分为三个步骤:
    Stage1:这个其实就是MBR,它的主要工作就是查找并加载第二段Bootloader程序(stage2),但系统在没启动时,MBR根本找不到文件系统,也就找不到stage2所存放的位置,因此,就有了stage1_5
    Stage1_5:该步骤就是为了识别文件系统
    Stage2:GRUB程序会根据/boot/grub/grub.conf文件查找Kernel的信息,然后开始加载Kernel程序,当Kernel程序被检测并在加载到内存中,GRUB就将控制权交接给了Kernel程序。
    PS:实际上这个步骤/boot还没被挂载,GRUB直接识别grub所在磁盘的文件系统,所以实际上应该是/grub/grub.conf文件,该配置文件的信息如下:
grub.conf: 
#boot=/dev/sda
default=0 #设定默认启动的title的编号,从0开始
timeout=5 #等待用户选择的超时时间
splashimage=(hd0,0)/boot/grub/splash.xpm.gz #GRUB的背景图片
hiddenmenu #隐藏菜单
title CentOS (2.6.18-194.el5PAE) #内核标题
root (hd0,0) #内核文件所在的设备
kernel /vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/ #内核文件路径以及传递给内核的参数
initrd /initrd-2.6.18-194.el5PAE.img #ramdisk文件路径

(4) 加载Linux内核(Kernel):
Kernel,内核,Kernel是Linux系统最主要的程序,实际上,Kernel的文件很小,只保留了最基本的模块,并以压缩的文件形式存储在硬盘中,当GRUB将Kernel读进内存,内存开始解压缩内核文件。讲内核启动,应该先讲下initrd这个文件,
  initrd(Initial RAM Disk),它在stage2这个步骤就被拷贝到了内存中,这个文件是在安装系统时产生的,是一个临时的根文件系统(rootfs)。因为Kernel为了精简,只保留了最基本的模块,因此,Kernel上并没有各种硬件的驱动程序,也就无法识rootfs所在的设备,故产生了initrd这个文件,该文件装载了必要的驱动模块,当Kernel启动时,可以从initrd文件中装载驱动模块,直到挂载真正的rootfs,然后将initrd从内存中移除。
  Kernel会以只读方式挂载根文件系统,当根文件系统被挂载后,开始装载第一个进程(用户空间的进程),执行/sbin/init,之后就将控制权交接给了init程序。

(5) Init进程初始化:
init,初始化,顾名思义,该程序就是进行OS初始化操作,实际上是根据/etc/inittab(定义了系统默认运行级别)设定的动作进行脚本的执行,第一个被执行的脚本为/etc/rc.d/rc.sysinit,这个是真正的OS初始化脚本,简单讲下这个脚本的任务(可以去看看实际脚本,看看都做了什么):
① 激活udev和selinux;
② 根据/etc/sysctl.conf文件,来设定内核参数;
③ 设定系统时钟;
④ 装载硬盘映射;
⑤ 启用交换分区;
⑥ 设置主机名;
⑦ 根文件系统检测,并以读写方式重新挂载根文件系统;
⑧ 激活RAID和LVM设备;
⑨ 启用磁盘配额;
⑩ 根据/etc/fstab,检查并挂载其他文件系统;
⑪ 清理过期的锁和PID文件
1) /etc/inittab配置默认运行级别:
inittab文件的结构:id runlevels action process
① id 用于在inittab文件中唯一标识一个配置记录
②runlevels 用于指定该记录在哪些运行级别中运行
③action 用于描述记录将执行哪种类型的动作
④ process 用于设置启动进程所执行的命令
2) /etc/sysconfig/init:控制tty终端的开启数量、终端颜色方案
3) /etc/init/rcS.conf:加载rc.sysinit脚本,完成系统初始化任务
4) /etc/init/rc.conf:兼容脚本,负责各运行级别的调用处理
5) /etc/init/rcS-sulogin.conf:为单用户模式启动/sbin/sushell环境
6) /etc/init/control-alt-delete.conf:控制终端下的Ctrl+Alt+Del热键操作
7) /etc/init/start-ttys.conf:配置tty终端的开启数量、设备文件
8) /etc/init/tty.conf:控制tty终端的开启

(6) Runlevel:
  runlevel,运行级别,不同的级别会启动的服务不一样,init会根据定义的级别去执行相应目录下的脚本,Linux的启动级别分为以下几种
  0:关机模式
  1:单一用户模式(直接以管理员身份进入)
  2:多用户模式(无网络)
  3:多用户模式(命令行)
  4:保留
  5:多用户模式(图形界面)
  6:重启

  在不同的运行级别下,/etc/rc.d/rc这个脚本会分别执行不同目录下的脚本
• Run level 0 – /etc/rc.d/rc0.d/
• Run level 1 – /etc/rc.d/rc1.d/
• Run level 2 – /etc/rc.d/rc2.d/
• Run level 3 – /etc/rc.d/rc3.d/
• Run level 4 – /etc/rc.d/rc4.d/
• Run level 5 – /etc/rc.d/rc5.d/
• Run level 6 – /etc/rc.d/rc6.d/
  这些目录下的脚本只有K和S开头的文件,K开头的文件为开机需要执行关闭的服务,S开头的文件为开机需要执行开启的服务。

二. 服务控制及优化启动过程

(1) 系统服务控制
① 使用systemctl工具:
格式:systemctl控制类型 服务名称
列:[root@localhost~]#systemctl start network
[root@localhost~]#systemctl restart network
[root@localhost~]#systemctl stop network
[root@localhost~]#systemctl status network
network.service - LSB: Bring up/down networking
Loaded: loaded (/etc/rc.d/init.d/network; bad; vendor preset: disabled)
Active: inactive (dead) since Tue 2018-11-06 21:02:31 CST; 4s ago
Docs: man:systemd-sysv-generator(8)
Process: 8108 ExecStop=/etc/rc.d/init.d/network stop (code=exited, status=0/SUCCESS)
Process: 4455 ExecReload=/etc/rc.d/init.d/network reload (code=killed, signal=TERM)
Process: 7834 ExecStart=/etc/rc.d/init.d/network start (code=exited, status=0/SUCCESS)

Nov 06 21:02:24 localhost.localdomainsystemd[1]: Starting LSB: Bring up/d...
Nov 06 21:02:24 localhost.localdomain network[7834]: Bringing up loopback ...
Nov 06 21:02:25 localhost.localdomain network[7834]: Bringing up interface...
Nov 06 21:02:25 localhost.localdomain network[7834]: [ OK ]
Nov 06 21:02:25 localhost.localdomainsystemd[1]: Started LSB: Bring up/do...
Nov 06 21:02:31 localhost.localdomainsystemd[1]: Stopping LSB: Bring up/d...
Nov 06 21:02:31 localhost.localdomain network[8108]: Shutting down interfa...
Nov 06 21:02:31 localhost.localdomain network[8108]: [ OK ]
Nov 06 21:02:31 localhost.localdomain network[8108]: Shutting down loopbac...
Nov 06 21:02:31 localhost.localdomainsystemd[1]: Stopped LSB: Bring up/do...
Hint: Some lines were ellipsized, use -l to show in full.
② 启动系统脚本文件:
格式:/etc/rc.d/init.d/服务名称 控制类型
[root@localhost~]# /etc/init.d/network start
Starting network (via systemctl): [ OK ]
[root@localhost~]# /etc/init.d/network restart
Restarting network (via systemctl): [ OK ]
[root@localhost~]# /etc/init.d/network stop
Stopping network (via systemctl): [ OK ]

(2) 切换运行级别
① 查看系统的运行级别:runlevelbr/>[root@localhost~]#runlevel
3 5

参考文档:http://www.cnblogs.com/codecc/p/boot.html