最新消息: 关于Git&GitHub 版本控制你了解多少?
您现在的位置是:群英 > 服务器 > 系统运维 >
带你详细了解Linux系统的启动流程
CSDN发表于 2020-10-12 17:47 次浏览
经常操作Linux系统的同学,可能未必了解Linux系统的启动流程 ,了解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发行版正准备将它作为自己的正式引导程序。


免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
相关信息推荐