CentOS 5和6的启动流程
CentOS 5和6的启动流程:
Linux:kernel + rootfs
kernel:进程管理,内存管理,网络管理,驱动程序,文件系统,安全功能
rootfs:glibc(gun c 标准库)
库:
函数集合,function,调用接口(功能名)
过程调用:procedure,无返回值
函数调用:function,有返回值
程序:
内核设计流派:
单内核设计:Linux,把所有功能集成同一个程序
微内核设计:Windows,Solaris,每种功能使用一个单独子系统实现
liunx内核特点:
支持模块化:.ko(被内核调用) .so(用户空间库名)
支持模块的动态装载和卸载
组成部分:
核心文件:/boot/vmlinuz-VERSION-release
模块文件:/lib/modules/VERSION-release
ramdisk:基于内存的磁盘,辅助内核驱动磁盘
CentOS 5:/boot/initrd_VERSION-release.img (模拟成硬盘)
CentOS 6:/boot/initramfs-VERSION-release.img (模拟成文件系统)
CentOS系统启动流程:
POST:加电自检:
ROM:CMOS
BIOS:Basic Input and Output System
ROM + RAM
BOOT Sequence:
按次序查找各引导设备,第一个有引导程序的设备即为本次启动用到的设备
bootloader:引导加载器,程序
windows:ntloader
Linux:
LILO:LInux LOader
GRUB:GRand Uniform Bootloader
GRUB 0.x:GRUB legacy (CentOS 5,6)
GRUB 1.x:GRUB2 (CentOS 7)
引导加载器:找到操作系统所在的磁盘分区,把内核加载至内存中,并将控制权正常转交给内核的程序,以硬盘为例,引导加载器放在其MBR中
(提供一个菜单,允许用户选择要启动的系统或不同的内核版本,把用户选定的内核装载到内存中的特定空间中,解压展开并把系统控制权移交给内核)
MBR:
446:bootloader
64:fat 文件分配表
2:55AA
GRUB:
bootloader:1st stage (找到硬盘中的第二阶段)
disk:2nd stage
kernel:
自身初始化:
探测可识别到的所有硬件设备
加载硬件驱动程序:(有可能会借助于ramdisk加载驱动)
以只读方式挂载根文件系统
运行用户空间的第一个应用程序:/sbin/init
init程序的类型:
SysV:init,CentOS 5 配置文件 /etc/inittab
upstart:init,CentOS 6 配置文件 /etc/inittab,/etc/init/*.conf
systemd:systemd,CentOS 7 配置文件 /usr/lib/systemd/system, /etc/systemd/system
ramdisk:
内核中的特性之一:使用缓冲和缓存来加速对磁盘上文件的访问:
启动时内核加载根文件系统,但根文件系统所在设备,
内核可能无法驱动,因为驱动程序在根文件系统上,
所以借助于ramdisk协助完成对于所需要和依赖的驱动程序的加载,
加载完成后,切换到真正的根
ramdisk -> ramfs
由于ramdisk模拟成硬盘,所以有可能被缓冲两次,内核认为任何磁盘都比较慢,
所以会把ramdisk缓存到内存中,但ramdisk本身就在内存中,
等于存了两次,所以CentOS 6采用ramfs
ramdisk在CentOS 5:initrd,利用mkinitrd生成
ramfs在CentOS 6:initramfs 工具程序:mkinitrd(不怎么用),dracut(一般使用此工具)
系统初始化:
POST--Bootsequence(BIOS)--Bootloader(MBR)--kernel(ramdisk)--rootfs(以只读方式加载根文件系统)--init
/sbin/init
CentOS 5:
运行级别:为了系统的运行或维护等应用目的而设定
0-6:7个级别
0:关机
1:单用户模式,single,维护模式,root,无须登陆
2:多用户模式,会启动网路功能,但不会启动NFS,维护模式
3:多用户模式,正常模式,文本界面
4:预留级别,可同3级别
5:多用户模式,正常模式,图形界面
6:重启
默认级别:3,5
切换级别:init #(级别数字)
查看级别:runlevel;who -r
配置文件:/etc/inittab
每一行定义一种action以及与之对应的process
id:runlevel:action:process (id可以使用任意名称,保证每行不一样就成)
例:id:3:initdefault:
action:
wait:切换至此级别运行一次
respawn:此process终止,就重新启动之
initdefault:设定默认运行级别:process省略
sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit
# si::sysinit:/etc/rc.d/rc.sysinit 运行级别为空,表示所有级别
# l0:0:wait:/etc/rc.d/rc 0
# l1:1:wait:/etc/rc.d/rc 1
.
.
.
# l6:6:wait:/etc/rc.d/rc 6
说明:rc 0 -- 意味着读取/etc/rc.d/rc0.d
K*:K##* K开头意味着此级别关闭 K后数字越小,越先运行,数字越小的服务,为越依赖别的服务的服务
S*:S##* S开头意味着此级别开启 S后数字越小,越先运行,数字越小的服务,为越被依赖的服务
在/etc/rc.d/init.d中有对应的脚本,在每个级别的rc.d文件中都有选择开启和关闭的脚本
chkconfig命令:
查看服务在所有级别下的启动或关闭设定情形:
chkconfig [--list] [name]
添加:
sysV的服务脚本放置于/etc/rc.d/init.d(/etc/init.d)
chkconfig --add name
#!/bin/bash
#
# chkconfig: L mm nn
L:0-6 写那个数那个级别为S,如果为"-"表示所有级别都不为S
mm:为S后数字
nn:为K后数字
删除:
chkconfig --del name 脚本还在只是在各运行级别中删除
修改指定的链接类型:
chkconfig [--level levels] name <on|off|reset>
--level L:指定要设置的级别,默认为2345
注意:想在开机时运行但不方便写成脚本放在/etc/rc.d/init.d中的使用chkconfig控制,但又想开机运行的命令,
可以写在/etc/rc.local或/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文件中
启动虚拟终端:
tty1:2345:respawn:/usr/sbin/mingetty tty1
tty2:2345:respawn:/usr/sbin/mingetty tty2
.
.
.
tty6:2345:respawn:/usr/sbin/mingetty tty6
mingetty会调用login程序
/etc/rc.d/rc.sysinit:系统初始化脚本
(1)设置主机名
(2)设置欢迎信息
(3)激活udev和seLinux
(4)挂载/etc/fstab文件中定义的文件系统
(5)检测根文件系统,并以读写方式重新挂载根文件系统
(6)设置系统时钟
(7)激活swap设备
(8)根据/etc/sysctl.conf文件设置内核参数
(9)激活lvm及software raid设置
(10)加载额外设备的驱动程序
(11)清理操作
总结:/sbin/init -- (/etc/inittab)-- 设置默认运行级别 -- 运行系统初始脚本,完成系统初始化 -- 关闭对应级别下需要关闭
的服务,启动需要启动的服务 -- 设置登陆终端
CentOS 6:
init程序为:
upstart
配置文件:
/etc/inittab,/etc/init/*.conf
注意:
/etc/init/*.conf 文件语法遵循upstart配置文件语法格式