一、启动过程
1. 开机流程简述
1)加载BIOS硬件信息,并获取第一个启动设备的代号
2)读取第一个启动设备的MBR的引导加载程序的启动信息
3)加载核心操作系统的核心信息,核心开始解压缩,并且尝试驱动所有硬件设备
4)核心执行init程序并获取运行信息
5)init执行/etc/rc.d/rc.sysinit文件
6)启动核心的外挂模块(/etc/modprobe.conf)
7)init执行运行的各个批处理文件(Script)
8)init执行/etc/rc.d/rc.local
9)执行/bin/login程序,等待用户登录
10)登录之后开始以shell控制主机
如下图:
2. 获取运行等级
在第4步中,init是系统第一个执行的程序(PID为1),它读取文件/etc/inittab来获取运行等级(Run level),后面它就是通过这个运行等级的设置值来启动不同的服务项目的。
3. 根据运行等级启动脚本
在第7步中,init根据前面获取的运行等级,来启动相关的服务。那么服务脚本存放在哪里呢?
服务脚本根据运行等级N存放在/etc/rc.d/rcN.d目录中,如下图所示:
选其中一个目录,如rc3.d查看一下里面的文件,可以发现里面都是链接文件:
它们都是以K或者S为开头的文件,链接到/etc/rc.d/init.d里的shell脚本。这些脚本都使用case…esac语法,而且支持的变量($1)主要有start和stop,一般来说,如果想要启动一些服务,譬如sysstat,需要使用:
/etc/rc.d/init.d/sysstat start
如果关闭该服务,就使用:
/etc/rc.d/init.d/sysstat stop
所以要在运行等级3下执行某个服务,就要将其写入/etc/rc.d/rc3.d中,但既然服务已经在/etc/rc.d/init.d(为了方便,系统建了一个符号链接/etc/init.d指向了/etc/rc.d/init.d)里建好了,自然可以使用链接方式链接到/etc/rc.d/init.d/内的相关shell脚本,不过考虑到start或stop变量,就有了S和K开头的文件名了。
另外,不同的服务有可能是相关联的,譬如,要启动WWW服务,总需要网络,所以/etc/rc.d/init.d/network就需要先启动,于是系统通过在S或K后面接一个数字来表示执行权限,以决定执行顺序。总结一下:
· 在/etc/rc.d/rcN.d内以S开头的文件,为开机时需要启动的服务
· 在目录中以K开头的文件,为关机时需要关闭的服务
· S和K后面接的数字,表示该文件的执行权限,数字越小权限越大,越早被执行
二、运行等级
1. linux有7个运行等级
· 0 - halt:系统关机,默认运行等级不能设为0,否则不能正常启动
· 1 - single user mode:单用户维护模式,root权限,用于系统维护,禁止远程登陆
· 2 - Multi-user,without NFS:多用户模式,和等级3类似(没有NFS)
· 3 - Full multi-user mode:完整的含有网络功能的多用户纯文本模式
· 4 - unused:系统未使用,保留给用户自定义
· 5 - X11:与等级3类似,但使用X Windows
· 6 - reboot:重新启动,默认运行等级不能设为6,否则不能正常启动
2. 查看当前运行等级
使用runlevel命令,结果会显示两个数字,第一个数字表示前一个运行等级,第二个表示当前运行等级,如果没切换过,则第一个数字显示为N
3. 临时切换运行等级
使用命令init RunLevel,RunLevel为你需要切换的运行等级。但重启后恢复原来的运行等级。
另外,如果系统安装了X-Windows,而且当前运行等级不是5,可以直接输入startx开启图形界面,但是奇怪的是并不影响当前运行等级(笔者的系统是centos6.5系统)。
4. 修改默认运行等级
编辑 /etc/inittab文件:
将id后面的数字改为你需要的运行等级,保存,重启。
三、总结
本文主要想理清楚的其实是运行等级和执行权限这些在linux系统中起到的作用,所以开篇简单的讲述了一下开机流程,然后抓其中的两个步骤,讲解系统如何根据运行等级组织脚本文件,并通过执行权限去执行相应的服务脚本,最后深入讲述运行等级的具体意义,以及改变运行等级的方法。
在这里声明一下,本文讲的开机过程根据不同的系统会有一定的差异(特别是centos7.x系统),但是本质上还是这一套思路。
四、参考
1.《鸟哥的linux私房菜》(第二版)