linuxefi启动原理,Linux(RHEL6)启动过程详解

阅读: 评论:0

linuxefi启动原理,Linux(RHEL6)启动过程详解
Linux(RHEL6)启动过程详解
Linux(红帽RHEL6)启动过程详解:
RHEL的⼀个重要和强⼤的⽅⾯是它是开源的,并且系统的启动过程是⽤户可配置的。⽤户可以⾃由的配置启动过程的许多⽅⾯,包括可以指定启动时运⾏的程序。同样的,系统关机时所要终⽌的进程也是可以进⾏组织和配置的,即使这个过程的⾃定义很少被需要。
理解系统的启动和关机过程是如何实现的不仅可以允许⾃定义,⽽且也可以更容易的处理与系统的启动或者关机相关的故障。
1.启动过程
以下是启动过程的⼏个基本阶段:
① 系统加载并允许boot loader。此过程的细节取决于系统的架构。例如:
石墨冷铁●基于BIOS的x86系统这第⼀个运⾏boot loader的阶段是先从主硬盘的MBR开始的,然后再额外加载⼀个boot loader即GRUB。
●基于UEFI的x86系统要挂载⼀个包含GRUB boot loader的EFI系统分区。EFI的启动管理器以⼀个EFI应⽤程序的形式来加载并运⾏GRUB 引导程序。
●对于Power Systems服务器来说,需要挂载⼀个包含Yaboot boot loader的PPC PReP分区。并由系统管理服务(SMS)启动管理器来加载并运⾏yaboot 引导程序。
野葛根提取物
●对于IBM System z(IBM⼤型机)来说,它会从⼀个DASD或者FCP-connected设备上运⾏z/IPL boot loader。
② boot loader 将内核加载到内存中,然后,依此加载任何必需的模块并以只读的⽅式将挂载根分区。
③ 内核将启动过程的控制权转交给/sbin/init程序。
④ /sbin/init程序加载所有的服务和⽤户空间⼯具,并挂载在/etc/fstab中列出的所有分区。
⑤ 出现登录界⾯,⽤户登录新启动的系统。
2. 启动过程的细节
启动过程的最初阶段根据硬件平台的不同会出现差异。然⽽,⼀旦内核被boot loader发现并加载,那么之后的启动过程在所有的架构平台上都是相同的。以下内容主要是以x86架构平台来讲述。
㈠ 固件接⼝
①基于BIOS的x86系统
BIOS是⼀个不仅控制着启动过程的第⼀步,⽽且也是为外围设备提供了最底层接⼝的固件接⼝。在装有BIOS的x86系统设备上,BIOS程序被写⼊只读并可永久存储的存储器中(即ROM),并⼀直保持可⽤。当系统启动的时候,处理器(即cpu)从内存的最后(即最⾼)地址段读取BIOS程序并运⾏它。
⼀旦BIOS程序被加载,BIOS就会检验系统,查并检测外围设备,然后再定位⼀个可以有效启动系统的设备。通常,它会先检查光驱或者是USB设备是否可以引导,如果检查失败,然后再检测系统硬盘。在⼤多数情况下,可启动驱动器的查顺序是由在BIOS中的相关设定来控制的。在IDE设备中,它会查看主IDE总线上的主IDE设备是否可以启动系统。在SATA设备中,它会查看哪个SATA设备上设置了启动标记。然后,BIOS将相应启动设备上第⼀扇区中保存的程序(称作MBR,即主引导记录)加载到内存。MBR仅有512字节的⼤⼩,其中包含启动机器的机器代码指令,被称为boot loader,同时也包含了分区表。⼀旦BIOS将boot loader到并加载到内存中,那么BIOS就会把启动过程的控制权转交给它。
第⼀阶段的boot loader是⼀⼩段在MBR上的⼆进制机器代码。它的唯⼀作⽤是定位第⼆阶段的boot loader(GRUB),并将它(GRUB)的第⼀部分加载到内存中。
(注释:当机器⼀加电BIOS程序就会被加载到主存中⼀个被称为Shadow RAM的内存保留区当中,因为Shadow RAM中的地址是ROM BIOS地址空间的映射,两者的地址空间完全相同,所以CPU直接对Shadow RAM进⾏访问即可,⽽且速度⽐直接访问ROM要快的多。)
② 基于UEFI的x86系统
UEFI(即,Unified Extensible Firmware Interface,通⽤固件接⼝)像BIOS⼀样,它是被设计⽤来控制启动过程(通过启动服务来提供)并提供⼀个系统固件和操作系统之间的接⼝(通过runtime服务来提供)。和BIOS不⼀样的是它有⾃⼰的体系架构,不依赖与CPU,它有⾃⼰的设备驱动。UEFI可以挂载分区并读取某些⽂件系统。
当⼀个装有UEFI的x86计算机启动的时候,UEFI将会查⼀个使⽤GUID(全局唯⼀标识符)标明的系统存储分区,并把这个分区标记为
ESP(即,EFI System Partition)。这个分区包含被编译为EFI架构的应⽤程序,这些应⽤程序包含系统的bootloader和实⽤软件。UEFI系统包含⼀个EFI启动管理器,这个管理器可以从⼀个默认的配置中
来启动系统,或者提⽰⽤户选择⼀个系统来启动。当⼀个系统被选择时,不管是⼿动的还是被动的,UEFI都会将对应的bootloader读⼊内存并将启动过程的控制权转交给bootloader。
㈡ 引导加载程序——The Boot Loader
① x86系统架构的引导加载程序GRUB
系统加载GRUB到内存中,GRUB是如何被加载如内存中的:⼀是在装有BIOS的机器中由第⼀阶段的bootloader直接引导⾄GRUB;或者是在装有UEFI的机器中直接从EFI系统分区读取。手指灯
在启动的时候GRUB bootloader可以读取ext2,ext3,ext4⽂件系统的分区,并加载其配置⽂件——/boot/f(对于基于BIOS的)或者/boot/efi/EFI/f(对于UEFI的)。
方艺蒙
(注:在RHEL6中,GRUB bootloader ⽀持ext2,ext3,ext4⽂件系统。它不⽀持其他的像VFAT,Btrfs或者XFS,也不⽀持LVM,也就是说包含/boot⽬录的分区的⽂件系统必须是ext2,ext3,ext4⽂件系统,其他的是不可以的。)
⼀旦第⼆阶段的bootloader进⼊内存后,它就会在屏幕上以图形化的⽅式显⽰需要不同的操作系统,或者内核,来让⽤户选择要启动的系统或内核(注:当更新内核的时候,bootloader的配置⽂件会被⾃动的更新)。
⼀旦第⼆阶段的bootloader确定要启动哪个内核。它就会在/boot⽬录⾥查对应的内核⼆进制⽂件。内核⼆进制⽂件的命名格式
是:/boot/vmlinuz-。其中只要和/boot/f中,指定的⼀样即可。
然后,bootloader在将initramfs镜像放⼊内存中。 initramfs是被内核所使⽤的,⽤来加载启动系统所必需的驱动和模块。这个镜像⽂件对于存有SCSI或者使⽤ext3,ext4⽂件系统的计算机⾮常的重要。
⼀旦内核和initramfs镜像被加载到内存,bootloader就会将启动过程的控制权转交给内核。随后,内核在再把启动过程的控制权转交给init 命令。
② 关于其他系统架构的引导加载程序
除了被⽤于查和加载内核的引导程序不⼀样外,其他的启动过程完全⼀样。
㈢ 内核
当内核加载后,它会⽴即初始化并配置计算机的内存,配置各种依附于系统的硬件,包括CPU,I/O⼦系统和存储设备等。然后查initramfs镜像⽂件并加载其进⼊内存,然后将其直接解压到/sysroot/,并加载所有必需的驱动。接下来,它会初始化和⽂件系统相关的设备,例如LVM和软RAID。再然后,
内核创建⼀个根设备,并以只读的⽅式挂载。到此,内核已经基本完成所有的⼯作,并可以进⾏运作。但是,因为此时还不允许⽤户进⾏输⼊操作,所以还不能进⾏其他跟多的操作。所以,为了设置⽤户环境,内核开始执⾏/sbin/init程序。
㈣ /sbin/init 程序
/sbin/init程序完成余下的启动过程并配置⽤户环境。
当init命令启动的时候,它会成为所有⾃动启动的进程的⽗进程。⾸先,它运⾏/etc/rc.d/rc.sysinit脚本,此脚本的作⽤是:设置环境变量,启动swap,检查⽂件系统,执⾏所有系统初始化所必须的其他步骤。例如,⼤多数系统要使⽤的时钟,rc.sysinit也会读
取/etc/sysconfig/clock配置⽂件来初始化硬件的时钟。再如,如果有⽐较特殊的串⼝进程需要初始化,那么,rc.sysinit也会执
⾏/etc/rc.serial⽂件等。
然后,init命令会处理/etc/event.d⽬录下的作业,此⽬录是⽤来描述系统是如何对每个Sysv init的运⾏级别进⾏设置的。Runlevel是⼀种被在/etc/rc.d/rc.d/⽬录中列出的各种服务所定义的状态或者模式,其中表⽰运⾏的级别。紧接着,init命令设置源函数库
——/etc/rc.d/init.d/functions,此⽂件是⽤来配置如何启动,停⽌程,并确定程序PID的。
init程序通过在/etc/inittab中指定的运⾏级别,对应的的rc⽬录,然后启动对应的⽬录下的所有后台进程。例如,如果/etc/inittab中的运⾏级别是5,那么init程序就会到/etc/rc.d/rc5.d⽬录,然后根据/etc/rc.d/rc5.d⽬录的列表来决定要启动或停⽌哪些进程。其
实,/etc/rc.d/rc5.d⽬录下并不存在启动或停⽌服务的真实脚本,在/etc/rc.d/rc5.d⽬录下的所有⽂件只是/etc/rc.d/init.d⽬录下对应⽂件的符号链接罢了。其中,每个符号链接⽂件都是以‘K’或‘S’ 开头的。以'K'开头的链接⽂件是在对应运⾏级别上不启动的。⽽
以‘S’开头的链接⽂件是在对应运⾏级别上要启动的。
init命令⾸先是通过发送/etc/rc.d/init.d/ stop 命令来停⽌所有对应运⾏级别的⽬录中以‘K’开头的所有符号链接⽂件,其中, 是指要需要停⽌的服务或进程。然后,再通过发送/etc/rc.d/init.d/ start 来启动对应运⾏级别的⽬录中所有以‘S'开头的符号链接⽂件。
每个符号链接⽂件的启动顺序是根据’K'或‘S’后⾯的数字来决定的。数字越低,启动的越早。如果数字相同,那么就按照数字后⾯字母的顺序来依次启动。我们可以通过修改数字的⼤⼩来决定服务或进程启动的先后顺序。
注:init程序最后要执⾏的⽂件之⼀是/etc/rc.d/rc.local⽂件。这个⽂件主要⽤来给⽤户⾃定义使⽤的。
透镜设计在init命令处理完对应运⾏级别的rc⽬录中所有服务后,init就会⽴即为每⼀个虚拟控制台调⽤⼀个/sbin/mingetty程序,并分配给
在/etc/event.d⽬录下所定义的对应运⾏级别。运⾏级别2-5有六个虚拟控制台。运⾏级别1有⼀个,运⾏级别0和6没有。/sbin/mingetty 进程是开启了同tty设备进⾏通信的路径,通过此进程就可以设置tty设备的模式,打印登陆提⽰符,接收⽤户的⽤户名和密码,并初始化登陆过程。⽽在运⾏级别5上,init会运⾏⼀个叫做/etc/X11/prefdm的脚本,然后此脚本就会根据⽂件/etc/sysconfig/desktop中所配置的内容来启动X显⽰管理器(gdm,kdm,xdm)。
㈤ Job 定义
在以前,sysvinit包会为init守护进程提供默认的配置。当系统启动的时候,init守护进程就会运⾏/etc/inittab脚本,并运⾏对应运⾏级别上的服务进程。⽽现在的init守护进程的默认配置使⽤的是事件驱动的形式,由upstart包提供。⽆论什么时候发⽣了特殊事件,init守护进程都会对存储在/etc/event.d⽬录下的作业进⾏处理。init守护进程会把系统的启动作为⼀个事件来识别。
通常每个作业指定⼀个程序,并且以触发init的事件的形式来运⾏或停⽌此程序。有些作业像是批处理
放线菌培养基任务,执⾏动作并直到再发⽣另⼀个触发事件触发此作业的时候在终⽌。有些作业像是服务,⼀直处于运⾏状态,直到另⼀个事件或⽤户停⽌它。

本文发布于:2023-05-18 14:58:11,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/4/104555.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:启动   系统   加载   过程
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图