Linux系统的开机过程
1. 主机加电自检,加载BIOS硬件信息
2. 加载MBR到内存
3. GRUB引导
4. 加载Linux内核
5. 运行第一个进程init
6. 读取rc.sysinit文件
7. 执行/bin/login
一、 加点自检
当主机通电时,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。BIOS程序一般被存放在主板ROM(只读存储芯片)中,即使关机或者断电,该程序也不会丢失。CMOS是主板上的一块可读写的RAM芯片,里面装的是关于系统配置的具体参数。当系统加电后,系统读取硬件固化在主板ROM上的bios程序,并开始执行。bios首先检查硬件,通过BIOS程序去加载CMOS的信息,然后根据bios中设置的启动顺序将控制器交给下一阶段,即MBR。
二、 加载MBR到内存
MBR(Main Boot Record)是磁盘最前边的一段主引导记录(一段程序),由于在硬盘的第一个扇区,所以也叫做主引导扇区,它在硬盘上的位置是(0柱面,0磁头,1扇区)。MBR的主要作用是检查分区表是否正确并且将控制权交给硬盘主分区(活动分区)上的引导程序(如GNU GRUB)。
三、 GRUB引导
GRUB是一个多重操作系统启动管理器,用来引导不同的系统。在MBR的前446字节存放的就是GRUB程序的一部分,在grub中可以由用户选择启动哪个分区的哪个系统。
四、 加载Linux内核
五、 运行第一个进程init
内核加载成功后,第一个运行的程序是/sbin/init。它根据配置文件(Debian系统是/etc/initab)产生init进程。这是Linux启动后的第一个进程,pid进程编号为1,其他进程都是它的后代。
Linux系统的7个运行级别(runlevel):
0:系统停机状态,系统默认运行级别不能设置为0,否则不能正常启动
1:单用户工作状态,root权限,用于系统维护,禁止远程登录
2:无网络支持的多用户模式,顾名思义就是支持多用户登录
3:字符界面多用户模式,文本命令行界面,一般服务器都是此模式
4:系统未使用,保留
5:图形界面多用户模式,系统启动之后会进入到图形化桌面系统中
6:重新引导系统,重启模式,千万不要设置为6,和0相似
每一个运行级别都在/etc目录下有一个对应的子目录,可以指定每一个运行级别需要加载哪些程序,rcN.d的字母d是directory的意思,表示这是一个目录。
六、 读取rc.sysinit文件
读取完运行等级后,Linux系统就会运行第一个用户层进程:/etc/rc.d/rc.sysinit,该进程的功能是设定PATH变量、设定网络配置、启动/swap分区、设置/proc、系统函数和Selinux等等。完成上述流程后,会读取/etc/modules.conf文件以及/etc/modules.c目录下的文件来加载系统的内核模块。根据设定的运行等级,系统会执行/etc/rc0.d到/etc/rc6.d/中相应的脚本程序,来完成相应的初始化工作和启动相应的服务,都是一些服务程序。其中以S开头表示系统即将启动,如果以K开头,则代表停止该服务。S和K后紧跟的数字为启动顺序编号。
七、 读取rc.local文件
启动完服务程序后,会读取执行/etc/rc.d/rc.local文件,我们可以对该文件设定一些关键核心业务开机自启,也就是Linux留给用户进行个性化的地方,你可以把你想要设置和启动的东西放到这里。
八、 执行/bin/login
最后执行/bin/login程序,启动到系统登录界面,等待用户输入用户名和密码,然后就可登录到Shell终端。
RHEL6启动过程:
开机自检BIOS -> MBR引导 -> GRUB菜单 -> 加载内核 -> Init进程初始化
RHEL7启动过程:
开机自检BIOS -> MBR引导 -> GRUB2菜单 -> 加载内核 -> Systemd进程初始化
GRUB2相比较GRNB:更健壮、可移植、更强大。支持BIOS、EFI和OpenFirmware,支持GPT和MBR分区表。支持非Linux系统,如苹果HFS文件系统和window的NTFS文件系统。
systemd的目标是:尽可能启动更少进程;尽可能将更多进程并行启动。systemd尽可能减少对shell脚本的依赖。传统的sysvinit使用inittab来决定运行那些shell脚本,大量使用shell脚本被认为是效率低下无法并行的原因。
init和Systemd的区别
- init
- 启动时间长,init是串行启动,只有前一个进程启动完,才会启动下一个进程。
- 启动脚本复杂,Init进程只是执行脚本,不管其他事情,脚本需要自己处理各种情况,这往往使得脚本变得很长。
- 位于/sbin/init,由Linux内核加载运行,是系统中第一个进程,PID永远为1。
对于支持service的程序,安装的时候,会自动的在/etc/init.d目录添加一个配置文件。
-
systemd:
- 按需启动服务,减少系统资源消耗。
- 尽可能并行启动进程,减少系统启动等待时间。
- 由Linux内核加载运行,位于/usr/lib/systemd/systemd,时系统中第一个进程,PID永远为1。
对于支持systemd的程序,安装的时候,会自动的在/usr/lib/systemd/system目录添加一个配置文件。
相关的配置文件
init进程的配置文件:
参数 | 说明 |
---|---|
/etc/init.d/ | 服务启动脚本配置文件 |
/etc/inittab | 默认运行级别配置文件 |
/etc/init/rcS.conf | 系统初始化配置文件 |
/etc/init/rc.conf | 各运行级别初始化的配置文件 |
/etc/init/rcS-sulogin.conf | 单用户模式启动/sbin/sushell环境的配置文件 |
/etc/sysconfig/init | tty终端的配置文件 |
systemd进程的配置文件: | |
参数 | 说明 |
---- | ---- |
/etc/systemd/system/default.target | 取代/etc/inittab文件,通常符号链接到/lib/systemd/system/graphical.target |
/run/systemd/system/ | 系统执行过程中所产生的服务脚本 |
/etc/systemd/system/ | 里面存放着不同级别开启自启服务 |
运行级别和说明:
查看运行级别:
- runlevel:显示切换前的运行级别和当前运行脚本
- systemctl get-default:显示当前运行级别
永久设置开机模式 - systemctl set-default multi-user.target 设置为文本模式
- systemctl set-default graphical.target 设置为图像模式
- 修改/etc/inittab默认运行级别配置文件
Linux服务管理
以apache服务为例: