Improving performance (简体中文)/Boot process (简体中文) - ArchWiki

Jump to content

# Improving performance (简体中文)/Boot process (简体中文)

From ArchWiki
< Improving performance (简体中文)
翻译状态：本文是 Improve_Boot_Performance 的翻译。上次翻译日期：2012-11-04。如果英文版本有所更改，则您可以帮助同步翻译。

这篇文章或章节的翻译不反映原文。

原因：Has seen an update 2021-10-14, but still out of sync with English page.（在 Talk:Improving performance (简体中文)/Boot process (简体中文)# 中讨论）

相关文章

- Arch启动过程
- Udev
- 守护进程
- mkinitcpio
- Improving performance
- Systemd

本文将为读者提供数种加速系统启动的方法。通过学习实践这些方法，读者不仅能改善系统性能，还能学习系统启动脚本的知识。

## 启动过程分析

### 使用 systemd-analyze

systemd提供了一个名为 `systemd-analyze` 的工具, 可用于显示有关启动过程的计时细节, 包括一个svg图, 显示等待其依赖项的单元. 您可以看到哪些单元文件导致启动过程减慢, 然后可以相应地优化系统.

要查看启动时在内核/用户空间中消耗的时间, 只需使用:

    $ systemd-analyze

提示： 如果使用 UEFI 引导, 且启动引导器实现了 systemd 的 Boot Loader Interface (目前只有 GRUB 和 systemd-boot 实现了), systemd-analyze 还可以显示 EFI 固件和启动引导器自身花费的时间

按照耗费时间顺序, 输出启动每个单元耗费的时间:

    $ systemd-analyze blame

在开机过程的一些时刻, 需要特定的单元成功启动了才能继续. 查看在启动链中哪些单元处于这些关键点, 可以:

    $ systemd-analyze critical-chain

还可以生成类似于 bootchart 的开机过程图表：

    $ systemd-analyze plot > plot.svg

更多细节请参考 systemd-analyze(1).

### 使用 systemd-bootchart

自2012年10月17日，bootchart 工具已经合并进 systemd 中，使用方法和原来的 bootchart 大同小异，添加下列内容到内核参数即可：

    initcall_debug printk.time=y init=/usr/lib/systemd/systemd-bootchart

更多信息请查看 manpage

### 使用 bootchart2

This article or section is a candidate for merging with Bootchart#Running Bootchart2.

Notes: different instructions from the main page (Discuss in Talk:Improving performance (简体中文)/Boot process (简体中文))

您还可以使用 Bootchart 来可视化引导序列. 由于没有办法在内核参数设置两个 init, 所以不能使用源里的 bootchart. 不过, AUR 软件包 bootchart2AUR 提供了一个 systemd 服务. 在安装完 bootchart2 后启用服务即可:

    # systemctl enable bootchart2.service

详情参阅 bootchart2 文档。

## 自己编译内核

编译自定义内核可以减少启动时间和内存使用. 尽管随着64位体系结构的标准化和Linux内核的模块化特性, 这些好处可能没有预期的那么大

有关更多信息, 请参见：Kernel (简体中文)#编译

## Initramfs

类似于 #自己编译内核, initramfs也可以精简. 一个简单的方法是包含 mkinitcpio `autodetect` 钩子. 详情请参见 Minimal initramfs.

## 提前启动服务

systemd 的一个核心特性就是 D-Bus 以及 socket 激活. 这会导致服务在首次访问时启动, 这通常是一件好事. 但是, 如果你知道某个服务 (比如 upower) 总是在引导过程中启动, 那么尽可能早地启动它可能会缩短总体的引导时间. 可以通过以下方式实现 (如果这个服务有 service 文件, 多数情况下都是):

    # systemctl enable upower

这会使 systemd 尽快启动 UPower, 而不会导致 socket 或 D-Bus 激活的竞争.

## Staggered spin-up

有些硬件使用staggered spin-up，操作系统一个一个访问硬盘，以减少耗电。这会降低启动速度，大部分用户都不需要开启。检查是否开启：

    # dmesg | grep SSS

如果没有查到，表示未启动。如果有显示，可以将`libahci.ignore_sss=1` 加入 kernel line 进行禁用。

## 避免重复挂载

mkinitcpio提供了 `fsck` 钩子，将启动加载配置中的 root 从 `ro` 修改为 `rw` 并删除 `/etc/fstab` 中的 root 挂载，可以避免重复挂载。挂载参数可以通过`rootflags=[mount options...]`设置。

删除 `/etc/fstab` 中的 API 文件系统，systemd 会自动挂载它们。下面命令可以获得这些 API 文件系统的列表：

    $ pacman -Ql systemd | grep '\.mount$'

`/home`等其他文件系统可以通过自定义挂载单元进行挂载。

## 精简输出信息

修改启动加载器内核参数中的 `verbose` 为 `quiet` 即可。对于某些用户，特别是 SSD 用户，TTY 的龟速实际上成为了性能瓶颈，精简输出信息实际上有利于提高性能。

## 参阅

- e4rat
- udev
- Daemon
- mkinitcpio
- Improving performance
- Systemd - An alternative init process
- Bootchart - A tool to assist in profiling the boot process
- Kexec A tool to reboot very quickly without waiting for the whole BIOS boot process to finish.

Category:

- Boot process (简体中文)

Hidden categories:

- Pages or sections flagged with Template:Bad translation (简体中文)
- Pages or sections flagged with Template:Merge