Linux启动过程小结
浏览 52 | 评论 0 | 字数 2855
lovecatc
2020年12月25日
  • 之前一直对Linux的启动过程比较感兴趣,自己也折腾过引导,但一直没有深入学习Linux的启动过程。本篇文章将简要介绍与Linux启动相关的名词,叙述Linux启动的过程,并且给出GRUB的一些常用指令和说明。

    Part 1

    本部分首先简要说明一些名词,以便后续更好理解Linux启动过程。

    在本文的语境下,笔者默认环境为UEFI+GPT分区,而不考虑其它的启动和硬盘分区方式。

    UEFI & GPT

    UEFI是一种介于硬件和操作系统之间的标准启动模型。在UEFI模型下,操作系统加载器或是其它的应用都被封装为EFI程序,UEFI通过固件引导(NVRAM)来访问这些EFI程序,以进行下一步的启动。
    GPT是一种UEFI规范下的硬盘分区策略。它使用GUID/UUID来标识硬盘分区及其类型。在UEFI与GPT结合使用的情况下,UEFI在硬件自检及初始化完成后,将从GPT分区硬盘上查找EFI分区(ESP),并从中找到相应的EFI程序(.efi)作为启动入口。

    Kernel

    Kernel是操作系统的核心。它在内核态工作,负责处理系统底层事务,如访问外围设备、任务切换等。
    Linux系统的内核文件通常被放在/boot/下,一般以vmlinuz接版本号标识。

    Kernel Module

    kernel module是可以被加载入内核的功能模块。通常,为了拓展外设、增加文件系统支持,或者获得额外的系统调用,都需要引入新的模块。

    Bootloader

    在UEFI语境下,Bootloader就是一个特定的efi应用,它可以加载内核并给内核传递指定的参数。同时,它初始化initial RAM disk。

    initrd/initramfs

    initrd/initramfs的具体实现不同但功能类似。它们挂载一个临时的根文件系统,通过其中的工具和脚本,挂载上真正的根文件系统。之后系统将调用init

    Part 2

    本部分将以一台UEFI+GPT分区的系统为例,简要说明Linux启动过程。

    起始阶段,电脑上电,UEFI执行必要的硬件自检和初始化。

    严格意义来说,UEFI没有固定的,如同Legacy BIOS式的上电自检(POST),但UEFI提供了硬件自检及初始化的接口,从而加快了启动速度,又拓展了功能。

    接下来,UEFI固件将读取NVRAM中提供的入口,并决定从哪里、使用哪个EFI应用进行启动。一般来说,在NVME+GPT的机器上,EFI程序入口都存在于ESP分区的目录下。例如\EFI\Debian\grubx64.efi

    NVRAM是一种广义上的“非易失性随机存取存储器”。很多时候它只是一个逻辑上的存在,而非实际物理上的。NVRAM在不同主板上有不同的物理实现形式。但在逻辑上,一般就是定义为64K Byte的一个可读写的RAM区域。

    当然,这里的EFI应用,有的是所谓bootloader,即直接引导系统内核启动,如GRUB;也有所谓bootmanager,即进一步引导其它efi应用,如rEFInd

    接下来,bootloader将必要的参数传递给内核,并且根据配置加载initial RAM disk,initial RAM disk只需要加载访问实际根文件系统必须的module即可。通过initial RAM disk,kernel得以挂载上实际根文件系统,并调用初始化程序。目前采用的主流初始化程序为systemd

    systemd被分配PID=1,随后负责启动其它的系统组件。事实上,systemd负责了service, mount, device, socket等类型的组件。

    通常,在/usr/lib/systemd/system中存放安装软件包提供的组件;而/etc/systemd/system存放提供系统管理员的组件。

    之后,便是重要的系统组件被启动。其中包括getty, display manager, login, shell等。

    Part 3

    本部分将详细解析GRUB的工作原理以及其安装使用。

    安装GRUB时,同时也安装了efibootmgr这一软件。GRUB依赖其向NVRAM中写入入口信息。

    ArchWiki推荐使用以下步骤安装GRUB:

    1. 挂载EFI分区。通常,如果不单独分区,那么EFI分区一般挂载在/boot/efi。如果单独分区,则手动将其挂载到/boot/efi即可。
    2. 使用以下命令以安装grub的efi文件。
      grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB

    此命令将在/boot/efi下创建一个名称为GRUB的文件夹,并在其中创建一个用于64位x86系统引导的efi文件(grubx64.efi)。同时,会在/boot/grub/中生成用于其的模块。换言之,GRUB的主目录是位于/boot/grub。grub-install命令也会尝试在NVRAM中写入入口信息。
    使用选项--removable,GRUB将会创建esp/EFI/BOOT/BOOTX64.EFI。这使得可以直接从设备启动。因UEFI Firmware将默认启动ESP/BOOT/BOOTX64.EFI
    如果使用Live介质进行GRUB安装操作,推荐使用chroot先切换到需要安装的系统再进行修复。如果必须要在Live介质系统中为其他系统安装GRUB,应该显式指定被挂载的安装目录,使用--boot-directory=/mnt/boot

    1. 安装grub的efi文件完成后,还需要为其生成cfg配置文件。
      配置文件目录一般为/boot/grub/grub.cfg。注意默认情况下,生成的根文件系统配置文件就对应当前正在使用的系统,不论是正常启动还是通过chroot

    使用以下命令生成cfg文件。grub-mkconfig -o /boot/grub/grub.cfg

    最后,在ArchWiki上,能找到更多关于GRUB安装及配置的信息

    本文作者:lovecatc
    本文链接:https://lovecatc.com/index.php/archives/33/
    最后修改时间:2020-12-24 21:43:18
    本站未注明转载的文章均为原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!
    评论
    与本文无关评论请发留言板。请不要水评论,谢谢。
    textsms
    支持 Markdown 语法
    email
    link
    评论列表
    暂无评论
    arrow_back 上一篇
    11.20随感
    arrow_forward 下一篇
    没有了