# 启动过程概述

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

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

## 第一级：BIOS（Basic Input/Output System）

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

不过在现在的计算机中，BIOS已经不是唯一的启动程序了，UEFI[统一可扩展固件接口](https://baike.baidu.com/item/%E7%BB%9F%E4%B8%80%E5%8F%AF%E6%89%A9%E5%B1%95%E5%9B%BA%E4%BB%B6%E6%8E%A5%E5%8F%A3/22786233)也是一种启动程序，它的功能和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" 所在的分区。

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

::: tip
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                           |

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

::: tip
通过设置在“ /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官网](https://systemd.io/)

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

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