当前位置: 首页 > 科技观察

Linux启动过程详解:BIOS--MBR--GRUB--Kernel

时间:2023-03-11 22:47:59 科技观察

概述Linux是一个自由开源的类UNIX操作系统。该操作系统的内核于1991年10月5日由LinusTorvalds首次发布。添加用户空间应用后,就变成了Linux操作系统。Linux是自由软件和开源软件发展的最著名例子。下面简单记录一下linux系统从开机到使用的全过程,以备不时之需!LINUX启动过程首先用一张图来简单了解一下整个系统的启动过程。整个过程基本上可以分为POST-->BIOS-->MBR(GRUB)-->Kernel-->Init-->Runlevel。下面详细解释每个过程的作用。BIOSBIOS(BasicInput/OutputSystem),基本输入输出系统,系统存储在主板的ROM芯片上,电脑开机时会先读取系统,然后会有一个通电关于自检过程,这个过程其实就是检查CPU和内存这些电脑最基本的部件(控制器、运算器和内存),同时还要检查其他硬件。如果没有异常,开始加载BIOS程序到内存中。详细的BIOS功能这里就不说了。BIOS的主要功能是存储磁盘的启动顺序。BIOS会根据启动顺序查找第一个磁头的MBR信息,加载并执行MBR中的Bootloader程序,如果第一个磁盘没有MBR,它会继续搜索第二个磁盘(PS:启动顺序可以在BIOS界面设置),一旦检测到BootLoader程序并加载到内存中,BIOS就会将控制权交给BootLoader程序。MBRMBR(MasterBootRecord),主引导记录,MBR存放在磁盘的头部,大小为512bytes,其中446bytes用于存放BootLoader程序,64bytes用于存放分区表信息,最后2bytes用于MBR有效性检查。GRUBGRUB(GrandUnifiedBootloader),多系统启动程序,它的执行过程可以分为三个步骤:not启动时,MBR根本找不到文件系统,也找不到stage2存放的位置。于是就有了stage1_5Stage1_5:这一步是识别文件系统Stage2:GRUB程序会根据/boot/grub/grub.conf文件搜索Kernel信息,然后开始加载Kernel程序。当检测到内核程序并将其加载到内存中时,GRUB将控制权交给内核程序。PS:其实这一步还没有挂载/boot。GRUB直接识别grub所在磁盘的文件系统,所以实际上应该是/grub/grub.conf文件。配置文件的信息如下:grub.conf:#boot=/dev/sdadefault=0#设置title默认启动的编号,从0开始timeout=5#等待选择的超时时间usersplashimage=(hd0,0)/boot/grub/splash.xpm.gz#GRUB的背景图片hiddenmenu#隐藏菜单标题CentOS(2.6.18-194.el5PAE)#内核标题root(hd0,0)#设备所在内核文件位于kernel/vmlinuz-2.6.18-194.el5PAEroroot=LABEL=/#内核文件路径和传递给内核的参数initrd/initrd-2.6.18-194.el5PAE.img#ramdisk文件路径KernelKernel一、内核,Kernel是Linux系统的主要程序,其实内核文件很小,只有最基本的模块,以压缩文件的形式存放在硬盘中。当GRUB将内核读入内存后,内存开始解压内核文件。说到内核启动,首先要说的是initrd文件,initrd(InitialRAMDisk),在stage2复制到内存中。该文件是系统安装时生成的,是一个临时的根文件系统(rootfs)。因为Kernel为了精简只保留了最基本的模块,Kernel上没有各种硬件驱动,无法识别rootfs所在设备,所以生成initrd文件,加载必要的驱动模块,当Kernel启动时,可以从initrd文件中加载驱动模块,直到挂载真正的rootfs,然后将initrd从内存中移除。内核将以只读模式挂载根文件系统。根文件系统挂载后,会开始加载第一个进程(用户空间进程),执行/sbin/init,然后将控制权交给init程序。initinit,初始化,顾名思义,这个程序就是执行OS的初始化操作。实际上,它是根据/etc/inittab(定义了系统的默认运行级别)设置的动作来执行脚本的。最先执行的脚本是/etc/rc.d/rc.sysinit,这是真正的OS初始化脚本,简单说一下这个脚本的任务(大家可以去实际的脚本看看是干什么的):1.激活udev和selinux;2.根据/etc/sysctl.conf文件设置内核参数;3.设置系统时钟;4.加载硬盘映射;5.启用交换分区;6.设置主机名;7、根文件系统检测、读写重新挂载根文件系统;8.激活RAID和LVM设备;9.启用磁盘配额;10、根据/etc/fstab查看并挂载其他文件系统;11、清理过期锁和PID文件后,根据配置的启动级别,执行相应目录下的脚本,最后执行脚本/etc/rc.d/rc.local,至此系统启动完成.Runlevelrunlevel,运行级别,不同的级别会启动不同的服务,init会根据定义的级别执行相应目录下的脚本,Linux启动级别分为以下几种0:关机模式1:单用户模式(直接以管理员身份回车)2:多用户模式(无网络)3:多用户模式(命令行)4:保留5:多用户模式(图形界面)6:重启不同运行级别下,/etc/rc.d/rc脚本会分别执行不同目录下的脚本。运行级别0–/etc/rc.d/rc0.d/运行级别1–/etc/rc.d/rc1.d/运行级别2–/etc/rc.d/rc2.d/运行级别3–/etc/rc.d/rc3.d/运行级别4–/etc/rc.d/rc4.d/运行级别5–/etc/rc.d/rc5.d/运行级别6–/etc/rc.d/rc6.d/这些目录下的脚本只有K*和S*开头的文件。K开头的文件是启动时需要关闭的服务。以S开头的文件是Booting需要执行已启用的服务。