OpenBSD 引导过程
概要
OpenBSD 的引导过程简洁明了,文档完备,注重可靠性、清晰度与安全性。整个引导机制分为若干阶段,从固件(如 BIOS 或 UEFI)开始,依次执行启动脚本,最终进入多用户模式。本章逐一介绍各阶段,包括引导加载程序、内核初始化以及早期用户态进程。
引导阶段概览
OpenBSD 系统的引导过程通常依次经过以下阶段:
固件初始化(BIOS 或 UEFI)
引导加载程序执行(
boot(8))内核加载与初始化
通过
init(8)初始化用户态多用户启动脚本(
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>)下,用户可指定其他内核或传递选项。例如:
上述命令进入单用户模式。若要引导旧版内核:
若不作任何输入,短暂超时后即加载默认内核(/bsd)。
内核初始化
内核加载后,初始化硬件,配置设备驱动,并以只读方式挂载根文件系统。此阶段输出的信息来自设备检测与子系统初始化。
随后内核尝试运行初始进程,通常是 /sbin/init。
若内核无法定位或执行 init(8),将触发 panic 并停机,或根据引导设置进入调试器(ddb(4))。
init(8) 与单用户模式
init(8) 是首个用户态进程,依次执行以下步骤:
读取
/etc/ttys配置终端。若传入
-s选项,或上次关机未正常完成,init进入单用户模式。单用户模式下,根 shell 直接在控制台启动,不启用网络与多用户服务。
单用户模式用于系统维护,例如修复文件系统或从错误配置中恢复。
若要从单用户模式进入多用户模式:
多用户初始化
进入多用户模式后,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。
-a:询问根设备
-a 选项让内核提示用户指定根设备、交换设备及文件系统类型。
根文件系统无法自动判定时使用该选项。
-v:详细模式
-v 选项启用内核详细输出,在硬件初始化过程中提供更多信息。
-d:进入调试器
内核编译时若包含调试支持,-d 会在引导早期进入内核调试器(ddb(4))。
指定其他内核
若要加载非默认的 /bsd 内核,需提供完整路径。
系统升级后回退到已知可用的内核时常采用此法。
应急恢复与备用内核
OpenBSD 安装时会保留备用内核 /bsd.old 与 /bsd.sp。当主内核配置错误或与系统不兼容时,可使用这些备用内核。
以单用户模式引导旧版内核:
若引导失败,可使用 install78.img 等安装介质引导,并进入 shell 模式手动恢复。
引导加载程序配置与超时
可通过 /etc/boot.conf 文件自定义引导加载程序行为。boot 程序读取该文件,用于自动选择内核或配置超时时间。
/etc/boot.conf 示例:
上述配置将超时设为 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) 后,依次执行以下步骤:
init(8)若存在/etc/rc.shutdown脚本,则尝试执行。该脚本可在关机前停止额外服务或执行清理任务。向所有进程发送
TERM信号,请求其正常退出。短暂等待后,向仍存活的进程发送
KILL信号。卸载文件系统并刷新系统缓冲区。
系统根据关机模式重启或断电。
若硬件支持,要立即断电:
要重启系统:
也可使用:
注意:直接调用上述命令需为 root 用户或属于 operator 组。
operator 组成员资格可通过 vipw(8) 与 chpass(1) 配置,详见账户管理章节。
shutdown(8) 支持调度未来关机时间并向已登录用户发出警告。多用户模式下停机或重启应优先使用该命令,可避免数据丢失,确保系统状态一致。
关机与重启事件记录到 /var/log/messages。若上述流程正常完成,下一次启动时的内核时间戳会反映这是一次干净关机。
最后更新于