1、加电自检(power on system test POST)
加电,就是按下电源键使电脑主机通电,在诸多硬件设备中有一个被称为CMOS设备在计算机启动的过程中起到了至关重要的作用,CMOS在加电之后会启动保存在它上面的BIOS程序,即基本输入输出系统(Basic Input Output System)。自检,主要是检测各个硬件设备是否能够正常运行,如CPU,硬盘,内存等等。自检功能的实现是由BIOS控制的,BIOS程序会根据CMOS上面记录的配置信息去读取其他硬件设备信息并检测其是否存在并能正常运行,之后进行硬件设备的初始化。 在开机时按ESC键或DEL键可以进入BIOS程序的设置页面,在此页面可以设置CMOS的相关参数。
2、引导加载程序(Boot Loader)的功能
引导加载程序(Boot Loader)是一个统称,它的主要功能就是去识别、加载操作系统中的核心文件并提交到内存中运行。由于不同的操作系统的文件格式不一样,因此每种操作系统都有自己引导加载程序。既然 boot loader 是一个程序那么它必须要保存在硬件设备中,此设备一般为硬盘的第一个扇区,也就是我们常说的主引导扇区MBR(Master Boot Record)。
Windows系统的引导加载程序是 ntloader,它只能启动Windows系统 。 Linux系统的引导加载程序,早期PC机用的的是 LILO(LInux LOader) ,现在 LILO 主要用于安卓系统的启动引导;现在PC机中一般使用的是 GRUB2。
引导加载程序的主要功能:
a、提供菜单:用户可以选择不同的启动项 b、加载内核文件:直接指向可启动的程序区段来开启操作系统 c、转交其他bootloader:将引导装载功能转交个其他loader负责
在学习磁盘管理的时候,我们知道每个磁盘分区都会有一个启动扇区,操作系统默认会在这个扇区中安装bootloader程序。Windows系统默认是同时在MBR和每个磁盘分区中安装 boot loader 的,而Linux系统在安装时会询问我们是否将 bootloader 程序安装到MBR上。因此我们安装双系统时要先安装Windows在安装Linux。
3、加载系统内核(Kernel)和 ramdisk的功能
我们知道通过bootloader的管理而开始读取内核文件后,接下来,Linux会将内核解压缩到内存中,并利用内核的功能开始检查各个硬件设备,也就是说内核会自己再检测一次硬件,而不会使用BIOS检测到硬件信息,此时内核就开始接管BIOS后的工作了。
那么Linux内核文件存放在哪里呢?答案是/boot目录中,并且以 vmlinuz-VERSION 命名,但是boot目录是挂载在根(/)目录下的而此时系统还没有启动,根目录是不存在的,也就是说没有办法直接将/boot目录的内核文件加载到内存中。怎么办?
此时就要借用虚拟文件系统(InitialRAM DISK)了,简写为ramdisk,此文件系统也同样存放在/boot目录中,它作用在于启动正在的根目录。ramdisk在系统安装时会根据用户主机的硬件设备自动生成。ramdisk在不同系统的称呼不同,centos 5 中 /boot/initrd-VERSION-release.img,centos 6,7 中 /boot/initramfs-VERSION-release.img。
CentOS 5
CentOS 6
bootloader可以加载kernel和ramdisk至内存中,然后让ramdisk加压缩为根目录,kernel就能够借此加载适当的驱动程序,最终释放虚拟文件系统,并挂载实际的根目录文件系统(只读挂载),然后开始后续的正常启动流程。
其实,虚拟文件系统是用在当系统启动时无法挂载根目录的情况下的,比如你的根目录在特殊的磁盘接口(USB STAT SCSI)中,或者你的文件系统较为特殊(LVM RAID)。如果你的Linux系统安装在IDE接口的磁盘上,并且使用 ext2或ext3 文件系统,那么即使没有ramdisk也可以正常启动Linux,但是IDE接口的磁盘已经很少使用了。
补充:kernel初始化的功能
探测可识别到的所有硬件设备 加载硬件驱动程序(可能借助于ramdisk 加载驱动) 以只读方式挂载根文件系统 运行用户空间的第一个应用程序:/sbin/init
以上是内核空间中的启动流程。
4、启动用户空间的第一个进程/sbin/init
注意:至此以后的内容都是用户空间内的操作,并且以CentOS 5为例,其实CentOS 6的用户空间的启动流程根5的是类似的,只不过它将配置文件分成多个/etc/init/*.conf,/etc/inittab(此文件仅用于定义默认运行级别)。
在内核加载完毕并进行完硬件检测与驱动程序加载后,此时内核会主动调用第一个进程/sbin/init。init程序的主要功能是:准备程序的运行环境,包括系统的主机名、网络配置、文件系统格式及其他服务的启动管理,而这些操作都是通过/etc/inittab文件来规划的,在此文件中设置了默认的启动执行等级(runlevel)。先来查看一下/etc/inittab文件的内容(以centos 5 为例)
[root@station1 boot]# cat /etc/inittab # # inittab This file describes how the INIT process should set up # the system in a certain run-level. # # Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org> # Modified for RHS Linux by Marc Ewing and Donnie Barnes # # Default runlevel. The runlevels used by RHS are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:5:initdefault: # System initialization. si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 # Trap CTRL-ALT-DELETE (工作中此项操作需要小心,可以用#号注释掉) ca::ctrlaltdel:/sbin/shutdown -t3 -r now # When our UPS tells us power has failed, assume we have a few minutes # of power left. Schedule a shutdown for 2 minutes from now. # This does, of course, assume you have powerd installed and your # UPS connected and working correctly. pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down" # If power was restored before the shutdown kicked in, cancel it. pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled" # Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 # Run xdm in runlevel 5 x:5:respawn:/etc/X11/prefdm -nodaemon
从上面可以看到系统有0-6共7个运行级别(本机的默认级别为5),分别如下: 0 :关机 1 :单用户模式(root 自动登录), single, 维护模式 2 :多用户模式,启动网络功能,但不会启动NFS ;维护模式 3 :多用户模式,正常模式;文本界面 4 :预留级别;可同3 级别 5 :多用户模式,正常模式;图形界面 6 :重启
此文件每一行定义一种 action 以及与之对应的process命令。格式为 id:runlevel:action:process ,其中action的常用值有:
wait: 切换至此级别运行一次process respawn :此process 终止,就重新启动之 ctrlalttab:代表按下Ctrl+Alt+Del三个组合键是否可以重启系统 initdefault :设定默认运行级别;process 省略 sysinit :设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit
常用的级别为3、5,1模式多用来系统维护,相当于Windows的安全模式。可以使用 runlevel 命令和 who -r 命令查看当期系统的级别。级别切换可以使用init #(#:0-6)命令
5、初始化脚本(/etc/rc.d/rc.sysinit)
/etc/rc.d/rc.sysinit文件是Linux系统运行的第一个脚本,主要是用来设置系统环境的。此脚本所做的事情主要有以下几点:
(1) 设置主机名 (2) 设置欢迎信息 (3) 激活udev(Linux kernel 2.6系列的设备管理器)和 selinux (4) 挂载/etc/fstab 文件中定义的文件系统 (5) 检测根文件系统,并以读写方式重新挂载根文件系统 (6) 设置系统时钟 (7) 激活swap 设备 (8) 根据/etc/sysctl.conf 文件设置内核参数 (9) 激活lvm 及software raid 设备 (10) 加载额外设备的驱动程序 (11) 清理操作
6、关闭或启动对应级别下的服务
在/etc/rc.d/rc.sysinit初始化系统环境后,系统将会关闭或启动对应级别下的服务,此处以/etc/inittab中默认的5级别为例。先看一下/etc/rc.d目录的内容(下图)。
可以看到每个级别都有与之对应的目录,而每个目录里面就记录的就是该级别要启动或关闭的服务(下图,级别5)。
以大写“K”开头的是要关闭的服务,大写“S”开头的是要启动的服务,后面接的数字为此服务关闭或开启的优先级。这些服务的文件都是链接到/etc/rc.d/init.d目录下对应的文件的。
7、启动终端
在完成了前面的所有操作之后,系统会调用/sbin/mingtty命令启动终端,用户输入了账号密码即可登录系统。至此Linux的整个启动流程结束。
原创文章,作者:pao,如若转载,请注明出处:http://www.178linux.com/45329