kernel功能: 进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能 rootfs:程序和glibc
库:函数集合, function, 调用接口(头文件负责描述)过程调用:procedure,无返回值
函数调用:function
程序:二进制执行文件 内核设计流派:
单内核(monolithic kernel):Linux
把所有功能集成于同一个程序
微内核(micro kernel):windows, Solaris(hurb)(太完美了没有成功)
每种功能使用一个单独子系统实现
linux设计思想:内核核心仅保留最基本功能,而把其它功能做成子系统;各子系统之间依靠通信完成基本功能 内核 Linux内核特点:支持模块化:.ko(内核对象有些是驱动模块)
如:文件系统,硬件驱动,网络协议等
支持内核模块的动态装载和卸载 组成部分: 一.核心文件:/boot/vmlinuz-VERSION-release生成时间是光盘自带的时间,出场时写入的时间,如果没了可以从别处考一个过来
ramdisk:辅助的伪根系统(虚拟文件系统,生成时间是安装时的时间)CentOS 5: /boot/initrd-VERSION-release.img
虚拟出来的一个磁盘
CentOS6,7: /boot/initramfs-VERSION-release.img
虚拟出来的文件系统
这是一个cpio的文档格式
cat 。。。|cpio -id 删除/boot/initramfs-VERSION-release.img文件修复

这个无法从别处拷贝只能单独生成!
步骤

1.重启进光盘修复
会发现,能进入界面引导界面却不能下一步的生成!这说明可以进入boot,但无法下一步!
2.在/boot下重新生成此文件

不切换根的话很多工具会用不了!mkinitrd命令是硬盘上的命令!
注意:最后一步要很长时间才能生成,要耐心等待,结束后exit.exit两次重启
二.模块文件:/lib/modules/VERSION-release 注意:虽然安装时内核10M多,其就实除了核心文件是驱动/lib/modules,根文件系统的驱动有可能和根不相同,你可以访问boot但不一定能访问根,因为根的驱动在根下的lib,
所以boot里面放驱动,把boot加载,从而找到根的驱动把根挂上!
boot又是怎么启动的呢,是前面的grub的工作了! CentOS 系统启动流程:

1.POST:
Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测。
ramdisk:自检流程!内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问
ramdisk ―> ramfs 提高速度
CentOS 5: initrd 文件, 工具程序:mkinitrd
CentOS 6: initramfs 文件, 工具程序:mkinitrd, dracut
ROM:BIOS,Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等。
RAM:CMOS互补金属氧化物半导体,保存各项参数的设定
按次序查找引导设备,第一个有引导程序的设备为本次启动设备
2.bootloader: 引导加载器,引导程序windows: ntloader,仅是启动OS
Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核
LILO:LInux LOaderGRUB: GRand Unified Bootloader
GRUB 0.X: GRUB Legacy, GRUB2
例如:你装了个双内核,开机的菜单选项就是grub生成的
GRUB:
primary boot loader : 1st stage,1.5 stage1.5阶段被放在第一个扇区的后续扇区!(都在0柱面上,所以分区时从1扇区开始分的!)这个扇区装载的就是 boot的驱动!
secondary boot loader :2nd stage,分区文件
1阶段和1.5阶段这些在/boot/grub下都有(以1 1_5结尾)备份文件(可以删除),但2的不是备份文件,不能删除!!!
MBR:只放置了一点grub内容,用来寻找/boot下的驱动模块(1.5阶段)
446: bootloader, 64: 分区表, 2: 55AA由于MBR在硬盘的第一个扇区,不用驱动! 3.kernel: 通过boot下的核心文件和boot下的驱动挂载根

