Linux系统开机启动流程

时间:2021-02-08 05:16:09

(来源学习Linux时,自己做的笔记)

Linux系统有7个运行级别(runlevel)
运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
运行级别2:多用户状态(没有NFS)
运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11控制台,登陆后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

运行级别的原理:
1。在目录/etc/rc.d/init.d下有许多服务器脚本程序,一般称为服务(service)
2。在/etc/rc.d下有7个名为rcN.d的目录,对应系统的7个运行级别
3。rcN.d目录下都是一些符号链接文件,这些链接文件都指向init.d目录下的service脚本文件,命名规则为K+nn+服务名或S+nn+服务名,其中nn为两位数字。
4。系统会根据指定的运行级别进入对应的rcN.d目录,并按照文件名顺序检索目录下的链接文件
     对于以K开头的文件,系统将终止对应的服务
     对于以S开头的文件,系统将启动对应的服务
5。查看运行级别用:runlevel
6。进入其它运行级别用:init N
7。另外init0为关机,init 6为重启系统
    由于现在的Linux系统安装完后就运行在第5个级别,即系统启动后直接进入图形界面,而不用在字符模式下登录后用startx或者xinit 来起动图形界面。建议在系统安装完成后把系统的默认运行等级设置在第3级,在字符终端登录后,再手工输入startx 命令起动图形界面。可以用如下的方法修改:
用文本编辑器修改 /etc/inittab文件,把代码:
id:5:initdefault:这一行,修改成
代码:
id:3:initdefault:保存后就reboot重起,系统就默认起动到字符界面。不同运行级别之间的 差别的在于系统默认起动的服务的不同,如运行级别3默认不启动X图形界面服务,而运行级别5 却默认起动。本质上是没有区别的,更无所谓不同级别间功能强弱的问题。用户完全可自给定义不同级别的默认服务。在任何运行级别,用户都可用init 命令来切换到其他运行级别。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*Linux系统引导流程
*开机自检
*MBR引导
*
GRUB
*加载linux内核和image映像
*
INIT进程初始化
-------------------
Linux系统开机启动流程流程简介
1. 加载 BIOS 的硬件信息、进行自我测试,并依据设定获得第一个可开机的设备;
2. 读取并执行第一个开机设备内 MBR 的 boot Loader(grub 等程序);
3. 依据 boot loader 的设置加载 Kernel,Kernel 会开始检测硬件与加载驱动程序;
4. 内核启动 init;
5. 系统初始化:(/etc/init/rcS.conf exec /etc/rc.d/rc.sysinit);
6. init 找到/etc/inittab 文件,确定默认的运行级别(X) (/etc/init/rcS.conf exec telinit $runlevel);
7. 触发相应的 runlevel 事件(/etc/init/rc.conf exec /etc/rc.d/rc $RUNLEVEL);
8. 开始运行/etc/rc.d/rc,传入参数 X;
9. /etc/rc.d/rc 脚本进行一系列设置,最后运行相应的/etc/rcX.d/中的脚本;
10. /etc/rcX.d/中的脚本按事先设定的优先级依次启动;
11. 最后执行/etc/rc.d/rc.local;
12. 加载终端或 X-Window 接口。
------------------------------

一、开机流程

1. Power on开启电源
-----
2. 启动主板上的BOIS,初始化硬件:init是所有进程的发起者和控制者。因为在任何基于Linux的系统中,它都是第一个运行的进程,所以init进程的编号(PID)永远是 1
init进程有以下
两个作用
1) init进程的第一个作用是扮演终结父进程的角色。因为init进程永远不会被终止,所有系统总是可以确信它的存在,并在必要的时候以它为参照。如果某个进程在它衍生出来的全部子进程结束之前被终止,就会出现必须以init为参照的情况,此时那些失去父进程的子进程就都会以init作为它们的父进程
2) init的第二个作用是在进入某个特定的运行级别时运行相应的程序,以此对各种运行级别

init的工作是根据/etc/inittable 来执行相应的脚本,进行系统初始化,如设置键盘、字体、装载模块、设置网络
-------------------
Linux系统开机启动流程/etc/inittable只实现开机的运行级别
/etc/rc.d/rc.sysinit:由init执行的第一个脚本

