阐述:
1.开机BIOS自检
2.MBR引导
3.grub引导菜单
5.启动init进程
6.读取inittab文件,执行rc.sysinit,rc等脚本
7.启动mingetty,步入系统登入界面
来个简图:
超详尽描述linux系统从开机到登录界面的启动过程
对于linux系统的初学者来说,理解并把握linux系统启动流程才能使你够深入的理解linux系统,还可以通过系统的启动过程来剖析问题解决问题。
Linux系统的启动流程
关于linux系统的启动流程可以分为以下步骤:
POST(加电自检)–>加载BIOS(BasicInput/OutpuSystem)–>确定启动设备(Bootsequence)、加载BootLoader–>加载内核(kernel)初始化initrd–>运行/sbin/init初始化系统–>复印用户登入提示符
下边让我们逐渐分析说明系统启动过程:
1、POST开机自检
linux开机加电后,系统开始开机自检,该过程主要对计算机各类硬件设备进行检查linux系统重新启动,如CPU、内存、主板、硬盘、CMOS芯片等,假若出现致命故障则停机,但是因为初始化过程还没完成,所以不会出现任何提示讯号;若果出现通常故障则会发出声音等提示讯号,等待故障消除;若未出现故障,加电自检完成。
2、开机自检完成,查找可启动设备,加载主引导目录(MBR)
开机自检完成后,CPU首先读取坐落CMOS中的BIOS程序,根据BIOS中设定的启动顺序(BootSequence)逐一查找可启动设备,找到可启动的设备后,去该设备的第一个磁道中读取MBR,这么MBR是哪些哪?它又有哪些作用哪?
MBR存在于可启动c盘的0扇区0磁道,占用512字节,它主要拿来告诉计算机从选取的可启动设备的那个分区来加载引导加载程序(Bootloader),MBR中存在如下内容:
(1)BootLoader占用446字节,储存有操作系统(OS)相关信息,如操作系统名称,操作系统内核位置等,它的主要功能是加载内核到显存中运行。
(2)PartitionTable分区表,占用64字节,每位主分区占用16字节(这就是为什么一块硬碟只能有4个主分区啦^_^)
(3)分区表有效性标记占用2字节
CPU将MBR读取至显存,运行GRUB(BootLoader常用的有GRUB和LILO两种,如今常用的是GRUB),GRUB会把内核加载到显存去执行。
由上图可以看出,内核文件存在于/boot目录下,并且在GRUB加载内核时,连/还没有被加载,它是如何在c盘上找到内核的哪?我们来查看一下GRUB的配置文件可以找到答案。
在/boot/grub/grub.conf中可以见到root(hd0,0)这一行实际上是指定了/目录的所在的位置,但这个根并不是真正的根,而是/所在的位置,可以理解成/boot是处在(hd0,0)/boot,而这儿的(hd0,0)指的是第一个c盘的第一个分区,GRUB不是通过文件系统来访问内核的,以由于此时内核还没有启动,不存在文件系统,而是直接访问第一个c盘的第一个分区(通过MBR中的分区表来辨识分区),而辨识MBR中的分区的文件系统,则是由GRUB通过加载自身携带的系统文件来实现的,这种文件在/boot/grub目录中
你们可以看见,白色标出的地方就是GRUB可以辨识的文件系统的类型了。事实上,总结一下,grub启动过程可以分为两个步骤:
第1阶段BIOS加载MBR中的GRUB(GRUB第一阶段的文件),而GRUB只有446字节,难以实现太多功能,所以借助该阶段的文件去加载1.5阶段的文件(/boot/grub/下的文件)
第1.5阶段拿来加载辨识文件系统的文件,辨识完系统后才可以找到/boot目录。
第2阶段找寻内核并加载到显存中。
右图是GRUB启动过程中所用的的文件
3、加载内核,初始化initrd
GRUB把内核加载到显存后展开并运行,此时GRUB的任务早已完成,接出来内核将会接管并完成侦测硬件–>加载驱动–>挂载根文件系统–>切换至根文件系统(rootfs)–>运行/sbin/init完成系统初始化。并且,问题来了,要访问根文件系统必需要加载根文件系统所在的设备,而这时根文件系统又没有挂载,要挂载根文件系统有须要根文件系统的驱动程序,这是一个典型的先有鸡先有蛋的问题啊!为解决这个问题linux移植,GRUB在加载内核同时,也把initrd加载到显存中并运行,这么initr又起到了哪些作用哪?
initrd展开后的文件
linux中/下的文件
我们可以看见,虽然initrd文件或许是一个虚拟的根文件系统,上面有bin、lib、lib64、sys、var、etc、sysroot、dev、proc、tmp等根目录,它的功能就是讲内核与真正的根构建联系,内核通过它加载根文件系统的驱动程序,之后以读写方法挂载根文件系统,至此,内核加载完成。
4、运行/sbin/init,进行系统初始化
内核并加载进显存运行并以读写方法挂载完根文件系统后,执行第一个用户进程init,init首先运行/etc/init/rcS.conf脚本,如右图
可以看见,init进程通过执行/etc/rc.d/rcS.conf首先调用了/etc/rc.d/rc.sysinit,对系统做初始化设置linux视频,我们来瞧瞧这个脚本都是做了些哪些哪?
事实上init执行/etc/rc.d/rc.sysinit的初始化将会做好多设置:
1、获得网路环境
2、挂载设备
3、开机启动画面Plymouth(取替了过往的RHGB)
4、判断是否启用SELinux
5、显示于开机过程中的欢迎画面
6、初始化硬件
7、用户自定义模块的加载
8、配置内核的参数
9、设置主机名
10、同步储存器
11、设备映射器及相关的初始化
12、初始化软件c盘阵列(RAID)
13、初始化LVM的文件系统功能
14、检验c盘文件系统(fsck)
15、设置c盘配额(quota)
16、重新以可读写模式挂载系统c盘
17、更新quota(非必要)
18、启动系统虚拟随机数生成器
19、配置机器(非必要)
20、清除开机过程当中的临时文件
21、创建ICE目录
22、启动交换分区(swap)
23、将开机信息写入/var/log/dmesg文件中
init执行完/etc/rc.d/rc.sysinit后,将会执行/etc/inittab来设定系统运行的默认级别:
如上图linux系统重新启动,linux中共有[0-6]七个运行级别,而我自己系统的默认运行级别是3.设定完系统默认运行级别之后,接着调用/etc/rc.d/rc脚本,这个脚本接收默认运行级别参数后,依脚本设置启用或停止/etc/rc.d/rc[0-6].d/中相应的程序,如右图,看一下我系统运行默认级别(级别)3下的内容吧
如图示,/etc/rc.d/rc[0-6].d/下的文件在系统初始化阶段,以S开头的将被启动,以K开头的将被关掉,文件名K/S前面的的数字代表优先级,数字越小优先级越高,优先执行。
最后,将执行/etc/rc.d/rc.local脚本,可以按照自己的需求将一些执行命令或则脚本讲到其中,当开机时就可以加载。
5、打印登陆提示符
系统初始化完成后,init给出用户登入提示符(login)或则图形化登入界面,用户输入用户和密码登录后,系统会为用户分配一个用户ID(uid)和组ID(gid),这两个ID是用户的身分标示,用于测量用户运行程序时的身分验证。登陆成功后,整个系统启动流程运行完毕!