想要让一台计算机工作,我们要做的第一件事就是让这台计算机开机。可能一般用户看到的只是一个简单的启动界面,进入用户界面后就可以进行相关的操作了,但是实际上在开机的时候计算机运行了很多程序,而运行的第一个程序就是Boot Loader这个开机管理程序。开机管理程序可以指定使用哪个核心文件来开机,并实际加载核心到内存当中解压缩与执行,此时核心就能够开始在内存内活动,并侦测所有硬件信息与加载适当的驱动程序来使整部主机开始运作,等到核心侦测硬件与加载驱动程序完毕后,一个最阳春的操作系统就开始在你的PC上面跑了。 往期推荐: 史上最全的Linux常用命令汇总(超全面!超详细!)收藏这一篇就够了! 史上最全的Linux常用命令汇总(超全面!超详细!)收藏这一篇就够了! 加载BIOS与自我测评 BIOS最早可追溯到1970年代的CP/M操作系统。BIOS是CP/M操作系统中只能在特定机器上运行(machine-specific)的部分,它在系统引导时直接与硬件交互。现在,BIOS的作用是初始化和测试硬件组件,以及从大容量存储设备(如硬盘)加载引导程序,并由引导程序加载操作系统;当加载操作系统后,BIOS通过系统管理模式为操作系统提供硬件抽象。 在取得CPU接口设备的沟通频率后、搜寻顺序、硬盘的大小与类型、系统时间、接口设备IO地址等信息后,BIOS还会进行开机自我测试(Power-on Self Test,POST)。然后开始执行硬件侦测初始化,并设定PnP装置,之后定义出可开机的装置顺序,那么接下来就可以进行开机装置的数据读取了。 系统软件大多数存放在硬盘中,所以BIOS会指定开机的装置让我们读取磁盘中的操作系统核心文件。由于文件格式的不相同,因此我们必须要以一个开机管理程序来处理核心文件加载(load)的问题,而这个开机程序就被称为Bootloader,这个开机管理程序安装在第一个扇区(sector)内,也就是我们一直谈到的MBR(Master Boot Record,主要启动记录区) 注意: BIOS是透过硬件的INT13中断功能来读取MBR的,也就是BIOS只要能侦测到硬盘。那么他就有办法透过INT13这条信道来读取该磁盘的第一个扇区内的MBR软件。尽管系统的每颗硬盘的最前面区块都有MBR和GPT两个分区表提供loader的区块,具体读取那个硬盘的loader的程序得看BIOS的设定。基本上系统的MBR都是第一个开机装置的MBR。 读取并执行boot loader Loader的最主要功能是要认识操作系统的文件格式并据以加载核心到主存储器中去执行。由于不同操作系统的文件格式不一致,因此每种操作系统都有自己的boot loader。当一台电脑上安装有多重操作系统时,必须使用特定的loader才能够加载出属于自己的操作系统的核心。解决系统的MBR只有一个,而要在一部主机上同时安装多个操作系统,其实每个文件系统都会保留一块启动扇区(boot sector)提供操作系统安装bootloader。而当主机安装有多个操作系统时boot sector,boot loader与MBR的相关性有点像下图: 如上图所示,每个操作系统默认是会安装一套boot loader到他的文件系统中(就是每个filesystem左下角的方框),而在Linux系统安装时,可以选择他安装到自己的文件系统中,也可以选择不安装。如果选择安装到MBR的话,那理论上你在MBR与boot sector都会保有一份boot loader程序的。至于Windows安装时,他预设会主动将MBR与Boot sector都装一份boot loader!所以安装多重操作系统时,MBR常常会被不同的操作系统的boot loader所覆盖!但是MBR也只有一个,要怎么执行boot sector里面的loader我们就得详细了解bootloader的功能了。它的主要功能如下: - 提供选单:用户可以选择不同的开机项目,这也是多重引导的重要功能!
- 载入核心文件:直接指向开机的程序区段来开始操作系统;
- 转交其他loader:将开机管理功能交给其他loader负责。
由于具有选单功能,因此我们可以选择不同的核心来开机。还具有控制权转让功能,那么我们就可以加载其他boot sector内的loader了。 如上图所示,MBR使用Linux 的grub2 这个开机管理程序,并且里面假设已经有了三个选单,第一个选单可以直接指向Linux 的核心文件并且直接加载核心来开机;第二个选单可以将开机管理程控权交给Windows来管理,此时Windows的loader 会接管开机流程,这个时候他就能够启动windows了。第三个选单则是使用Linux 在boot sector内的开机管理程序,此时就会跳出另一个grub的菜单。 - 选单一:MBR(grub2)–>kernel file–>booting
- 选单二:MBR(grub2)–>boot sector(Windows loader)–>windows kernel–>booting
- 选单三:MBR(grub2)–>boot sector(grub2)–>kernel file–>booting
而最终bootloader的功能就是加载kernel文件! 依据bootleader加载Kernel 通过boot loader的管理而开始读取核心文件后,接下来,Linux 就会将核心解压缩到主存储器当中,并且利用核心的功能,开始测试与驱动各个周边装置,包括储存装置、CPU、网络卡、声卡等等。此时Linux核心会以自己的功能重新侦测一次硬件, 而不一定会使用BIOS侦测到的硬件信息!也就是说,核心此时才开始接管BIOS 后的工作了。一般来说,核心会被放置到/boot 里面,并且取名为/boot/vmlinuz! 为了硬件开发商与其他核心功能开发者的便利,Linux的核心是可以透过动态加载核心模块(想象成驱动程序就可以),这些核心模块放置在/lib/modules/目录中。由于模块放置到磁盘根目录内,因此在开机过程中核心必须要挂载根目录,这样才能够读取核心模块提供加载驱动程序的功能。为了担心影响磁盘内的文件系统,因此开机过程中根目录是以只读的方式进行挂载。 一般来说,非必要的功能且可以编译成为模块的核心功能,目前的linux都会将他编译成为模块。因此USB,SATA,SCSI等磁盘装置的驱动程序通常都是以模块的方式来存在的。Linux核心不认识SATA磁盘,所以需要加载SATA磁盘的驱动程序,否则根本无法挂载根目录。SATA的驱动程序在/lib/moudles内,没有根目录当然读取不到存放在文件内的驱动程序,当然可以透过虚拟文件系统来处理这个问题。虚拟内存的特点就是他可以通过boot loader来加载到内存中,然后这个文件会被解压缩并且在内存中仿真成一个根目录,且此仿真在不内存当中的文件系统能够提供一支可执行的程序,透过程序来加载开机过程中所需要的的核心模块,通常这些模块就是USB、RAID、LVM等文件系统与磁盘接口驱动程序。等载入完成后,会帮助核心重新呼叫systemd来开始后续的正常开机流程。 如上图所示,boot loader可以加载kernel 与initramfs ,然后在内存中让initramfs 解压缩成为根目录,kernel 就能够藉此加载适当的驱动程序, 最终释放虚拟文件系统,并挂载实际的根目录文件系统,就能够开始后续的正常开机流程。 Kernel主动呼叫systemd程序 当核心加载完毕、进行硬件侦测与驱动程序加载后,此时主机硬件已经准备就绪了,这时核心会主动呼叫第一支程序,而这个程序就是systemd。systemd最主要的功能就是准备软件执行的环境,包括系统的主机名、网络设置、语系处理、文件系统格式及其他服务的启动等。而所的动作都会透过systemd的默认启动服务集合,亦即是/etc/system/default.target 来规划。 当我们取得了/etc/system/default.target 这一个预设操作界面的设定之后,接下来系统会链接到/usr/systemd/system/这个目录下去取得multi-user.target或graphical.target这两个其中的一个。这个target为多用户支持设定系统环境。非root用户会在这个阶段的引导过程中启用。防火墙相关的服务也会在这个阶段启动。接下来multi-user.target会把控制权交给sysinit.target。 sysinit.target会启动重要的系统服务例如:系统挂载、内存交换空间和设备、内核补充等选项。sysinit.target在启动过程中会传递给local-fs.target。这个target单元不会启动用户相关的服务,它只处理底层核心服务。这个target会根据/etc/fstab和/etc/inittab来执行相关操作。Systemd毫无疑问为改进Linux引导过程前进了一大步;它包含了一套漂亮的库和守护进程配合工作来优化系统引导和关闭过程。许多Linux发行版正准备将它作为自己的正式引导程序。 不积小流无以成江河,不积跬步无以至千里。而我想要成为万里羊,就必须坚持学习来获取更多知识,用知识来改变命运,用博客见证成长,用行动证明我在努力。 如果我的博客对你有帮助、如果你喜欢我的博客内容,记得“点赞” “评论” “收藏”一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
|