> For the complete documentation index, see [llms.txt](https://book.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://book.bsdcn.org/openbsd/system-administration/boot-process.md).

# OpenBSD 引导过程

## 概要

OpenBSD 的引导过程简洁明了，文档完备，注重可靠性、清晰度与安全性。整个引导机制分为若干阶段，从固件（如 BIOS 或 UEFI）开始，依次执行启动脚本，最终进入多用户模式。本章逐一介绍各阶段，包括引导加载程序、内核初始化以及早期用户态进程。

## 引导阶段概览

OpenBSD 系统的引导过程通常依次经过以下阶段：

1. 固件初始化（BIOS 或 UEFI）
2. 引导加载程序执行（`boot(8)`）
3. 内核加载与初始化
4. 通过 `init(8)` 初始化用户态
5. 多用户启动脚本（`rc(8)`）

各阶段相互独立，便于系统恢复与故障排查时灵活处理。

## 固件初始化

系统通电后，固件（BIOS 或 UEFI）初始化硬件并执行开机自检（POST）。随后固件扫描可引导介质，将控制权交给一级引导加载程序。该程序位于主引导记录（MBR）或 EFI 系统分区（ESP），具体位置取决于系统架构与配置。

在基于 UEFI 的 x86 系统上，加载程序通常安装于：

```
EFI\BOOT\BOOTX64.EFI
```

在传统 BIOS 系统上，引导加载程序写入 MBR 与 OpenBSD disklabel。

## 引导加载程序（`boot(8)`）

OpenBSD 采用多级引导加载程序，由若干程序组成：

* **`biosboot`**：BIOS 系统的一级引导加载程序。
* **`pxeboot`**：用于 PXE 网络引导的加载程序。
* **`bootefi`**：UEFI 系统的 EFI 引导加载程序。
* **`boot`**：最终级引导加载程序，位于根文件系统中的 `/boot`。

`boot` 程序负责定位并加载 OpenBSD 内核。它提供用户界面与有限的命令环境，支持引导时配置。

在引导提示符（`boot>`）下，用户可指定其他内核或传递选项。例如：

```
boot> boot -s
```

上述命令进入单用户模式。若要引导旧版内核：

```
boot> boot /bsd.old
```

若不作任何输入，短暂超时后即加载默认内核（`/bsd`）。

## 内核初始化

内核加载后，初始化硬件，配置设备驱动，并以只读方式挂载根文件系统。此阶段输出的信息来自设备检测与子系统初始化。

随后内核尝试运行初始进程，通常是 `/sbin/init`。

若内核无法定位或执行 `init(8)`，将触发 panic 并停机，或根据引导设置进入调试器（`ddb(4)`）。

## `init(8)` 与单用户模式

`init(8)` 是首个用户态进程，依次执行以下步骤：

* 读取 `/etc/ttys` 配置终端。
* 若传入 `-s` 选项，或上次关机未正常完成，`init` 进入**单用户模式**。
* 单用户模式下，根 shell 直接在控制台启动，不启用网络与多用户服务。

单用户模式用于系统维护，例如修复文件系统或从错误配置中恢复。

若要从单用户模式进入多用户模式：

```sh
# exit
```

## 多用户初始化

进入多用户模式后，`init` 执行 `/etc/rc` 脚本。该脚本完成必要的启动任务，包括：

* 检查并挂载文件系统（`fsck`、`mount`）
* 配置网络（`hostname.if`、`dhcpleased` 等）
* 通过 `rcctl(8)` 启动系统守护进程
* 应用 `sysctl(8)` 与 `wsconsctl(8)` 设置
* 运行日常维护脚本（`daily`、`security` 等）

`/etc/rc` 的输出记录到 `/var/run/rc.log`。

终端登录通过 `ttys(5)` 实现：在已配置的虚拟控制台或串口上启动 `getty(8)`。

## 引导时配置

用户可中断引导加载程序，以修改引导参数、选择其他内核或进入单用户模式。

### `-s`：单用户模式

使用 `-s` 引导即进入单用户模式，便于修复故障或进入恢复 shell。

```
boot> boot -s
```

### `-a`：询问根设备

`-a` 选项让内核提示用户指定根设备、交换设备及文件系统类型。

```
boot> boot -a
```

根文件系统无法自动判定时使用该选项。

### `-v`：详细模式

`-v` 选项启用内核详细输出，在硬件初始化过程中提供更多信息。

```
boot> boot -v
```

### `-d`：进入调试器

内核编译时若包含调试支持，`-d` 会在引导早期进入内核调试器（`ddb(4)`）。

```
boot> boot -d
```

### 指定其他内核

若要加载非默认的 `/bsd` 内核，需提供完整路径。

```
boot> boot /bsd.old
```

系统升级后回退到已知可用的内核时常采用此法。

## 应急恢复与备用内核

OpenBSD 安装时会保留备用内核 `/bsd.old` 与 `/bsd.sp`。当主内核配置错误或与系统不兼容时，可使用这些备用内核。

以单用户模式引导旧版内核：

```
boot> boot /bsd.old -s
```

若引导失败，可使用 `install78.img` 等安装介质引导，并进入 shell 模式手动恢复。

## 引导加载程序配置与超时

可通过 `/etc/boot.conf` 文件自定义引导加载程序行为。`boot` 程序读取该文件，用于自动选择内核或配置超时时间。

`/etc/boot.conf` 示例：

```
set timeout 5
boot /bsd
```

上述配置将超时设为 5 秒，并引导默认内核。

## 关键文件与工具

| 文件               | 用途               |
| ---------------- | ---------------- |
| `/bsd`           | 默认内核             |
| `/bsd.mp`        | 多处理器内核（SMP 系统默认） |
| `/bsd.sp`        | 单处理器内核           |
| `/bsd.old`       | 上次升级前的备份内核       |
| `/boot`          | 最终级引导加载程序        |
| `/etc/boot.conf` | 引导加载程序配置         |
| `/etc/rc`        | 多用户模式启动脚本        |
| `/etc/ttys`      | 终端配置             |
| `/etc/fstab`     | 文件系统挂载配置         |

## 关机流程

OpenBSD 的关机流程由 `init(8)` 主导，通过 `shutdown(8)`、`reboot(8)` 或 `halt(8)` 触发。`shutdown(8)` 带上相应参数后，系统按受控顺序终止所有用户态活动，确保安全停机。

调用 `shutdown(8)` 后，依次执行以下步骤：

1. `init(8)` 若存在 `/etc/rc.shutdown` 脚本，则尝试执行。该脚本可在关机前停止额外服务或执行清理任务。
2. 向所有进程发送 `TERM` 信号，请求其正常退出。
3. 短暂等待后，向仍存活的进程发送 `KILL` 信号。
4. 卸载文件系统并刷新系统缓冲区。
5. 系统根据关机模式重启或断电。

若硬件支持，要立即**断电**：

```sh
# shutdown -p now
```

要**重启**系统：

```sh
# shutdown -r now
```

也可使用：

```sh
# halt
# reboot
```

注意：直接调用上述命令需为 root 用户或属于 `operator` 组。

`operator` 组成员资格可通过 `vipw(8)` 与 `chpass(1)` 配置，详见账户管理章节。

`shutdown(8)` 支持调度未来关机时间并向已登录用户发出警告。多用户模式下停机或重启应优先使用该命令，可避免数据丢失，确保系统状态一致。

关机与重启事件记录到 `/var/log/messages`。若上述流程正常完成，下一次启动时的内核时间戳会反映这是一次干净关机。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://book.bsdcn.org/openbsd/system-administration/boot-process.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
