一直以来对于电脑的开机过程概念还停留在按下开机键,然后等待自动开启。但是对于开启的这一过程几乎一无所知,包括它如何能够通电后自己启动包括内部的一系列的过程。
目前也只是对Linux系统的启动流程有了一个浅显的认识,但它启动的过程也想以自己的理解来分享一下。
一般Linux系统的开机过程有这么几个步骤:
按下电源键 BIOS自检 系统引导 Linux内核启动 初始化系统 登录系统
其中每个过程中又可细分为很多的子过程。按下电源键这一步自不必多说,我们从BIOS自检说起。
BIOS自检
BIOS自检的可分为两个阶段
第一阶段:POST(Power-on-self test),主要检测主机硬件设备如:CPU、内存、硬盘、显卡等是否正常;
第二阶段:在第一阶段完成后会按BIOS中设置的系统启动顺序来搜索可启动的磁盘设备。如:光盘、硬盘、U盘等;搜到第一个可启动的设备后就读取该设备的第一个扇区的内容并执行。到此为止BIOS的任务就完成了。
系统引导:
要了解系统引导首先我们得了解什么是MBR(Master Boot Record)。硬盘的0柱面、0磁头、1扇区称为主引导扇区。它由三个部分组成,主引导程序(Bootloader)、硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA)其结构如下图:
其中Bootloader为引导加载程序,它的主要功能为:
1、 提供菜单,允许用户选择要启动的系统或不同的内核版本;
2、 加载选定的内核到内存中,解压、展开,而后把系统的控制权交给内核;
目前Linux中最常用的Bootloader 为GRUB;
GRUB引导主要有三个阶段:
stage1:作用很简单就是把第一个扇区读取到内存中,但注意stage1是没有识别文件系统的能力的。
stage1.5:作为stage1和stage2的中间桥梁,stage1.5是有识别文件系统的能力的,此后grub才能去访问/boot/grub目录下的stage2文件,并将stage2载入内存中执行。
stage2:被载入内存执行时,它首先会去解析grub的配置文件/boot/grub/grub.conf,然后加载内核镜像到内存中,并将控制权转交给内核。而内核会立即初始化系统中各设备并做相关的配置工作,其中包括CPU、I/O、存储设备等。
Linux内核启动:
上一步中内核被加载到内存中并且取得了系统的控制权,在取得控制权后内核会立即初始化系统中的设备,包括CPU、I/O、存储等;
关于Linux的设备驱动程序的加载,可能会需要initrd(ramdisk)。因为有一步分驱动程序会被直接编译进内核文件中,另一部分会被以模块的形式放在initrd中;
在初始化硬件及加载各硬件驱动程序后,内核会以只读的方式挂载根文件系统,并且运行第一个程序/sbin/init。此后系统的控制权就交给了/sbin/init进程了。
系统初始化
/sbin/init进程是系统第一个启动的程序,它是其他所有进程的父进程。当它接管了系统的控制权先之后,它首先会去读取/etc/inittab文件来执行相应的脚本进行系统初始化,如设置键盘、字体,装载模块,设置网络等。
在niittab中有一个很重要的设置选项runlevel。根据runlevel的不同启动不同的服务,让Linux的使用环境不同。基本上runlevel分为0-6 ,7个等级:
0:关机,shutdown
1:单用户模式(sigle user),root用户,无须认证;维护模式;
2:多用户模式(multi user),会启动网络功能,但不会启动NFS;维护模式;
3:多用户模式(multi user),完全功能模式;文本界面;
4:预留级别:目前无特别使用目的,但习惯同3级别使用;
5:多用户模式(multi user),完全功能模式,图形界面;
6:重启模式,
系统初始化的过程主要是执行一些脚本配置文件来完成的:
1、执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统算是基本运行起来了,后面需要进行运行级别的确定及相应服务的启动。
2、执行/etc/rc.d/rc脚本。该文件定义了服务启动的顺序是先K后S,而具体的每个运行级别的服务状态是放在/etc/rc.d/rc*.d(*=0~6)目录下,所有的文件均是指向/etc/init.d下相应文件的符号链接。rc.sysinit通过分析/etc/inittab文件来确定系统的启动级别,然后才去执行/etc/rc.d/rc*.d下的文件。
3、执行用户自定义引导程序/etc/rc.d/rc.local
完成了系统所有的启动任务后,linux会启动终端或X-Window来等待用户登录。
最后一步输入用户名及密码就可以登入系统了。
以上就是Linux系统启动的过程。其中一些步骤并不是很详细,只是为了能让大家对Linux启动过程有一个初步的认识。如果想了解更详细的步骤可自行拓展。
下面是一张转载的系统引导流程图,方便大家梳理一下整个流程