Linux组成
Linux: kernel+rootfs(根文件系统)
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 LOader GRUB: GRand Unified Bootloader GRUB 0.X: GRUB Legacy, GRUB2 例如:你装了个双内核,开机的菜单选项就是grub生成的
GRUB:
primary boot loader : 1st stage,1.5 stage 1.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 1 l2: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里面的各种文件就是来自此文件,只不过换了个名字
;
2./etc/rc->rc.d/rc 此脚本的意义 当init运行等级切换时用于负责启动或停止服务
意味着:通过/etc/rc.d/rc#.d/下所有链接文件来决定如何启动或关闭服务;
所有以S开头的,都被传递start参数以启动; 所有以K开头的,都被传递stop参数以停止;
3./etc/rc.d/rc.sysinit脚本的功能:
(1) 根据配置文件中的设定来设定主机名(读取/etc/sysconfig/network文件中的HOSTNAME进行);
(2) 打印文本欢迎信息;
(3) 激活SELinux和udev;
(4) 挂载所有定义在/etc/fstab文件中的文件系统;
(5) 激活swap设备;
(6) 检测根文件系统,并实现以读写方式重新挂载;
(7) 设置系统时钟;
(8) 根据/etc/sysctl.conf文件设定内核参数的值;
(9) 激活LVM和RAID设备;
(10) 加载额外的设备驱动程序;
(11) 清理操作
4、rc #.d 目录
此目录保存的文件其实都是init.d下的文件只不过改了下名字,以便于服务启动顺序。
K*:要停止的服务;K##*,优先级,数字越小,越是优先关闭;依赖的服务先关闭,而后关闭被依赖的;
S*:要启动的服务;S##*,优先级,数字越小,越是优先启动;被依赖的服务先启动,而依赖的服务后启动;
表示系统最后启动,里面没什么,自己可以把一些服务加进去,这样就便于系统开机就启动
5./etc/init.d/* (/etc/rc.d/init.d/*)脚本执行方式:
# /etc/init.d/SRV_SCRIPT {start|stop|restart|status}
# service SRV_SCRIPT {start|stop|restart|status}
/etc/init.d/SVC_SCRIPTS, 此些脚本遵循LSB服务脚本的定义规范,都接受至少四个最基本的参数,{start|stop|status|restart}; start stop restart status: 查看服务运行状态;
6.在此目录下添加脚本的方法:
1.能被添加的服务的脚本定义格式之一:
#!/bin/bash # # chkconfig: LLLL(运行级别) NN MM # description: LLL表示初始在哪个级别下启动,-表示都不启动 注意:后边的NN表示S##*中##所代表的数字,数字要小于其它依赖于它的服务(要启动在其他依赖于他的服务之前) MM代表K##*中所代表的数字,数字要大于它所依赖的服务的优先级
2. 添加进各个rc#.d
chkconfig —add 脚本的名字
让这个服务脚本受 chkconfig 管理,这样后就会自动的让rc#.d(指明的运行级别下)生成 KNN脚本名字 的文件或S##
这样以后就能直接用 service 服务名字 {stop|start|status}了
删除:chkconfig --del name 修改指定的链接类型:
chkconfig命令
查看服务在所有级别的启动或关闭设定情形:
chkconfig [—list] [name]
添加:SysV的服务脚本放置于/etc/rc.d/init.d (/etc/init.d)
chkconfig —add name:为某存放在/etc/init.d的服务在对应的/etc/rc.d/rc0-6.d目录添加符号链接;
#!/bin/bash #LLLL 表示初始在哪个级别下启动,-表示都不启动 # chkconfig: LLLL nn nn #description
删除:
chkconfig —del name: 把指定SVC_SCRIPTS的在7个级别符号链接统统删除;
修改指定的链接类型
chkconfig [—level levels] name
– —level LLLL:选项明确指定的级别为on或off, 余下的级别保存原有; 省略时表示2345
– ntsysv命令
注意:正常级别下,最后启动的一个服务S99local没有链接至/etc/init.d下的某脚本,而是链接至了/etc/rc.d
/rc.local (/etc/rc.local)脚本;因此,不便或不需写为服务脚本的程序期望能开机自动运行时,直接放置于此脚本文件中即可。
原创文章,作者:qzx,如若转载,请注明出处:http://www.178linux.com/45230