Linux系统的组成部分
1、动态视角:内核+根文件系统
2、静态视角:磁盘分区+文件
Linux运行中的系统环境
1、用户空间:应用程序(进程或线程)
2、内核空间:内核代码(系统调用)
内核设计流派:
*单内核设计:把所有功能集成于同一个程序,如:Linux
*微内核设计:每种功能使用一个单独的子系统实现,如:windows
Linux内核特点
1、支持模块化:.ko(kernel object)
2、支持模块运行时动态装载或卸载
Linux内核的组成
1、核心文件:/boot/vmlinu-VERSION-release
2、ramdisk:中间临时根文件系统,动态创建出来的,使用缓冲和缓存来加速对磁盘上的文件访问
CentOS 5:/boot/initrd-VERSION-release.img
CentOS 6、7:/boot/initramfs-VERSION-release.img
3、模块文件:/lib/modules/VERSION-release
CentOS系统初始化流程(内核级别)
POST –> BootSequence(BIOS)–> BootLoader(MBR)–> kernel(ramdisk)–> rootfs(readonly)–> /sbin/init(/etc/inittab)
第一步、POST:加电自检,检查硬件设备是否存在
1、用于实现POST的代码在主板上ROM(CMOS)芯片上。
2、主板上的ROM(CMOS):主板上的一块可读写的并行或串行FLASH芯片,是用来保存BIOS的硬件配置和用户对某些参数的设定。(BIOS设置程序一般都被厂商整合在芯片中,因此BIOS设置有时也被叫做CMOS设置)
第二步、Boot Sequence:按次序查找各引导设备,第一个有引导程序的设备即为本次启动要用到的设备
BIOS:Basic Input Output System,基本输入输出系统。它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,从CMOS中读写系统设置的具体信息。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制
第三步、BootLoader:引导加载器,程序
提供一个菜单,允许用户选择要启动的系统或不同的内核版本,把用户选定的内核装载到RAM中的特定空间中,解压、展开,而后把系统控制权移交给内核。
*Windows上的引导加载器:ntloader
*Linux上的引导加载器:
LILO:短小精悍的linux加载器,1024柱面之后无法加载,现在多用于安卓手机启动。
GRUB:GRand Unified Bootloader,统一引导加载器
GRUB 0.X(CentOS 5/6):Grub Legacy
GRUB 1.X(CentOS 7)::Grub2,完全重写,设计理念上很大改变
MBR:Master Boot Record,主引导记录
ext系列及GPT系列的文件系统的bootloader都在MBR中的前446个字节,MBR为该磁盘的第一个扇区(1st stage),共512字节。
MBR的组成:512bytes
446bytes:bootloader
46bytes:fat(GPT文件系统中不同)
2bytes:55AA(分区表有效性标识)
GRUP引导阶段:
这时候就可以看到我们的Centos系统了,但是一般都不需要操作,会自动启动系统。其实我们也可以自己手动启动系统的。
加载运行GRUB共可分为三步:
1、bootloader:1st stage,位于MBR中,为了引导2nd stage。
2、Partition:filesystem driver,1.5stage,mbr之后的扇区,让stage1中的bootloader能识别stage2所在在分区上的文件系统。
3、Partition:/boot/grub,2nd stage,位于boot基本磁盘分区中,GRUB的引导程序。
stage2及内核等通常放置于一个基本磁盘分区
功用:
(1)提供菜单、并提供交互式接口
e:编辑模式,用于编辑菜单
c:命令模式,交互式接口
(2)加载用户选择的内核或操作系统
运行传递参数给内核
可隐藏此菜单
(3)为菜单提供了保护机制
为编辑菜单进行认真
为启用内核或操作系统进行认证
如何识别设备:
(hd#,#)
hd#:磁盘编号,用数字表示,从0开始编号
#:分区编号,用数字表示,从0开始编号
grub的命令行接口:
e:编辑模式,用于编辑菜单 c:命令模式,交互式接口 常用命令: help:获取帮助列表 help KEYWORD:详细帮助信息 find(hd#,#)/PATH/TO/SOMEFILE root(hd#,#) kernel /PATH/TO/SOMEFILE:设定本次启动时用到的内核文件,额外还可以添加许多内核支持使用的cmdline参数 例如:init=/path/to/init,selinux=0 initrd /PATH/TO/INITRAMFS_FILE:设定为选定的内核提供额外文件的randisk boot:引导启动选定的内核
手动在grub命令行接口启动系统:
grub> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot
配置文件:/boot/grub/grub.conf
配置项: default=#: 设定默认启动的菜单项;落单项(title)编号从0开始; timeout=#:指定菜单项等待选项选择的时长; splashimage=(hd#,#)/PATH/TO/XPMPICFILE:指明菜单背景图片文件路径; hiddenmenu:隐藏菜单; password [--md5] STRING: 菜单编辑认证; title TITLE:定义菜单项“标题”, 可出现多次;用来引导多个内核或者操作系统 root (hd#,#):grub查找stage2及kernel文件所在设备分区;为grub的“根”; kernel /PATH/TO/VMLINUZFILE [PARAMETERS]:启动的内核 initrd /PATH/TO/INITRAMFSFILE: 内核匹配的ramfs文件;
第四步、kernel(ramdisk),加载内核
内核会自身初始化:
探测可识别到的所有硬件设备
加载硬件驱动程序(有可能会借助于ramdisk加载驱动)
以只读方式挂载根文件系统
运行用户空间的第一个应用程序:/sbin/init
ramdisk:
*Linux内核的特性之一:使用缓存和缓存来加速对磁盘上的文件访问
*辅助性文件,并非必须,这取决于内核是否能直接去的rootfs所在的设备
目标设备驱动,例如SCSI设备的驱动
逻辑设备驱动,例如LVM设备的驱动
文件系统,例如xfs文件系统
*ramdisk是一个简装版的根文件系统
用户空间的启动流程,/sbin/init(/etc/inittab)
设置默认运行级别–>运行系统初始化脚本,完成系统初始化–>关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务–>设置登录终端[–>启动图形终端]
init程序的类型:
CentOS 5-:SysV init
配置文件:/etc/inittab
CentOS 6:Upstart
配置文件:/etc/inittab
/etc/init/*.conf
CentOS 7:Systemd
配置文件:/usr/lib/systemd/system/
/etc.systemd/system/
第五步、设置默认运行级别
运行级别:为了系统的运行或维护等目的而设定的机制
0-6:7个级别
0:关机,shutdown
1:单用户模式(single user),root用户无需认证,维护模式
2:多用户模式(multi user),会启动网络功能,但不会启动NFS,维护模式
3:多用户模式(multti user),完全功能模式,文本界面
4:预留级别,目前无特别使用目的,但习惯以同3级别功能使用
5:多用户模式(multti user),完全功能模式,图形界面
6:重启,reboot
默认级别:3,5
级别切换:init #
级别查看:who -r ,runlevel
第六步、系统初始化
内核加载完毕,会运行init程序,init进程起来后,系统启动的控制权移交给init进程
/sbin/init进程是所有进程的父进程,当init起来之后,它首先会读取配置文件/etc/inittab,进行以下工作:
1.执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统基本算运行起来了,后面需要进行运行级别的确定及相应服务的启动;
2.确定启动后进入的运行级别;
3.执行/etc/rc.d/rc,该文件定义了服务启动的顺序是先K后S,而具体的每个运行级别的服务状态是放在/etc/rc.d/rcn.d(n=0~6)目录下,所有的文件均链接至/etc/init.d下的相应文件。
4.有关key sequence的设置
5.有关UPS的脚本定义
6.启动虚拟终端/sbin/mingetty
7.在运行级别5上运行X
配置文件:/etc/inittab
每行定义一直action以及与之对应的process id:runlevels:action:process id:一个任务的标识符 runlevels:在哪些级别启动此任务;#,###,也可以为空,表示所有级别 action:在什么条件下启动此任务 process:任务 action: wait:等待切换至此任务所在的级别时执行一次 respawn:一旦此任务终止,就自动重新启动之 initdefault:设定默认运行级别,此时,process省略 sysinit:设定系统初始化方式,此处一般为指定/etc/re.d/rc.sysinit脚本 例如: id:3initdefault: si::sysinit:/etc/re.d/rc.sysinit (设定系统初始化方式) l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 (等到运行级别为1时启动或关闭/etc/rc.d/rc3.d/目录下的服务脚本所控制服务) ... l6:6:wait:/etc/rc.d/rc 6
系统初始化脚本:/etc/rc.d/rc.sysinit
功能:
(1)设置主机名
(2)设置欢迎信息
(3)激活udev和selinux
(4)挂载/etc/fstab文件中定义的所有文件系统
(5)检测根文件系统,并以大写方式重新挂载根文件系统
(6)设置系统时钟
(8)激活lvm及软raid设备
(9)激活swap设备
(10)挂载额外设备的驱动程序
(11)清理操作
第七步、关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务
在CentOS 5和6中,系统服务都被设计为一个单独的服务脚本,可以通过运行这些脚本来管理系统服务。在/etc/rc.d/目录下面有7个rc#.d格式的子目录(#为0-6的整数,对应着七个系统运行级别)
rc脚本:接受一个运行级别数字为参数
脚本框架: for srv in /etc/re.c/rc#.d/K*,do $srv stop done for srv in /etc/re.c/rc#.d/K*,do $srv start done K*:要停止的服务;K##*,优先级,数字越小,越是优先关闭,依赖的服务先关闭,然后关闭被依赖的 S*要启动的服务;S##*,优先级,数字越小越是优先启动,被依赖的服务先启动,而依赖的服务后启动 /etc/init.d/*(/etc/rc.d/init.d/*)脚本执行方式: # /etc/init.d/SRV_SCRIPT {start|stop|restart|status} # service SRV_SCRIPT {start|stop|restart|status}
chkconfig命令:管控/etc/init.d/每个服务脚本在各级别下的启动或关闭状态
查看:chkconfig –list [name]
添加:chkconfig –add name
删除:chkconfig –del name
修改指定的链接类型:
chkconfig [–level LEVELS] name <on|off|reset>
–level LEVELS]:指定要控制的级别,默认为2345
注:正常级别下,最后启动的一个服务S99local没有链接至/etc/init.d下的某脚本,而是链接至/etc/rc.d/rc.local(/etc/rc.local)脚本,因此,不变或不需写为服务脚本的程序期望能开机自动运行时,直接放置于此脚本文件中即可。
第八步:启动终端
读取/etc/init/start-ttys.conf这个配置文件,完成启动终端的流程。其中会判定,如果运行级别为5的话,在启动tty1-6之后会再启动图像终端。
总结:系统启动流程
POST –> BootSequence(BIOS)–> BootLoader(MBR)–> kernel(ramdisk)–> rootfs(readonly)–> /sbin/init(/etc/inittab) –> 设置默认运行级别 –> 运行系统初始化脚本,完成系统初始化 –> 关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务 –> 设置登录终端[–>启动图形终端]
原创文章,作者:641348038@qq.com,如若转载,请注明出处:http://www.178linux.com/65225