原文:细说 linux 开机及服务启动 后续如果变动,在原文更新。
电源接通。
这个没得说。
加载 BIOS,自检,并取得启动设备
BIOS(Basic Input/Output System的缩写、中文:基本输入输出系统),在IBM
PC兼容系统上,是一种业界标准的固件接口。[1]。BIOS这个字眼是在1975年第一次由CP/M操作系统中出现。BIOS是个人电脑启动时加载的第一个软件。BIOS用于电脑开机时运行系统各部分的的自我检测(Power On Self
Test),并加载引导程序(IPL)或存储在主存的操作系统。此外,BIOS还向操作系统提供一些系统参数。系统硬件的变化是由BIOS隐藏,程序使用BIOS功能而不是直接控制硬件。现代操作系统会忽略BIOS提供的抽象层并直接控制硬件组件。
上面的内容取自维基百科,BIOS(Basic Input Output System) 是一个软件,这个软件已经成为业界标准。一般运行在主板中,通电后会首先启动这个软件,根据设置(主要保存在 COMS 中) 取得各种硬件信息,并进行自我检测,并读取启动设备(即系统所在设备,一般为磁盘,U盘也可以)
读取并执行第一个启动设备内的装载程序
读取到启动设备之后就需要启动引导装载程序(BootLoader,因为各个操作系统的内核文件及格式不一样,所以需要一个装载程序来处理各类操作系统的装载,gurp,spfdisk等)来加载操作系统和内核文件。而所有的操作系统的 BootLoader 都放在启动设备(磁盘)的第一个扇区内,也就是 MBR(Master Boot Record,主引导分区),BOIS 通过 INT13 中断功能即可读取到。
通过 BootLoader 读取到的内核文件,加载驱动程序
读取到内核文件(一般在 /boot 下,如图所示)之后,linux 会将内核文件加压到内存中,利用内核功能,测试并驱动各种硬件(储存设备,cpu,网卡,声卡)。此时,操作系统以自己的需求重新检测了硬件,开始接管 BIOS。
内核调用 init(/sbin/init) 进程
可以看到,此进程的 pid 为1,init 最重要的作用就是准备软件执行环境,如:系统主机名、网络设置、语言、文件系统格式等,以及其他服务启动。所有的操作都会通过 init 的默认配置文件 /etc/inittab(部分操作系统不使用该文件,如 ubuntu) 来规划。并且 /etc/inittab (部分操作系统将各项配置分开) 可以设置 run level(执行级别)。
部分操作系统(centos7/ubuntu)将 init 换为 systemd ,其功能大致一样,但是做了许多优化和修改。
执行级别0:系统停机状态,系统默认执行级别不能设为0,否则不能正常启动
执行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
执行级别2:多用户状态(没有NFS服务)
执行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式,一般 vps 及云服务器都运行在这个级别
执行级别4:系统未使用,保留
执行级别5:X11控制台,登陆后进入图形GUI模式,一般桌面版系统都运行在这个级别
执行级别6:系统正常关闭并重启,默认执行级别不能设为6,否则不能正常启动
run level是什么?就是通过设置 run level 来规定系统使用不同的服务启动。比如设置 run level 为3,系统将会启动命令行模式。runlevel
命令可以查看当前的运行级别。init
命令可以切换当前系统的模式,比如 init 0
就会关机,init 6
会重启。修改配置文件 /etc/inittab 可以设置默认执行级别,下次启动后直接以某种执行级别启动,但是切记不能设置0和6。
init进程处理系统初始化
此时,操作系统中只有 init 进程,其 pid 为1,后续所有进程都是通过 init 启动,所以所有进程都是init的子进程。init 会先设置系统的基础环境,主要利用 /etc/rc.d/rc.sysinit 这个脚本来进行系统初始化的各项操作。比如设置时间,磁盘,文件系统,字体等等
启动系统服务(/etc/rc.d/rc)
系统初始化之后,整个操作系统核心功能已经正常了,但是为了用户正常使用,还要启动一些服务,这时候就要根据执行级别来执行对应的脚本来开启服务器。
一般在 /etc/rc.d 目录下面会有各个级别的配置,而 /etc/rc*.d/ 下面就是脚本的映射
用户自定义开机启动程序(/etc/rc.d/rc.local)
启动完各项服务之后,意味着整个系统的功能都可以正常使用了,用户如果有其他操作想完成的话,就可以创建脚本,或者编写命令,放在 /etc/rc.d/rc.local 中执行,这样开机启动之后就会执行这个脚本或命令。为什么不是直接放在启动级别中目录下,然后修改启动脚本呢?第一是因为服务没启动完之前,某些功能或命令是无法使用的。第二是麻烦。当然如果用户自己编写的程序想以系统服务模式启动,也可以放到里面。
加载终端机或桌面环境
启动各项服务之后就会加载终端或界面等待用户登录,也就是出现登录界面/登录提示。
图示
整个过程整理后,如下图所示
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。