Skip to content
此页的大纲

启动过程概述

你一定好奇从计算机开机到进入桌面,到底发生了什么?这篇文章将会带你了解一下启动过程。

计算机启动就像一个多级火箭发射的过程,每一级都有自己的任务,上一级完成任务后,下一级才能开始工作。这里我们将会从最底层的硬件开始,一步步的了解启动过程。

第一级:BIOS(Basic Input/Output System)

BIOS是计算机的基本输入输出系统,它是计算机的第一级启动程序,它的主要功能是检测计算机的硬件配置,然后将控制权交给操作系统。

不过在现在的计算机中,BIOS已经不是唯一的启动程序了,UEFI统一可扩展固件接口也是一种启动程序,它的功能和BIOS类似,但是它的功能更加强大,它可以加载更多的操作系统,比如我们的deepin系统就是通过UEFI启动的。

还有一种启动程序叫做uboot,它和UEFI类似,但是不常见于我们日常使用的计算机中,主要存在于国产计算机和部分基于ARM的单板机中。

第二级:引导加载程序

引导加载程序是计算机的第二级启动程序,它的主要功能是加载操作系统内核,然后将控制权交给操作系统内核。

在我们deepin系统中,引导加载程序是grub2,由上一级UEFI加载。grub2加载内核,所以你可以在grub中选择不同的内核启动,如果我们在系统里面升级了内核,就可以通过grub来选择启动新的内核。

GRUB2 首先读取 ESP 分区,使用 "/boot/efi/EFI/deepin/grub.cfg"里面 search.fs_uuid 指定的 UUID 来确定 GRUB2 菜单配置文件 "/boot/grub/grub.cfg" 所在的分区。

警告

如果你不理解grub的配置文件,不要随意修改,否则可能会导致系统无法启动。对于一般用户,我们推荐使用deepin的启动管理器来管理启动项,你可以在控制中心找到它。

提示

grub支持修改主题,不过可能导致系统无法引导,我建议你这么做之前备份好资料,并且准备一个liveCD系统以防万一。

GRUB2 菜单配置文件的关键部分看起来像:

menuentry 'deepin GNU/Linux' ... {
        load_video
        insmod gzio
        insmod part_gpt
        insmod ext2
        search --no-floppy --fs-uuid --set=root fe3e1db5-6454-46d6-a14c-071208ebe4b1
        echo    'Loading Linux 5.18.0-amd64 ...'
        linux   /boot/vmlinuz-5.18.0-amd64 root=UUID=fe3e1db5-6454-46d6-a14c-071208ebe4b1 ro quiet
        echo    'Loading initial ramdisk ...'
        initrd  /boot/initrd.img-5.18.0-amd64
}

/boot/grub/grub.cfg 文件上面部分菜单条目意义

设置
GRUB2 模块加载gzio, part_gpt, ext2
使用的根文件系统分区由 UUID=fe3e1db5-6454-46d6-a14c-071208ebe4b1 指定的分区标识
内核镜像文件在根文件系统中的路径/boot/vmlinuz-5.18.0-amd64
使用的内核启动参数"root=UUID=fe3e1db5-6454-46d6-a14c-071208ebe4b1 ro quiet"
initrd 镜像文件在根文件系统中的路径/boot/initrd.img-5.18.0-amd64

提示

通过删除 "/boot/grub/grub.cfg" 里面的 quiet ,你能够查看内核启动日志信息。为固化这个修改,请编辑 "/etc/default/grub"里的 "GRUB_CMDLINE_LINUX_DEFAULT="quiet"" 行

提示

通过设置在“ /etc/default/grub” 的 GRUB_BACKGROUND 变量指向到图像文件,或者把图像文件本身放入 “/boot/grub/”,你能够定制 GRUB 的启动图像。

参见 “info grub” 及 grub-install(8)。

第三级:内核

内核是计算机的第三级启动程序,它的主要功能是加载操作系统的驱动程序,然后将控制权交给操作系统的第一个进程。

在我们deepin系统中,内核是linux内核,由上一级grub2加载。内核加载驱动程序,所以你可以在内核启动参数中指定加载哪些驱动程序,比如我们可以通过内核启动参数来指定加载nvidia显卡驱动。

第四级:第一个进程

第一个进程是操作系统的第一个进程,它的主要功能是加载操作系统的其他进程,然后将控制权交给操作系统的第一个用户进程。

如果你学习过操作系统的进程管理,你应该知道操作系统的第一个进程叫做init进程,它的PID是1,它的父进程是0,它的父进程是内核。

不过在现代的linux系统中,init进程已经不是唯一的第一个进程了,它的替代者是systemd,systemd是一个守护进程,它的主要功能是管理系统中的所有进程。

systemd是一个很有野心的软件,它目的是替换掉linux系统里面很多不好用的软件,目标是成为linux世界里面最重要的组件之一。

systemd官网

systemd会启动一系列服务 (service),这些服务会在后台运行,比如网络服务、打印服务、文件系统服务、用户管理服务、安全服务、时间服务、日志服务、电源管理服务、蓝牙服务、声音服务、打印服务、磁盘管理服务、文件系统管理服务、系统监控服务。

当显示管理器(DisplayManager)被启动时,你就可以看到熟悉的登陆页面了。deepin使用的是LightDM作为显示管理器,你可以在显示管理器切换到其他桌面环境。