自身初始化:
探测可识别到的所有硬件设备
加载硬件驱动程序(可能借助于ramdisk加载驱动)
ramdisk: 加载至内存中,此段内存空间被虚拟成了块设备;用于提供硬盘驱动程序;系统安装时临时生成的;
ramdisk被内核识别为“根文件系统”,即rootfs,常被称作“临时根”;
以只读方式挂载根文件系统(真正的根)
因为grub下的 grub.conf有写,也写了根的驱动程序所在位置为当下的initramfs-***.img文件运行用户空间的第一个应用程序:/sbin/init
4.init:init读取其初始化文件:/etc/inittab
初始运行级别(RUN LEVEL)系统初始化脚本
对应运行级别的脚本目录
捕获某个关键字顺序
定义UPS电源终端/恢复脚本
在虚拟控制台生成getty
在运行级别5初始化X
个版本服务启动
CentOS 5:** SysV init**特点:启动用户空间的服务程序,通常通过脚本进行;有依赖关系的服务将被串行启动;
配置文件:/etc/inittab
CentOS 6: **Upstart**
特点:守护进程间的通信依赖于D-Bus进行,因此,可基本实现类似并行启动;
配置文件:/etc/inittab, /etc/init/*.conf
CentOS 7: **Systemd**
特点:服务只有在第一次被访问到时才会真正启动起来;
配置文件:/usr/lib/systemd/ 系统初始化总结:
POST ―> BootSequence (BIOS) ―> Bootloader(MBR) ―> kernel(ramdisk) ―> rootfs(只读) ―> init(systemd)
/sbin/init Linux系统运行级别:为系统维护的目的而设定,途径是设定启动或关闭服务实现;0-6: 7个级别
0:关闭所有服务;关机
1:维护模式,单用户模式,sigle模式;此级别可允许root用户直接登录而无须认证;
2:维护模式,多用户模式,需要用户认让,会启动网络功能,但不支持使用NFS;
3:正常级别,完全多用户模式,文本界面;
4:预留级别
5:正常级别,完全多用户模式,图形界面;
6:关闭所有服务;重启
默认级别:3,5
切换级别:
init [0-6]
init 0
init 6
查看级别:
runlevel命令
who -r
总结(用户空间的启动流程): /sbin/init (/etc/inittab)
设置默认运行级别 ―> 运行系统初始化脚本,完成系统初始化 ―> 关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务―> 设置登录终端 [―> 启动图形终端] 配置文件:/etc/inittab(CentOS 5 6)配置文件格式
格式:
每一行定义一种action以及与之对应的process
id:runlevel:action:process任务的标示符:运行级别:任务在什么时候启动,如何启动:启动的到底是什么任务
id:一个任务的标识符;
runlevels:在哪些级别启动此任务;#,###,也可以为空,表示所有级别;
action:在什么条件下启动此任务;
process:任务;
action:
wait: 切换至此级别运行一次
respawn:此process终止,就重新启动之
initdefault:设定默认运行级别;process省略
sysinit:设定系统初始化方式,此处一般为指定
/etc/rc.d/rc.sysinit
ca::ctrlaltdel:/sbin/shutdown -t3 -r now 例如: 设定默认运行级别 id:3:initdefault: 定义完成系统初始化的脚本 si::sysinit:/etc/rc.d/rc.sysinit初始化用户空间环境;此脚本会执行许多系统初始化任务;
启动对应级别下设定为要启动的服务,关闭那些设定为要停止的服务; l1:1:wait:/etc/rc.d/rc 1l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3 rc是一个脚本,传递一个参数,表示运行这个参数模式的相应脚本
例如:启动虚拟终端:一下内容表示当你在2345级别下切换终端时会自动运行/sbin/mingetty(启动虚拟终端)程序;这就是我们用ctrl+alt+F# 启动虚拟终端的原因
一般启动6个虚拟终端:
tty1:2345:respawn:/sbin/mingetty tty1
tty2:2345:respawn:/sbin/mingetty tty2
tty3:2345:respawn:/sbin/mingetty tty3
每个虚拟终端启动之后,会立即通过此终端附加一个应用程序(/sbin/mingetty)调用login程序
打开虚拟终端的程序除了mingetty之外,还有诸如getty等;
如果默认级别为5,还会启动一个图形虚拟终端;会附加X应用程序; 总结(centos 5用户空间的启动流程): /sbin/init (/etc/inittab) 设置默认运行级别 ―> 运行系统初始化脚本,完成系统初始化 ―> 关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务―> 设置登录终端 [―> 启动图形终端] centos 6:
(1) CentOS 6的init程序为upstart,其配置文件依然为/etc/init/*.conf;(/etc/inittab 仅用于定义默认运行级别)此些配置遵循upstart语法格式进行编程;
(2) CentOS 6的服务控制事实上大多数并没有使用upstart脚本来控制,而依然使用的是SysV风格的脚本;
注意:*.conf为upstart风格的配置文件;rcS.conf
rc.conf
tty.conf
start-tty.conf centos 7
init程序:systemd,配置文件:/usr/lib/systemd/system/ , /etc/systemd/system/ 完全兼容SysV脚本机制;因此,service命令依然可用;不过,建议使用systemctl命令来控制服务;
# systemctl {start|stop|restart|status} name[.service]注意:centos 7 启动时init中的服务没有什么启动流程,服务都是同时并行启动,服务之间的依赖关系在启动时默认不解决;等服务都启动好后才解决依赖问题。(如果你在开机时就只用到三个那么就只启动三个服务,其他都默认不启动,等用到的时候再启动!)
/etc/rc.d目录讲解
1 init.d目录 里面包括了各种系统服务的文件。rc#.d里面的各