首先我不喜欢造轮子,但是有的时候为了文章连续性,不得不造轮子,在文章末尾,我会详细列出参考的文章(基本来自csdn和知乎等平台),下面的文章中我讲采用arch linux的gnu来进行grub的结构分析,将采用配置grub的方式解读grub的流程,其linux的架构为:
- efi(uefi的引导文件“grubx64.efi”)
- boot分区(linux的grub.cfg及核心引导文件)
- / (根分区,该架构因将/boot分离了出去,所以更grub关系不大,不过fstab还是要说一下的)
首先是grubx64.efi
- grub 本身就是一个系统,它与 linux 无关 该处grub是指grub.efi文件
- 在 grub 中选择内核的过程,全部都由 grub 这个系统控制,与 linux 无关,此时 linux 还根本没有启动。
- grub 这个系统读取了 /boot/grub.conf,然后引导了 linux 内核之后,才把控制权交给 linux 系统,之后才是 linux 的事,所以读取 grub.conf 与 linux 内核没有任何关系。
作者:匿名用户
链接:https://www.zhihu.com/question/26695745/answer/33694133
来源:知乎现在的引导装载程序(例如 GRUB)已经是一个独立的能够管理硬盘读取分区的微型系统了,如果你进入 GRUB 的命令行的话,还可以使用 GRUB 自己实现的一些类 Bash 命令和类 Unix 工具... 而这些跟内核都无关的。所以自主读取硬盘上的配置和启动硬盘上的内核镜像都绰绰有余。
因为引导程序启动的内核仅仅是内核核心而已... 它不包含各种驱动模块(包括硬盘控制器的驱动)。所以内核被引导以后其实无法完成对 root 的挂载... 无法挂载文件系统便不能读取并载入内核驱动模块,没有驱动支持就不能管理硬盘(完成对文件系统的挂载)...
于是在内核被启动前引导程序会预先载入一部分内容(以一个被被打包的压缩归档的形式存在),其中包括了一部分必要的驱动模块。内核启动后会将该压缩归档读入 initramfs,挂载到 / 上(注意:initramfs 基于 tmpfs),然后切入用户模式执行 initramfs 上的 init 将驱动载入到内核中。然后才能挂载真正的 root 文件系统,开始 init ...
作者:绅士喵
链接:https://www.zhihu.com/question/26695745/answer/235628553
来源:知乎
文章参考1、linux内核启动关于先有鸡再有蛋的问题?
grub-install --target=x86_64-efi --efi-directory=/boot/EFI --recheck
是GRUB的安装命令
,现在Arch Linux已经不再支持32位系统的维护,这里也仅介绍efi的安装模式,所以此参数照搬便可;--efi-directory参数指定安装位置(ESP的分区就是/boot/EFI);--bootloader-id参数则指定此系统引导在引导选项中所显示的名称,可随自己的喜好更改。--参考自“实用教程:Arch Linux 安装详解”[/info]
提示: 如果你使用了 --removable 选项,那 GRUB 将被安装到 esp/EFI/BOOT/BOOTX64.EFI (当使用 i386-efi 时是 esp/EFI/BOOT/BOOTIA32.EFI),此时即使 EFI 变量被重设或者你把这个驱动器接到其他电脑上,你仍可从这个驱动器上启动。通常来说,你只要像操作 BIOS 设备一样在启动时选择这个驱动器就可以了。如果和 Windows 一起多系统启动,注意 Windows 通常会在那里安装一个 EFI 可执行程序,这只是为了重建 Windows 的 UEFI 启动项。
注意:
--efi-directory 和 --bootloader-id
--efi-directory 和 --bootloader-id
是 GRUB UEFI 特有的。--efi-directory 替代了已经废弃的 --root-directory。
您可能注意到在 grub-install 命令中没有一个 选项,例如 /dev/sda。事实上即使提供了 ,也会被 GRUB 安装脚本忽略,因为 UEFI 启动加载器不使用 MBR 启动代码或启动扇区。
确保 grub-install 命令是在你想要用 GRUB 引导的那个系统上运行的。也就是说如果你是用安装介质启动进入了安装环境中,你需要在 chroot 之后再运行 grub-install。如果因为某些原因不得不在安装的系统之外运行 grub-install,在后面加上
--boot-directory=
选项来指定挂载 /boot 目录的路径,例如 --boot-directory=/mnt/boot。
在arch linux里该,命令代表将在
/boot/EFI
分区里面写入唯一的一份.efi文件,用于引导到/boot(也可以说是将uefi的引导流程结束,交由系统进行下一步操作,当efi正确的引导后,就算进入系统了,当然这并没有结束,还有引导内核和grub.cfg需要继续工作)
至此ESP分区结束,将进入/boot分区。
/boot
grub-mkconfig -o /boot/grub/grub.cfg
一条简单的命令就把grub.cfg配置好了,