计算机构造-运行原理
一、linux系统的启动流程
关于linux系统的启动流程我们可以按步进行划分为如下:
POST加电自检 -->BIOS(Boot Sequence)-->加载对应引导上的MBR(bootloader)-->主引导设置加载其 BootLoader-->Kernel初始化-->initrd—>/etc/init进程加载/etc/inittab,其进程流 程图如下:
二、剖析详细启动过程
⑴、
POST开机自检:电脑主机打开电源的时候,随后会听到滴的一声,系统启动开始了开机自检(POST-power on selftest)自检开始),这个过程中主要是检测计算机硬件设备比如:CPU,内存,主板,显卡,CMOS等设备是否有故障存在,如果有硬件故障的话将按两种情况理:对于严重故障(致命性故障)则停机,此时由于各种初始化操作还没完成,不能给出任何提示或信号;对于非严重故障则给出提示或声音报警信号,等待用户处理),如果没有故障,POST完整自己的接力任务,将尾部工作交接给BIOS处理。
⑵、
BIOS:计算机加电自检完成后第一个读取的地方就是就是BIOS(Basic Input Output System,基础输入输出系统),BIOS里面记录了主机板的芯片集与相关设置,如CPU与接口设备的通信频率、启动设备的搜索顺序、硬盘的大小与类型、系统时间、外部总线、各种接口设备的I/O地址、已经与CPU通信的IRQ中断信息,所以,启动如果要顺利启动,首先要读取BIOS设置。
⑶、
按照BIOS所设定的系统启动流程,如果检测通过,则根据引导次序(Boot Sequence)开始在第一台设备上支持启动程序,我们的启动设备主要包括硬盘、USB、SD等,我们一般用的是硬盘,然后进行读取第一个设备就是硬盘,第一个要读去的就是该硬盘的主引导记录MBR(Master Boot Record),然后系统可以根据启动区安装的引导加载程序(Boot Loader)开始执行核心识别的工作。【在此插一句:MBR程序只是找到只是硬盘分区内最前面的446个字节的Boot Loader】然后查找相关配置和定义。
⑷、
Boot Loader 加载Grub程序 在这个过程中主要靠Grub的引导开始的,Grub分为连个阶段: stage1:主要是Boot loader stage 1.5:过渡 stage2:主要是/boot/grub
通过上面我们可以发现linux的内核VMLnuz,grub、initrd都在/boot目录下
在/boot/grub/下面我们看到了熟悉的stage1,stage2及grub工具的配置文件 grub.conf,那么grub.conf内都定义了什么呐??
⑸、Kernel
根据Grub内的定义,grub读取完毕后就把下面的工作交个内核了。kernel主要是完成系统硬件探测及硬件驱动的初始化,并且以读写的方式挂载根文件系统(根切换),那么这里就出现了一个“先有鸡还是先有蛋的文件了”,具体是什么那? 要想访问真正的根文件系统(rootfs)的话,就必须加载根文件系统中的设备,这时根文件系统又没有挂载,要挂载根文件系统又得加载根文件系统中的驱动程序,哪怎么办呢?为了解决这个问题,这是就用到了initrd文件了。 在来说下kernel初始化所要工作的内容做下简单总结: 探测硬件->加载驱动(initrd)->挂载根文件系统->rootfs(/sbin/init)
⑹、
到此止内核空间的相关工作已经完成,内核空间的任务开始向用户空间转移,内核空间通过一个间接的initrd(微型linux)向用户空间的/sbin/init过度,所以gurb开始引导内核转向initrd。 initrd:一个虚拟的文件系统,里面有lib、bin、sbin、usr、proc、sys、var、dev、boot等一些目录,其实你会发现里面的目录有点像真的/对吧,所以我们称之为虚拟的根文件系统,作用就是将kernel和真的根文件系统建立关联关系,让kernel去initrd中加载根文件系统所需要的驱动程序,并以读写的方式挂载根文件系统,并让执行用户当中第一个进程init。
下面我们看下init脚本内的内容:
从上面的脚本内容我们可以看到init进程的主要工作:
挂载 :将initrd中的/proc, /sys /dev 挂载到当前的主分区中的相应目录 创建目录:/dev/mapper 通过mknod完成block or character special files的创建 相关模块的挂载 创建root设备 挂载 /sysroot 最后完成根切换
⑺、init执行完毕以后会启动系统内的/etc/inittab文件,来完成系统系统的初始化工作。下面我们来介绍一下inittab这个配置文件内的详细内容
各个级别的定义:
默认运行级别
0:halt //关机 1: single user mode //单用户维护模式) 2:multi user mode, without NFS //不支持NFS功能 3: multi user mode, text mode //字符界面 4:reserved //系统保留 5: multi user mode, graphic mode //图形化界面 6: reboot //重启
/etc/inittab格式及语法(:)
[选项]:[runlevel]:[行为]:[命令]行为: initdefault:代表默认运行级别 sysinit:代表系统初始化操作选项 ctrlaltdel:代表重启的相关设置 wait:代表上一个命令执行结束后方可执行下面的操作 respawn:代表后面字段可以无限制再生(reboot)命令选项 一些命令,不过通常都是脚本
下面说下inittab内定义的初始化脚本:rc.sysinit --/etc/rc.d/rc.sysinit
如上图所示:rc.sysinit脚本内定义了一些与系统初始化的定义设定主机名检测并挂载/etc/fstab中其他文件系统启动swap分区/etc/sysctl.conf设定内核参数装载键映射-->键盘上每个键的功能然后根据系统运行级别运行相关的服务脚本:/etc/rc.d/init.d/脚本和/etc/rc.d/rc#d
rc0-rc6目录下脚本:K* ##只要是以K开头的文件均执行stop工作 S* ##只要是以S开头的文件均执行start工作 0-99 (执行次序,数字越小越先被执行)用户自定义开机启动程序(/etc/rc.d/rc.local) 可以根据自己的需求将一些执行命令或是脚本写到/etc/rc.d/rc.local里,当开机时,就可以加载啦
三、总结
系统初始化的大致内容总结如下:
硬件的初始化,图像界面启动的初始化(如果设置了默认启动基本)
主机RAID的设置初始化,device mapper 及相关的初始化,
检测根文件系统,以只读方式挂载
激活udev和selinux
设置内核参数 /etc/sysctl.conf
设置系统时钟
启用交换分区,设置主机名
加载键盘映射
激活RAID和LVM逻辑卷
挂载额外的文件系统 /etc/fstab
最后根据mingetty程序调用login让用户登录->用户登录(完成系统启动)
在系统启动过程中主要的脚本和目录有:
boot
/grub
/boot/grub/grub.conf
/boot/initrd+内核版本
/initrd文件中的/proc/ /sys/ /dev/ 目录的挂载 及根的切换
/etc/inittab 脚本
/etc/rc.d/rc.sysinit 脚本 等
这些重要的脚本和目录,还有其他重要的目录和文件,脚本等。由此篇我们可以详细了解linux系统的启动和初始化过程,然后我们可以根据linux系统启动的过程和所用到的命令自己动手DIY一个微型linux系统,关于“DIY微型linux系统”会再后两至三天内发表博文,到时候我们在一起探讨探讨linux系统的组成部分等更详细的相关
信息!!!
grub全称在为GRand Unified Bootloader,它的核心功能是引导内核,但是如果grub出了问题,内核无法找到,那岂不是万劫不复了,下面就介绍一下常用的修复方式。如果想了解grub是什么在系统中启到什么作用,详细介绍请参阅
第一种情况:
是由于grub中的grub.conf文件损坏,开机后直接进入到了grub>命令行模式下。下面将图解此过程
这时可以使用help看一下grub可支持命令有那些,以便供修复时使用。
第二个使用的命令是find (hd0,0)/按tab如果能补全就表示系统在此分区上。
各个参数说明:
这时要注意,当 你指定内核后,但未指定内核后面的参数(ro root=(此处未指定的话))将无法正常启动,报:请给root参数,一般情况下是系统是可以自动探测到,但这个功能并不靠谱,那么只能靠备份或你的记 忆将参数补上(所以定期备份/etc/fstab、与grub.conf、是多么重要的事情,原因你懂的。)
如下图:
而这时就看到你平时的习惯了,备份相当重要
当正常登录系统后,将grub.conf文件重新写就可以了。(上图的完整路径是root=/dev/mapper/vg_www-lv_root,写全了就看不到了,所以在此特别说明)
看到title了吧
过了下面这张图就说明系统是可以正常启动了
第一种情况顺利解决!a_c
第二种情况:
grub损坏(最明显的提示为:Operating System not found)
如mbr数据损坏(注仅是bootloader损坏,分区表是好的),如果没有重新启动还可能修复,但是如果是重启后发现grub损坏,那么只能挂载光盘进入紧急救援模式。(以下将以挂载光盘说明)
dd执行之后的景象,是不是好惊悚a_c
挂载光盘进入紧急救援模式,在BIOS中将光盘设置为第一引导设备。
在菜单中选择"Rescue installed system"
之后将对:语言----》键盘设置
是否启用网络(不需要,则No,如果选择了Yes将要求选择获取IP地址的方式)
正式进入救援模式
原系统己经挂载的位置,如何切换到原系统下
开启一个shell
切换到原系统
这时可以直接输入grub命令进入grub中(这个grub是光盘中的)
直接使用 help setup会显示setup的使用方法。
设置root(root默认分区)如(hd0,0),此分区一定要root所在的系统分区,之后使用setup安装,命令是setup(hd0)(由于mbr并属于分区,所以将grub安装到hd0设备即可),如果是成功了会有succeeded提示。quit退出即可
重启系统,取出光盘,有如下信息就表示修复完成
如果grub目录都损坏,无法正常启动。则可以在此模式使用grub-install --root-directory=/ /dev/sda(设备是什么就写什么)手写配置文件grub.conf即可
总结:
以上都是在虚拟机上试验,可能与真正的生产环境遇到的情况有所不同,通过此次试验,进一步了解了bootloader的工作原理。为以后的学习打下基础。
=========================================完============================================
PS:
"你不能将这个世界让给你所鄙视的人,少年,努力吧!!!!"