Linux系统组成
从动态视角看:由内核+根文件系统组成
从静态视角看:由磁盘分区及相关文件组成
内核设计流派
单内核:所有内核功能集中于同一程序;
微内核:每种功能使用一个单独的子系统实现;内核中某一模块或功能的破坏不会影响其他功能的正常运行。
linux内核特点
支持模块化:模块文件.ko结尾(kernel object)
支持模块运行时动态装载或卸载:
linux内核组成部分
核心文件:/boot/vmlinuz-Version-release
模块文件:/lib/modules/Version-Release
内核启动之后,读取rootfs文件系统生成的init程序,由init管理系统。之后内核退居幕后,只负责特权级操作。
ramdisk:把内存中的某段空间当作磁盘来使用。"伪根文件系统"
CentOS5:/boot/initrd-Version-release.img
CentOS6、7:/boot/initramfs-Version-release.img
CentOS启动流程:
一、内核空间
1、POST加电自检:对各硬件进行检测,确保计算机能正常运行
CPU访问ROM加载自检程序
2、BOOT Sequence:选择启动次序,加载Boot Loader。
按次序查找各引导设备,第一个有引导程序的设备即为本次启动要用到的设备。
3、Boot Loader: 加载Grub。
由于存放Bootloader的磁盘空间大小仅为446字节,而grub的大小明显超出446字节,因此,将grub分为三个阶段。Bootloader仅存放grub的第一阶段,用于引导。
GRUB功能:提供菜单,运行用户选择要启动的系统或不同版本,把用户选定的内核装载到RAM中,解压、展开,而后把系统的控制权移交给内核。
GRUB三阶段:
stage1:BootLoader(位于MBR)。
stage1.5:存放文件系统驱动信息,位于MBR之后,用于引导stage1找到stage2,从而能够访问stage2所在的分区。
stage2:位于/boot/grub目录下。
stage2的功用:
1)提供菜单、并提供交互式节后
摁e:进入编辑模式,用于编辑菜单
摁c:进入命令模式,交互式接口
2)加载用户选择的内核或操作系统
运行传递参数给内核
可隐藏菜单
3)位菜单提供保护机制
为编辑菜单进行认证
为启用内核或操作系统进行认证
GRUB分类:
Windows:ntloader
Linux:
LILO:Linux Loader。缺陷:不能加载1024之后的柱面,因此被grub取代。
GRUB:GRand Uniform Bootloader
CentOS5、6 :Grub 0.x 版本,也称之为grub legacy
CentOS7:Grub 1.x版本,也称之为Grub2
GRUB存放于/boot中,配置文件为/boot/grub/grub.conf,在/etc/目录下有一名为grub.conf的连接文件。
4、kernel阶段
1)自身初始化
2)探测可识别到的所有硬件设备
3)加载硬件驱动程序(可能借助ramdisk来加载)
4)以只读方式挂载根文件系统
5)运行用户空间的第一个应用程序:/sbin/init
init程序的类型:
CentOS5及之前:SysV
配置文件:/etc/inittab
CentOS6:upstart
配置文件:/etc/inittab(为了兼容以前的版本),/etc/init/*.conf
CentOS7:Systemd
配置文件:/usr/lib/systemd/system;/etc/systemd/system
二、用户空间
5、/etc/inittab配置文件:
每行定义一种action以及与之相对应的process,配置释义:
id:runlevels:action:process
id:一个任务的标识符
runleves:在哪些级别启动此任务,#,###;也可以为空,表示所有级别
action:在什么条件下启动此任务
process:任务
action:
wait:等待切换至此任务所在的级别时执行一次。
respawn:一旦此任务终止,就自动重启之。
initdefault:设置默认允许级别,此时,process省略掉
id:3:initdefault #设置默认级别
si:sysinit:/etc/rc.d/rc.sysinit #设定系统初始化方式,此处一般为指定的/etc/rc.d/rc.sysinit脚本
tty1:2345:respawn:/usr/bin/mingetty tty1
tty2:2345:respawn:/usr/bin/mingetty tty2
….
tty6:2345:respawn:/usr/bin/mingetty tty6
在运行级别为2345时,会默认开启6个虚拟终端
1)mingetty会调用login程序
2)getty等程序也能打开虚拟终端。
tty7:5:respawn:/etc/x11/ 启动图形界面
l0:0:wait:/etc/rc.d/rc 0
rc脚本:接受一个运行级别数字为参数。当系统启动时读取到默认运行级别、或运行级别发生变化时,/etc/rc.d/rc脚本将传递运行级别为参数,在/etc/rc.d/rc$runlevel.d/目录下进行操作:其将先kill掉以K开头的服务或脚本,然后启动运行以S开头的服务或脚本。这些脚本为/etc/rc.d/init.d/或/etc/init.d目录下某脚本的连接文件(Symbolinc)
例:l3:3:wait:/etc/rc.d/rc 3 意味着去启动或关闭/etc/rc.d/rc3.d/目录下的脚本所控制范围。
K##*:要停止的服务;##表示优先级,数字越小,越优先关闭;依赖的服务先关闭,而后关闭被依赖。服务a的运行建立在服务b运行的基础上,那么要关掉服务b,得先关掉服务a;意味着服务a的关闭优先级要高于服务b(即a的关闭优先级数字小b的)
S##*:要启动的服务;##表示优先级,数字越小,越优先启动;被依赖的服务先启动,而依赖的服务后启动。仍以服务a的运行建立在服务b的基础上为例,要运行服务a,则服务b得先启动,意味着服务b的启动优先级要高级服务a(即b的启动优先级数字小于a的)
rc脚本框架:
for srv in /etc/rc.d/rc#.d/K*;do
$srv stop
done
for srv in /etc/rc.d/rc#.d/S*;do
$srv start
done
/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/下的每个脚本在各运行级别下的启动或关闭状态。
设置某服务在某个或某几个运行级别下是自动启动还是关闭。
将服务增加为自启动服务的过程
1)创建建自定义服务脚本
2)初始化自定义服务:chkconfig –add srv_script
3)设置启动|关闭级别:chkconfig –level ### srv_script on|off,如果chkconfig设置时不指定运行级别,默认采用脚本中设置的运行级别。
4)启动或关闭服务:chkconfig srv_script on|off
5)查看服务运行信息:chkconfig –list srv_script
注:能被管控的服务脚本必须具备以下的特性。
#!/bin/bash # # chkconfig: runlevel start_nn stop_nn 设置运行级别、服务启动优先级、范围关闭优先级。 #自定义的脚本服务,若不被其他服务依赖,则其启动应该尽量延后,等待系统其他服务启动,关闭时优先关闭 # # description: some comments 脚本注释
注:如果将运行级别设置为‘-’,则在初始化时在所有级别都将关闭。
附:testsrv脚本内容
#!/bin/bash # # testsrv start|stop service testsrv # # chkconfig: 2345 90 20 # description: for test chkconfig how to work prog=`basename $0` if [ $# -lt 1 ];then echo "Usage:$prog {sart|stop|restart|status}" exit 1 fi case $1 in start) echo "startting $prog" ;; stop) echo "stopped $prog" ;; restart) echo "restart $prog finished" ;; status) if pidof $prog &> /dev/null;then echo "$prog is running" else echo "$prog was stopped" fi ;; *) echo "Usage:$prog {sart|stop|restart|status}" exit 2 ;; esac
注:正常级别下,最后启动的一个服务S99local服务链接至/etc/rc.d/rc.local(/etc/rc.local)文件。不便写成脚本的指令可以写入到/etc/rc.d/rc.local文件中。
6、系统初始化脚本文件:/etc/rc.d/rc.sysinit
(1)设置主机名
(2)设置欢迎信息
(3)激活udev设备和selinux
(4)挂载/etc/fstab文件中定义的所有文件系统(包含swap设备)
(5)检测根文件系统,并以读写方式重新挂载根文件系统。
(6)设置系统时钟
(7)根据/etc/sysctl.conf文件的设定,来设置内核参数
(8)激活LVM及软raid设备
(9)激活swap设备
(10)加载额外设备的驱动程序;
(11)清理操作
总结:
POST—> Boot Sequence(BIOS)—>Boot loader(MBR)—>kernel—>rootfs—>/sbin/init —>设置默认运行级别运行系统初始化脚本,完成系统初始化—>关闭对应级别下需要停止的服务;启动对应级别下需要开启的服务—>设置登录终端[—>启动图形终端(由登录终端决定)]
补充:
Centos6上的运行级别:
0:断电关机(halt)
1:单用户模式(Single user),无需认证即可登陆root用户
2:多用户模式(Multiuser),但不提供NFS服务
3:多用户模式,完全功能模式,文本界面
4:预留级别(Full multiuser),未定义;目前若使用4级别登录,同3级别
5:多用户模式(X11),图形界面
6:重启系统(reboot)
注意:级别0、6不能设为默认级别,否则系统不能正常启动。
如何查看当前运行级别:
1、runlevel
2、who -r
3、Centos7:systemctl get-default
如何切换当前运行级别:
init N:N为级别数字
注:CentOS7不再有运行级别概念,在此不做讨论
原创文章,作者:M20-1钟明波,如若转载,请注明出处:http://www.178linux.com/44776