LInux系统启动流程
1、背景
计算机主要由底层的硬件和附着在硬件上的操作系统组成的。硬件是计算机工作的基础,但是他本身是不能
提供任何服务的。所以,我们需要通过一种软件来操作这些硬件,以便向上提供服务。这就是操作系统。所以,
Linux系统的启动流程就是从硬件到操作系统的过程。
2、Linux启动简单图解
3、Linux系统启动过程详细解释
第一步:开机自检,加载BIOS
开启计算机,首先会加载BIOS。此步骤个主要是对硬件进行检查并获取相关的硬件信息。主要包括: CPU 的相关信息、设备
启动顺序信息、硬盘信息、内存信息、时钟信息、PnP 特性等等。获取相关信息后,计算机就知道他的硬件设备在哪了。接下来就
是读取MBR记录,将系统的控制权交给MBR。
第二步:加载MBR
MBR是Master Boot Record的简称,即主引导记录。它位于磁盘上的0柱面,0磁道的第一个扇区。大小为512byte,里面存放了
系统预启动信息,磁盘分区表信息,以及分区标志。
MBR由三个部分组成:第一部分占有446个bytes,主要是引导区,存放的是预启动指令;第二部分占64bytes,存放的是分区表
信息;第三部分占2bytes,存放的是分区的结束标志信息。
预引导区的作用之一是找到标记为活动(ACTIVE)的分区,并将活动分区的引导区读入内存。
系统找到 BIOS 所指定的硬盘的 MBR 后,就会将其复制到 0×7c00 地址所在的物理内存中。其实被复制到物理内存的内容就是
Boot Loader,而具体到 Linux 系统,那就是 grub了。
第三步:加载GRUP菜单,即Boot Loader引导加载器
Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映
射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备。通常,Boot Loader 依赖于硬件
而实现的,不同体系结构的系统存在着不同的 Boot Loader。
Boot Loader 有若干种,其中 Grub、Lilo 和 spfdisk 是常见的 Loader。
系统读取内存中的 grub 配置信息(一般为 menu.lst 或 grub.lst),并依照此配置信息来启动不同的操作系统
grup配置文件:grup菜单的详细解释请参考:
# grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/sda2 # initrd /initrd-[generic-]version.img #boot=/dev/sda default=0 -----》表示grup菜单中默认的第一个内核版本 timeout=5 -----》菜单页停留5秒 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS 6 (2.6.32-696.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=79123144-98e1-4a97-ab97-c0231b9d 1190 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_ NO_LVM rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-696.el6.x86_64.img
提示:Boot Loader在准备环境时,最主要的是确定你要安装的内核版本,内核映像文件的存在位置,以便后来加载内核时使用。
第四步:加载内核
根据grub设定的内核映像所在路径,系统读取内存映像,并进行解压缩操作。此时,屏幕一般会输出“Uncompressing Linux”
的提示。当解压缩内核完成后,屏幕输出“OK, booting the kernel”。系统将解压后的内核放置在内存之中,并调用start_kernel()函
数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立。至此,Linux内核已经建立起来了,基于Linux的程序
应该可以正常运行了。
第五步:创建init进程依据inittab文件来设定运行等级
内核被加载后,第一个运行的程序便是/sbin/init,该文件会读取/etc/inittab文件,并依据此文件来进行初始化工作。
其实/etc/inittab文件最主要的作用就是设定Linux的运行等级,其设定形式是“:id:5:initdefault:”,这就表明Linux需要运
行在等级5上。Linux的运行等级设定如下:
0:关机
1:单用户模式
2:无网络支持的多用户模式
3:有网络支持的多用户模式
4:保留,未使用
5:有网络支持有X-Window支持的多用户模式
6:重新引导系统,即重启
第六步:加载/etc/rc.d/rc.sysinit文件进行初始化
在设定了运行等级后,Linux系统执行的第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序,它做的工作非常多,包括
设定PATH、设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc等等。
第七步:加载内核模块
具体是依据/etc/modules.conf文件或/etc/modules.d目录下的文件来装载内核模块。
第八步:根据/etc/inittab确定的运行级别到/etc/rc.d/rc#.d目录下启动响应的服务
根据运行级别的不同,系统会运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。
第九步:加载/etc/rc.d/rc.local文件
rc.local 就是在一切初始化工作后,Linux 留给用户进行个性化的地方。可以把你想设置和启动的东西放到这里。
第十步:加载/etc/login程序,启动 mingetty,进入登陆界面