# Systemd初始化

本节描述系统是怎样通过 PID=1 的 systemd(1) 程序来启动（即初始化进程）。

## 什么是systemd

systemd是Linux系统的一个守护进程，它的作用是管理系统中的所有进程，比如启动、停止、重启、查看状态等。

你可以使用`systemctl`  命令来管理systemd进程。详见[Systemd](https://wiki.deepin.org/zh/Systemd)

## systemd的初始化

systemd 初始化进程基于单元配置文件 (参见 systemd.unit(5)) 来并行派生进程，这些单元配置文件使用声明样式来书写，代替之前的类 SysV 的过程样式。这些单元配置文件从下面的一系列路径来加载 (参见 systemd-system.conf(5)) ：

派生的进程被放在一个单独的 [Linux control groups](https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html)，在单元后命名，它们属于一个私有的 systemd 层级结构(参见 cgroups 和 第 4.7.4 节 “Linux 安全特性”)。

单元配置文件从下列一系列路径中加载（参见 systemd-system.conf(5)）：

- `/lib/systemd/system`: OS 默认配置文件
- `/etc/systemd/system`: 系统管理员的配置文件，它将忽略操作系统默认的配置文件
- `/run/systemd/system`: 运行时产生的配置文件，它将忽略安装的配置文件

他们的相互依赖关系通过"`Wants=`", "`Requires=`", "`Before=`", "`After=`", … 等指示来配置，(参见 systemd.unit(5) 里的 "MAPPING OF UNIT PROPERTIES TO THEIR INVERSES")。 资源控制也是被定义 (参见 systemd.resource-control(5)).

根据单元配置文件的后缀来区分它们的类型：

- `*.service`描述由 systemd 控制和监管的进程.参见 systemd.service(5).
- `*.device`描述在 sysfs(5) 里面作为 udev(7) 设备树展示的设备。参见 systemd.device(5).
- `*.mount` 描述由 systemd 控制和监管的文件系统挂载点。参见 systemd.mount(5).
- `*.automount` 描述由 systemd 控制和监管的文件系统自动挂载点。参见 systemd.automount(5).
- `*.swap` 描述由 systemd 控制和监管的 swap 文件或设备。参见 systemd.swap(5).
- `*.path` 描述被 systemd 监控的路径，用于基于路径的活动。参见 systemd.path(5).
- `*.socket` 描述被 systemd 控制和监管的套接字，用于基于套接字的活动。参见 systemd.socket(5).
- `*.timer` 描述被 systemd 控制和监管的计时器，用于基于时间的活动。参见 systemd.timer(5).
- `*.slice` 管理 cgroups(7) 的资源。参见 systemd.slice(5).
- `*.scope` 使用 systemd 的总线接口来程序化的创建，用以管理一系列系统进程。 参见 systemd.scope(5).
- `*.target` 把其它单元配置文件分组，在启动的时候，来创建同步点。参见systemd.target(5).

系统启动时（即，init），systemd 进程会尝试启动"`/lib/systemd/system/default.target`（通常是到"graphical.target"的符号链接）。首先，一些特殊的 target 单元（参见 systemd.special(7)），比如 "local-fs.target"、"swap.target"和"cryptsetup.target"会被引入以挂载文件系统。之后，其它 target 单元也会根据单元依赖关系而被引入。详细情况，请阅读 bootup(7)。

systemd 提供向后兼容的功能。在 "/etc/init.d/rc[0123456S].d/[KS]name" 里面的 SysV 风格的启动脚本仍然会被分析；telinit(8) 会被转换为 systemd 的单元活动请求。

在你了解这些之后，可以尝试自己写一个 systemd 单元配置文件，然后使用 systemctl(1) 来管理它。[wiki](https://wiki.deepin.org/zh/%E5%A6%82%E4%BD%95%E8%87%AA%E5%B7%B1%E5%86%99%E4%B8%80%E4%B8%AA%E5%BC%80%E6%9C%BA%E8%87%AA%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1%EF%BC%9F)

::: warning 小心
模拟的运行级别 2 到 4 全部被符号链接到了相同的“multi-user.target”。
:::

## 主机名

内核维护系统主机名。在启动的时候，通过 systemd-hostnamed.service 启动的系统单位设置系统的主机名，此主机名保存在 "/etc/hostname"。这个文件应该只包含系统主机名，而不是全称域名。

不带参数运行 hostname(1) 命令可以打印出当前的主机名。

## 文件系统

硬盘和网络文件系统的挂载选项可以在 "/etc/fstab" 中设置，参见 fstab(5) 和 第 9.6.7 节 “通过挂载选项优化文件系统”。

加密文件系统的配置设置在“/etc/crypttab”中。参见 crypttab(5)

软 RAID 的配置 mdadm(8) 设置在 "/etc/mdadm/mdadm.conf". 参见 mdadm.conf(5).

::: warning
每次启动的时候，在挂载了所有文件系统以后，"/tmp", "/var/lock", 和 "/var/run" 中的临时文件会被清空。
:::

## 网络接口初始化

对于deepin，网络接口通常由两个服务进行初始化：lo 接口通常在“networking.service”处理，而其它接口则由“NetworkManager.service”处理。

参见 第 5 章 网络设置 来获取怎样来配置它们的信息。
