centos(RHEL)系列操作系统的启动流程:Intel x86兼容架构;
Linux的系统组成:内核 + 应用程序 GUN/Linux:单纯的指Linux内核;
从硬盘存储和启动操作系统的角度:
Linux的系统组成:内核 + 根文件系统(rootfs)
内核功能:进程管理,文件系统管理,内存管理,网络协议,驱动程序,安全功能,...
Linux系统的系统运行环境可以分为两部分;
内和空间:内核代码(系统调用)
就是内核进程占用的CPU和内存资源的总和;
用户空间:应用程序(进程或线程)
就是各种存储于文件系统中的应用程序,在发起为进程或线程之后,占据的CPU和内存资源的总和;
操作系统内核的设计流派:
单内核设计:
所有的功能全部集中于同一个程序;运行时表现为一个进程;
Linux就是单内核设计
Linux,我们不需要他成为最先进的,我们只是要使用它;
微内核设计:
每种功能使用一个单独的子系统来实现;
Windows,Solaris都是微内核审计
Linux内核的特点:
单内核 + 模块化:内核之中的功能更 + 各种模块提供的功能之和;
为了能够提高工作效率,会为速度比较慢的iO设备提供缓冲和缓存;
Linux内核的组成部分:
内核核心文件:
/boot/vmlinuz-VERSION-release
centos5:
/boot/vmlinuz-2.6.18-398.el5
centos6:
/boot/vmlinuz-2.6.32-573.el6.x86_64
centos7:
/boot/vmlinuz-3.10.0-327.el7.x86_64
最新的内核版本:4.13-rc1
内核模块文件:
/lib/modules/KERNEL_VERSION/kernerl/
ramdisk:
centos 5:
/boot/initrd-2.6.18-398.el5.img
centos 6/7:
/boot/initramfs-2.6.32-573.el6.x86_64
/boot/initramfs-3.10.0-327.el7.x86_64.img
centos 5/6:
生成ramdisk的工具:mkinitrd
centos 7:
生成ramdisk的工具:dracut mkinitrd
rd和ramfs:
ramdisk:双缓冲和双缓存;
ramfs:提高效率,避免双缓冲和双缓存;
centos系列操作系统的启动流程(2)
基于x86架构兼容平台研究系统启动流程;
1.post:power-on self test,加电自检;
ROM:read-only memory,只读存储器;
CMOS:BIOS,basic input and output system,基本输出输出系统;
X76架构的CPU可以线性寻址的物理孔村空间:ROM + RAM
2.bootsequence:启动顺序;
作用:决定到何种硬件设备上加载操作系统;
方式;按照指定的次序查找各个引导设备,第一个被找出有引导程序的设备即为本次启动要用到的设备;
BootLoader:引导加载器,程序;
MBT:
master(main)boot recorn:
0磁道0扇区:
446byte:BootLoader
64byte:fat,file allocation table;
2byte:magic-number,55AA,表示MBR有效;
GPT:
Windows:NTLDR
Linux:
Lilo:Linux loader,有缺陷,不能支持大硬盘;不超过1024柱面;
grub:grand uniform BootLoader,全球统一引导加载器;
centos 6-:
grub 0.x:grub legacy
centos 7:
grub 1.x:grub2
grub提供的功能:
1.为用户提供一个菜单,菜单中列举的是各个可以启动的操作系统内核;
2.可以将用户选定的内核核心文件装载到RAM中,解压缩并展开,将系统控制权移交给内核;
3.交互式的命令行接口;
4.菜单及内核启动的安全保障;
3.内核的启动:
自身初始化:
1.探测能够识别到的所有的硬件设备;
2.加载硬件的驱动程序,有可能会借助于ramdisk加载驱动;
3.以只读的方式挂载根文件系统;
4.运行用户空间的第一个应用程序:/sbin/init
4.init:
init程序的类型:
centos 5:sysV init
配置文件:
/etc/inittab
centos 6:upstart init
配置文件:
/etc/inittab(几乎被废弃);
/etc/init/*.conf
centos 7:systemd
配置文件:
/usr/lib/systemd/system/*
/etc/systemd/system/*0
小结:
系统初始化流程(内核级别)
post --> bootsequence(BIOS)--> BootLoader(MBR)--> kernel(内核核心文件,只能放置在基本分区上)-->
[ramdisk] --> rootfs(read-only)--> /sbin/init
centos 5的sysV init的工作过程;
centos 5 sysV init:
运行级别(run level):为了系统的运行或维护等目的而设置的管理机制;
0-6:七个运行级别;
# 0 - 关机,halt,shutdown;
# 1 - 单用户模式(single user mode),root,无需验证;维护模式;
# 2 - 多用户模式(multiuser),会启动网络功能;但是不会启动NFS,维护模式;
# 3 - 多用户模式(full multiuser mode),完全的功能模式,仅使用CLI,不激活GUI;
# 4 - 预留级别,目前无特别使用的目录;但是习惯上认为与3运行级别相同;
# 5 - 多用户模式(full multiuser mode),完全的功能模式,默认激活GUI和CLI,默认使用的是GUI;
# 6 - 重启,reboot
通常会使用3,5运行级别作为此次系统启动的默认运行级别;
查看当前系统的运行级别;
who -r
runlevel
切换运行级别:
init [0-6]
init的配置文件:/etc/inittab,此配置文件有如下功能:
1.在整个系统初始化的过程中要做那些任务;
启动或关闭哪些后台服务;
如何进行系统初始化;
在验证用户的身份无误之后,如何为用户提供登录提示符,还要区分是图形界面还是文件界面;
当备用电源失效或重新生效时,如何指挥系统操作;
定义了按下“Ctrl + Alt + delete”组合键时,系统将采取什么行为;
2.所有规定的任务如何执行;
每一行定义一种操作,格式如下:
id:runlevels:action:process
id:一种操作的唯一标识符;
l#,id,pf,pr,#,x,
runlevel:指定任务执行所依赖的运行级别;
####,#,留空,
action:在何种条件下启动此任务;
wait:等待切换至此任务所在的运行级别时,运行一次;
respawn:一旦此任务结束,就自动重新启动此任务;
initdefault:用于设定默认的运行级别,通常后面的process省略
sysinit:设置系统初始化的方式,一般情况下此处运行/etc/rc.d/rc.sysinit脚本;
powerfail:
powerokwait:
ctrlaltdel:
/etc/rc.d/rc.sysinit:
1.设置主机名称;
2.设置启动的欢迎信息;
3.激活udev和selinux;
4.挂载/etc/fstab文件中定义的所有有效文件系统;
5.激活各个swap设备;
6.检测rootfs,并且以读写的方式重新挂载rootfs;
7.设置系统时间;
8.根据/etc/sysctl.conf文件设置内核参数;
9.激活lvm和软raid等高级逻辑设备;
10.加载额外的设备的驱动程序;
11.完成清理工作;
/etc/rc.d/rc:
根据特定的运行级别,启动或关闭/etc/rc.d/rc$runlevel.d/*
K*:要停止的服务;K后面的两位数字表示优先级;数字越小优先级越高;依赖其他服务的服务应该优先关闭,被其他服务依赖的服务应该稍后关闭;
S*:要启动的服务;S后面的两位数字表示优先级;数字越小优先级越高;被其他服务依赖的服务应该优先开启,依赖其他服务的服务应该稍后开启;
rc脚本实际上可以接收一个运行级别作为其参数运行内容的;
脚本框架:
for i in /etc/rc.d/rc#.d/K* ; do
$i stop
done
for i in /etc/rc.d/rc#.d/S* ; do
$i start
done
mkinitrd:建立要载入ramdisk的映像文件,以供Linux开机时载入ramdisk。
选项:
-f:若指定的映像问家名称与现有文件重复,则覆盖现有的文件;
-v:执行时显示详细的信息;
--omit-scsi-modules:不要载入SCSI模块;
--preload=<模块名称>:指定要载入的模块;
--with=<模块名称>:指定要载入的模块;
--version:显示版本信息。
例子:
mkinitrd -v -f myinitrd.img $(uname -r)
dracut:建立要载入ramdisk的映像文件,以供Linux开机时载入ramdisk。
例子:
dracut /boot/initramfs-$(uname -r).img $(uname -r)