系统启动和内核管理(一)
(以CentOS5/6为例)
一、Linux的组成:
1、Linux:kernel+rootfs
kernel:进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能。
rootfs:程序和glibc
库:函数集合,function,调用接口(头文件负责描述);
过程调用,procedure,无返回值;
函数调用,function;
程序,二进制执行文件
2、内核设计流派:单内核,把所有的功能集成于同一个程序;微内核,每种功能使用一个单独子系统实现。
3、Linux的内核:
(1)内核特点:支持模块化(.ko,内核对象);支持内核模块的动态装载和卸载
(2)组成部分:核心文件,/boot/vmlinuz-3.10.0-327.el7.x86_64 (CentOS7)
ramdisk:辅助的伪根系统
CentOS 5: /boot/initrd-VERSION-release.img
CentOS6,7: /boot/initramfs-VERSION-release.img
(3)模块文件:/lib/modules/3.10.0-327.el7.x86_64/ (CentOS6)
二、Linux的启动流程及功能模块讲解:
1、CentOS6的启动流程:
MBR:446: bootloader,64: 分区表, 2: 55AA (破坏其中的一个字节都启动不了,命令#dd if=/dev/zero of=/dev/sda bs=1 count=1,请谨慎操作该命令)
GRUB:primary boot loader :1st stage,1.5 stage;secondary boot loader :2nd stage,分区文件
kernel:自身初始化;探测可识别到的所有硬件设备;加载硬件驱动程序(可能借助于ramdisk加载驱动);以只读方式挂载根文件系统;运行用户空间的第一个应用程序:/sbin/init
由下图中的红色框标示的程序解决加载启动时跟文件系统的格式模块问题:
将initramfs-2.6.32-642.el6.x86_64.img重命名成initramfs-2.6.32-642.el6.x86_64.img.gz后,使用gunzip命令解压,得到还是initramfs-2.6.32-642.el6.x86_64.img,使用命令file可以看出该文件是cpio压缩文件,使用命令cpio -id 解压可以得到
如下图的解压文件,相当于一个根(虚拟根)结构文件:
启动流程步骤说明:(1)加载BIOS的硬件信息,获取第一个启动设备。
(2)读取第一个启动设备MBR的引导加载程序(grub)的启动信息
(3)加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备。
(4)核型执行init程序并获取运行信息。
(5)Init执行/etc/rc.d/rc.sysinit文件。
(6)启动核心的外挂模块(/etc/modprobe.conf)。
(7)Init执行运行的各个批处理文件(scripts).
(8)Init执行/etc/rc.d/rc.local.
(9)执行/bin/login程序,等待用户登录。
(10)登录之后开始以Shell控制主机。
2、POST:加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测。
ROM:BIOS,Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等。
RAM:CMOS互补金属氧化物半导体,保存各项参数的设定
按次序查找引导设备,第一个有引导程序的设备为本次启动设备
3、bootloader:引导加载器,引导程序
Windows:ntloader,仅是启动OS
Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核
4、init程序的类型:
SysV:init, CentOS 5之前;配置文件:/etc/inittab
Upstart:init,CentOS6;配置文件:/etc/inittab, /etc/init/*.conf
Systemd:systemd, CentOS 7;配置文件:/usr/lib/systemd/system,/etc/systemd/system
5、ramdisk:
内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问
ramdisk–> ramfs提高速度
CentOS 5: initrd, 工具程序:mkinitrd(修复工具)
CentOS 6: initramfs,工具程序:mkinitrd, dracut
注:修复initramfs-2.6.32-642.el6.x86_64.img,先挂载光盘,进入救援模式;执行命令#mkinitrd /boot/initramfs-`uname -r`.img `uname -r` 即可(CentOS5,将initramfs改成initrd)
6、运行级别:(/sbin/init CentOS6之前)
运行级别:为系统运行或维护等目的而设定;0-6:7个级别
0:关机
1:单用户模式(root自动登录), single, 维护模式
2: 多用户模式,启动网络功能,但不会启动NFS;维护模式
3:多用户模式,正常模式;文本界面
4:预留级别;可同3级别
5:多用户模式,正常模式;图形界面
6:重启
默认级别:3, 5
切换级别:init #
查看级别:runlevel; who -r
7、init初始化:
init读取其初始化文件:/etc/inittab
初始运行级别(RUN LEVEL)
系统初始化脚本
对应运行级别的脚本目录
捕获某个关键字顺序
定义UPS电源终端/恢复脚本
在虚拟控制台生成getty
在运行级别5初始化X
8、CentOS5的inittab文件
(1)配置文件:/etc/inittab,每一行定义一种action以及与之对应的process
(2)格式:id:runlevel:action:process
级别格式定义如下:
id:3:initdefault: 默认级别模式为3,字符界面
si::sysinit:/etc/rc.d/rc.sysinit 无论是任何级别模式,系统都需要读取初始化文件
l0:0:wait:/etc/rc.d/rc0
l1:1:wait:/etc/rc.d/rc1…
……………………
l6:6:wait:/etc/rc.d/rc6
(3)action选项:wait: 切换至此级别运行一次
respawn:此process终止,就重新启动之
initdefault:设定默认运行级别;process省略
(4)sysinit:设定系统初始化方式(脚本),此处一般为指定/etc/rc.d/rc.sysinit
A、 设置主机名;B、设置欢迎信息;C、激活udev和selinux
D、挂载/etc/fstab文件中定义的文件系统
E、检测根文件系统,并以读写方式重新挂载根文件系统
F、设置系统时钟;G、激活swap设备;H、根据/etc/sysctl.conf文件设置内核参数
I、激活lvm及software raid设备;K、加载额外设备的驱动程序;L、清理操作
(5)快捷键关机(Ctrl+Alt+Delete):ca::ctrlaltdel:/sbin/shutdown -t3 -r now (建议注销掉该项)
9、CentOS6 /etc/inittab和相关文件
/etc/inittab:设置系统默认的运行级别
id:3:initdefault:
/etc/init/control-alt-delete.conf
/etc/init/tty.conf
/etc/init/start-ttys.conf
/etc/init/rc.conf
/etc/init/prefdm.conf
三、服务启动流程:
1、当系统默认启动的级别是3的时候,会读取/etc/rc.d/rc3.d;该目录下存放的都是服务程序。
无论是任何的一种启动模式,其对应目录下的服务都是软链接指向:
(K开头的服务的关闭的;S开头的是开启运行的)
K*: K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务
S*: S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务
# cat /etc/rc.d/rc
2、chkconfig命令:
(1)查看服务在所有级别的启动或关闭设定情形:chkconfig [–list] [name]
(2)添加/删除服务命令:chkconfig –add name;chkconfig –del name(移除服务后,原文件不会被删除,需要到/etc/init.d目录下手动删除相应的文件)
(3)服务脚本的顶头格式设置:
#!/bin/bash
#
#chkconfig:– 91 35
#description:服务名称 script
#LLLL 表示初始在哪个级别下启动,–表示都不启动。(eg:# chkconfig: LLLL nn mm,nn表示的是以S开头的数字,mm表示的是以K开头的数字)
(4)ntsysv命令:字符界面修改当前模式下的服务启动与停止;命令修改当前模式下指定的服务启动与停止,命令#chkconfig[–level levels] name <on|off|reset>;字符界面指定修改那个模式下的服务,命令#ntsysv –level=#
四、xinetd管理的服务:
#chkconfig telnet on 其实修改的是下图的文件:
1、service 命令:手动管理服务
service 服务start|stop|restart
service –status-all
2、瞬态(Transient)服务被xinetd进程所管理
进入的请求首先被xinetd代理
配置文件:/etc/xinetd.conf、/etc/xinetd.d/<service>
与libwrap.so文件链接
用chkconfig控制的服务:chkconfig tftp on
注意:
正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d这个服务脚本,而是指向了/etc/rc.d/rc.local脚本
不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中
/etc/rc.d/rc.local在指定运行级别脚本后运行
可以根据情况,进行自定义修改
五、tty终端设置:
1:2345:respawn:/usr/sbin/mingettytty1
2:2345:respawn:/usr/sbin/mingettytty2
…
6:2345:respawn:/usr/sbin/mingettytty6
mingetty会自动调用login程序
x:5:respawn:/etc/X11/prefdm –nodaemon (图形界面)
总结:/sbin/init–> (/etc/inittab) –> 设置默认运行级别–> 运行系统初始脚本、完成系统初始化–> (关闭对应下需要关闭的服务)启动需要启动服务–> 设置登录终端
CentOS 6 init程序为: upstart, 其配置文件:
/etc/inittab, /etc/init/*.conf,配置文件的语法遵循upstart配置文件语法格式,和CentOS5不同
破解root密码:将机器重启(前提是在机器面前),启动界面开始时按任意键,输入“a”,然后再输入1(选择1模式)或者s或者S或者single
演示服务添加与删除:
(1)在/etc/init.d目录下新建个脚本testscript,并赋予执行权限
(2)添加脚本到服务中:
(3)测试添加的服务:
(4)删除添加的服务:
原创文章,作者:Aaron_wang,如若转载,请注明出处:http://www.178linux.com/44677
评论列表(1条)
总结的很好,但对于一些关键词,希望能通过一些通俗易懂的话描述出来,这会让文章更具有可读性。