探索 Linux 系统的启动过程是每一个 Linux 用户进步到一定程度后必然要去做的一件事。有的人可能只是好奇,也有的人可能确实需要从启动过程中去解决某一个特定的问题。这种探索我进行过多次,也早就想写一写,但是总是写不好。这一次是借着 systemd 普及的东风,让这个探索过程成为我这一系列的压轴之作。为什么说是借着 systemd 普及的东风呢?因为听说本月即将发布的 Ubuntu 15.04 版本将会从 upstart 更换为 systemd,目前正在紧张地测试中。当然,一下子迁移过来对开发人员来讲还是有点难度的,但是只要确定目标,即使 Ubuntu 15.04 不使用 systemd,到 15.10 也肯定是它了。因此,对于我这个喜欢折腾多个 Linux 发行版的人来说,就不用多线作战了,只需要学好 systemd 即可。
Linux启动过程概述这里先简单列一下 Linux 操作系统启动的全过程:
按下电脑的电源键后,电脑通电,BIOS启动;
BIOS读取硬盘的MBR,运行启动扇区中的代码,旧系统往往需要自己写启动扇区,而新系统基本上由专用的启动软件接管了,在 Linux 世界中,目前都是用的 Grub2。由于启动扇区空间太小,放不下太复杂的代码逻辑,所以 Grub2 也使用了多阶段启动的策略;
Grub2 负责将操作系统内核加载到内存,如果有必要,也会把 initramfs 文件加载到内存,然后将控制权交给内核;
内核进行初始化,内核的初始化过程结束后,就会把控制权交给/init程序,从此进入用户空间;
因为内核先是将 initramfs 文件挂在为根文件系统,所以刚开始运行的/init程序其实是 initramfs 文件中的,所以该文件需要的重要的初始化脚本、内核模块、配置文件等,都位于 initramfs 文件中,这也是为什么很多时候我们修改了某些配置文件后,需要先更新 initramfs 文件再重启操作系统才会生效;
initramfs 文件中的/init程序负责挂载硬盘上的文件系统,然后再把根文件系统切换到硬盘上的根分区,再运行/sbin/init程序,这时所有程序、配置文件、脚本都是使用的硬盘上的了,当然,网络文件系统也是同理。可以看出 init 程序的运行也是一个分阶段的过程;
/sbin/init程序负责系统的初始化、各种服务的运行、用户的登陆等等;
如果需要运行图形界面,则/sbin/init程序会运行 Display Manager,在 Fedora 中是 gdm,在 Ubuntu 中是 lightdm。然后 Display Manager 负责启动整个图形界面。
Grub加载Linux内核和initramfs研究 Linux 启动过程的第一站就是要研究 Grub。大部分时候我们不用考虑 Grub 的安装,因为安装 Linux 桌面系统的时候已经帮我们自动安装好了,我们要做的,最多就是改改 Grub 的配置文件。只有在一种情况下需要手动安装 Grub,那就是在系统崩溃后急救的时候,当然,需要先运行一个光盘版或 U 盘版的 Linux 系统,然后运行grub-install命令,这个命令需要指定将 Grub 安装到那个硬盘的 MBR,具体操作看文档即可。
Grub2 和 Grub 相比,有了很多改进,改进到 Grub2 都相当于一个小型的操作系统了,比如 Grub2 能识别各种格式的硬盘分区及文件系统,能识别各种格式的图像,甚至还能动态加载模块。其中最重要的改变是配置文件由 Grub1 时代的/boot/menu.lst文件变成 Grub2 时代的/boot/grub/grub.cfg文件了(注意,有的系统中是/boot/grub2/grub.cfg,比如 Fedora),配置文件的语法也变复杂了很多。虽然 Grub2 配置文件的语法比较复杂,但是我们一般不需要直接修改该文件,而是修改/etc/default/grub文件后,再使用update-grub命令自动生成配置文件。当然,要完成一些简单任务时对/boot/grub/grub.cfg文件进行直接修改也是可以的,只是一旦系统更新,则对该文件的修改有可能被覆盖。
Grub 最重要的任务就是加载 Linux 内核以及 initramfs 文件了,这几个命令是非常简单易懂的,在/boot/grub/grub.cfg文件中也非常容易找到,如下图:
上图主要是展示 Grub 载入 Linux 内核并且给 Linux 内核传递参数的过程,同时展示载入 initramfs 文件的过程。
探索initramfs文件的方法Grub 将 Linux 内核和 initramfs 文件载入内存后,就把控制权交给内核,内核会将内存中的 initramfs 文件挂载为根文件系统,当内核初始化完成后需要进入用户空间时,会运行/init,其实这个/init是在 initramfs 文件中的,所以如果想知道系统启动后都干了些什么,研究一下 initramfs 文件中的内容是有必要的。