init在一开始会先判断所要进入的runlevel为1~6的哪一种模式,跟着就直接进入rc.sysinit文件设置大部分和系统相关的环境。
rc.sysinit完成设置网络、主机名、加载文件系统等初始化工作
1) 获取网络环境和主机类型
首先读取网络配置文件/etc/sysconfig/network,获取主机名称与默认网关(GATEWAY)等网络环境
2) 测试与载入内存设备/proc及USB设备/sys
除载入内存设备/proc之外,还会主动检测系统上是否有USB的设备,若有,则会主动加载USB设备的驱动程序,并且尝试载入USB的文件系统
3) 决定是否启动SELINUX
4) 接口设备的检测与即插即用(PnP)参数测试
5) 用户自定义模块的加载
用户可以在/etc/sysconfig/modules/*.modules 加入自定义的模块,此时会加载到系统中
6) 加载核心的相关配置
系统会自动去读取/etc/sysctl.conf文件的设置值,使核心功能复合我们的要求
7) 设置系统时间(clock)
8) 设置终端控制台(console)的字形
9) 设置RAID和LVM等硬盘功能
10) 以FSCK检验磁盘文件系统
11) 进入磁盘配额 quota 功能(非必要)
12) 重新以可读取模式载入系统磁盘
13) 启动 quota功能
14) 启动系统随机数设备
15) 清除启动过程中的临时文件
16) 将启动相关信息加载到/var/log/dmesg文件中

/var/log/dmesg文件中能查看到系统开机的一系列流程
[root@lcl ~]# dmesg | more
Initializing cgroup subsys cpuset
Initializing cgroup subsys cpu
Linux version 2.6.32-279.el6.x86_64 (mockbuild@x86-008.build.bos.redhat.com) (gc
c version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC) ) #1 SMP Wed Jun 13 18:24:36 ED
T 2012
Command line: ro root=UUID=d43052a2-de68-41ae-9bc1-4de0e3c379d3 rd_NO_LUKS KEYB
OARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_
NO_DM rhgb quiet
KERNEL supported cpus:
Intel GenuineIntel
AMD AuthenticAMD
Centaur CentaurHauls
BIOS-provided physical RAM map:
BIOS-e820: 0000000000000000 - 000000000009f800 (usable)
BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved)
BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved)
BIOS-e820: 0000000000100000 - 00000000cdce0000 (usable)
...
------------------------------------------
重启后出现error15,表明stage1,stage1_5,stage2被破坏
-------------------------
删除内核镜像文件和初始化虚拟磁盘文件,下图是重启后出现的现象
Linux系统开机启动流程修复
先mount /dev/cdrom /mnt
Linux系统开机启动流程---------------------
系统启动硬件信息
1./etc/rc.d/rc.sysinit
*由init进程调用执行
*完成设置网络、主机名、加载文件系统等初始化工作

2./etc/rc.d/rc脚本文件
*由init进程调用执行
*根据指定的运行级别,加载或终止相应的系统服务

3.红帽企业版linux服务脚本位于/etc/rc.d/init.d中
4. /etc/rc.d/rcn.d目录中
包含运行级别n执行服务状态配置的符号连接
Linux系统开机启动流程

Linux系统开机启动流程

Linux系统开机启动流程

/init = /bin/bash
Linux系统开机启动流程

Linux系统有7个运行级别(runlevel)
运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
运行级别2:多用户状态(没有NFS)
运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11控制台,登陆后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

运行级别的原理:
1。在目录/etc/rc.d/init.d下有许多服务器脚本程序,一般称为服务(service)
2。在/etc/rc.d下有7个名为rcN.d的目录,对应系统的7个运行级别
3。rcN.d目录下都是一些符号链接文件,这些链接文件都指向init.d目录下的service脚本文件,命名规则为K+nn+服务名或S+nn+服务名,其中nn为两位数字。
4。系统会根据指定的运行级别进入对应的rcN.d目录,并按照文件名顺序检索目录下的链接文件
     对于以K开头的文件,系统将终止对应的服务
     对于以S开头的文件,系统将启动对应的服务
5。查看运行级别用:runlevel
6。进入其它运行级别用:init N
7。另外init0为关机,init 6为重启系统
    由于现在的Linux系统安装完后就运行在第5个级别,即系统启动后直接进入图形界面,而不用在字符模式下登录后用startx或者xinit 来起动图形界面。建议在系统安装完成后把系统的默认运行等级设置在第3级,在字符终端登录后,再手工输入startx 命令起动图形界面。可以用如下的方法修改:
用文本编辑器修改 /etc/inittab文件,把代码:
id:5:initdefault:这一行,修改成
代码:
id:3:initdefault:保存后就reboot重起,系统就默认起动到字符界面。不同运行级别之间的 差别的在于系统默认起动的服务的不同,如运行级别3默认不启动X图形界面服务,而运行级别5 却默认起动。本质上是没有区别的,更无所谓不同级别间功能强弱的问题。用户完全可自给定义不同级别的默认服务。在任何运行级别,用户都可用init 命令来切换到其他运行级别。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*Linux系统引导流程
*开机自检
*MBR引导
*
GRUB
*加载linux内核和image映像
*
INIT进程初始化
-------------------
Linux系统开机启动流程
流程简介
1. 加载 BIOS 的硬件信息、进行自我测试,并依据设定获得第一个可开机的设备;
2. 读取并执行第一个开机设备内 MBR 的 boot Loader(grub 等程序);
3. 依据 boot loader 的设置加载 Kernel,Kernel 会开始检测硬件与加载驱动程序;
4. 内核启动 init;
5. 系统初始化:(/etc/init/rcS.conf exec /etc/rc.d/rc.sysinit);
6. init 找到/etc/inittab 文件,确定默认的运行级别(X) (/etc/init/rcS.conf exec telinit $runlevel);
7. 触发相应的 runlevel 事件(/etc/init/rc.conf exec /etc/rc.d/rc $RUNLEVEL);
8. 开始运行/etc/rc.d/rc,传入参数 X;
9. /etc/rc.d/rc 脚本进行一系列设置,最后运行相应的/etc/rcX.d/中的脚本;
10. /etc/rcX.d/中的脚本按事先设定的优先级依次启动;
11. 最后执行/etc/rc.d/rc.local;
12. 加载终端或 X-Window 接口。
------------------------------

一、开机流程

1. Power on开启电源
-----
2. 启动主板上的BOIS,初始化硬件:init是所有进程的发起者和控制者。因为在任何基于Linux的系统中,它都是第一个运行的进程,所以init进程的编号(PID)永远是 1
init进程有以下
两个作用
1) init进程的第一个作用是扮演终结父进程的角色。因为init进程永远不会被终止,所有系统总是可以确信它的存在,并在必要的时候以它为参照。如果某个进程在它衍生出来的全部子进程结束之前被终止,就会出现必须以init为参照的情况,此时那些失去父进程的子进程就都会以init作为它们的父进程
2) init的第二个作用是在进入某个特定的运行级别时运行相应的程序,以此对各种运行级别

init的工作是根据/etc/inittable 来执行相应的脚本,进行系统初始化,如设置键盘、字体、装载模块、设置网络
-------------------
Linux系统开机启动流程

/etc/inittable只实现开机的运行级别
/etc/rc.d/rc.sysinit:由init执行的第一个脚本

init在一开始会先判断所要进入的runlevel为1~6的哪一种模式,跟着就直接进入rc.sysinit文件设置大部分和系统相关的环境。
rc.sysinit完成设置网络、主机名、加载文件系统等初始化工作
1) 获取网络环境和主机类型
首先读取网络配置文件/etc/sysconfig/network,获取主机名称与默认网关(GATEWAY)等网络环境
2) 测试与载入内存设备/proc及USB设备/sys
除载入内存设备/proc之外,还会主动检测系统上是否有USB的设备,若有,则会主动加载USB设备的驱动程序,并且尝试载入USB的文件系统
3) 决定是否启动SELINUX
4) 接口设备的检测与即插即用(PnP)参数测试
5) 用户自定义模块的加载
用户可以在/etc/sysconfig/modules/*.modules 加入自定义的模块,此时会加载到系统中
6) 加载核心的相关配置
系统会自动去读取/etc/sysctl.conf文件的设置值,使核心功能复合我们的要求
7) 设置系统时间(clock)
8) 设置终端控制台(console)的字形
9) 设置RAID和LVM等硬盘功能
10) 以FSCK检验磁盘文件系统
11) 进入磁盘配额 quota 功能(非必要)
12) 重新以可读取模式载入系统磁盘
13) 启动 quota功能
14) 启动系统随机数设备
15) 清除启动过程中的临时文件
16) 将启动相关信息加载到/var/log/dmesg文件中

/var/log/dmesg文件中能查看到系统开机的一系列流程
[root@lcl ~]# dmesg | more
Initializing cgroup subsys cpuset
Initializing cgroup subsys cpu
Linux version 2.6.32-279.el6.x86_64 (mockbuild@x86-008.build.bos.redhat.com) (gc
c version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC) ) #1 SMP Wed Jun 13 18:24:36 ED
T 2012
Command line: ro root=UUID=d43052a2-de68-41ae-9bc1-4de0e3c379d3 rd_NO_LUKS KEYB
OARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_
NO_DM rhgb quiet
KERNEL supported cpus:
Intel GenuineIntel
AMD AuthenticAMD
Centaur CentaurHauls
BIOS-provided physical RAM map:
BIOS-e820: 0000000000000000 - 000000000009f800 (usable)
BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved)
BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved)
BIOS-e820: 0000000000100000 - 00000000cdce0000 (usable)
...
------------------------------------------
重启后出现error15,表明stage1,stage1_5,stage2被破坏
-------------------------
删除内核镜像文件和初始化虚拟磁盘文件,下图是重启后出现的现象
Linux系统开机启动流程
修复
先mount /dev/cdrom /mnt
Linux系统开机启动流程
---------------------
系统启动硬件信息
1./etc/rc.d/rc.sysinit
*由init进程调用执行
*完成设置网络、主机名、加载文件系统等初始化工作

2./etc/rc.d/rc脚本文件
*由init进程调用执行
*根据指定的运行级别,加载或终止相应的系统服务

3.红帽企业版linux服务脚本位于/etc/rc.d/init.d中
4. /etc/rc.d/rcn.d目录中
包含运行级别n执行服务状态配置的符号连接

Linux系统开机启动流程
Linux系统开机启动流程

Linux系统开机启动流程
/init = /bin/bash

Linux系统开机启动流程