26.2 OpenBSD 系统安装

在了解 OpenBSD 项目的基本概述后,本节将详细介绍 OpenBSD 系统的安装流程,从镜像下载到自定义分区设置,为后续系统配置与使用奠定基础。

下载镜像

以 OpenBSD 7.7、AMD64 架构为例,请访问 https://cdn.openbsd.org/pub/OpenBSD/7.7/amd64arrow-up-right 获取系统镜像。

若是刻录 U 盘安装,请下载 install77.img(同时支持 UEFI 和 BIOS);若是用于虚拟机体验,请下载 install77.iso

ISO 镜像同样支持 UEFI 和 BIOS 启动。

警告

截至 OpenBSD 7.7,请勿使用 Ventoy 1.1.05 引导实体机安装,否则会卡在文件集选择阶段。

安装过程(UEFI)

本节将介绍在 UEFI 环境下安装 OpenBSD 系统的详细步骤。

技巧

OpenBSD 安装程序实际上调用的是位于 distrib/miniroot/install.subarrow-up-right 的脚本。该安装脚本高度耦合,截至写作时,有三千两百余行。

使用 install77.iso,并开启 VMware 虚拟机的 UEFI 功能。

Welcome to the OpenBSD/amd64 7.7 installation program.

(I)nstall, (U)pgrade, (A)utoinstall or (S)hell? i	# 此处的 i 是用户键入的,下同

输入 i,按 回车键,开始安装。

选择键盘布局,按 回车键,选择默认的美国键盘即可。

系统主机名可以选择较短的名称,将来主机名会显示为 ykla 这样的形式。

上面将列出系统所识别的网卡。

此步骤用于选择网络连接。为避免不必要的麻烦,请尽量选择有线网络。可先输入 ?,详细了解网络名称后再选择。如本例中 em0 为有线网络,vlan0 是虚拟 VLAN 接口。

后续配置均可直接按 回车键 确认。

设置 root 账号密码,输入后回车确认(密码不会显示在屏幕上)。

再次输入一遍 root 账号密码,按 回车键 确认。

回车键 确认,启用 SSH 服务。

启用 xenodm 以运行 X Window System。

设置普通用户的用户名。

用户全名,可随意输入或者按 回车键 默认。

为该账号设置密码(密码不会显示在屏幕上)。按 回车键 确认。

再次输入该用户名的密码。按 回车键 确认。

输入 yes回车键 确认,以允许 root 登录 ssh。

输入 Asia(亚洲),按 回车键 确认。

输入 Shanghai(注意 S 为大写字母),按 回车键 确认。

回车键,不加密磁盘。

输入 ? 可查看硬盘:

这一步是选择要将系统安装在哪一块硬盘。按 ? 列出识别的所有硬盘。请务必记住所有的盘符。然后输入需要安装的位置,如这里选择 sd0。输入 sd0 回车。

回车,选择使用 GPT 分区表。

这里直接按回车键,选择系统默认分区。

警告

由于默认情况下,自动分区的存储空间分配不够合理,使用该方式时可能无法安装桌面环境。

技巧

文末附有自定义分区设置,供参考。

直接按回车键,选择 cd0,即使用安装介质作为软件源。

直接按回车键。

此处可输入 -game* 以取消选择 game77.tgz,其余保持选中状态;也可以直接按 回车键

警告

即使不使用桌面环境,也建议勾选 xserv77.tgz,否则部分软件可能无法正常运行。

此后开始安装系统。约 5 分钟后,系统会显示如下提示:

警告

如果不希望在 fw_update 阶段卡住,请在按 回车键 前拔掉网线,断开网络连接。

系统已成功安装,重启后即可进入新系统。

警告

如果不希望遇到报错 ssh(fail): no hostkeys available, invalid format,请在重启前恢复网络连接。

附录:自定义分区

本附录详细介绍 OpenBSD 的自动分区机制,并提供手动分区的方法供参考。

OpenBSD 自动分区的源代码分析

OpenBSD 默认的自动分区实际调用的是 sbin/disklabel/editor.carrow-up-right 文件中的相关函数。

根据 sbin/disklabel/extern.harrow-up-right 头文件中的宏:

我们再看结构体 struct space_allocation

若磁盘总大小满足,先依次按最小大小为所有指定分区进行初次分配,则在初次分配中,先将 / 分区指定 150 MB,然后按照权重 5% 对剩余磁盘空间进行二次分配,二次分配后的 / 不会超过最大大小限制 1 GB。即无论磁盘多大,/ 大小的硬限制始终为 1 GB,上述代码最早可追溯到 2009 年。

注意到,最后超过最大权重限制的分区都会被授予以下分区:

  • 若磁盘总大小大于等于 2.38 GB(含):/home

  • 若磁盘总大小介于 700 M(含)到 2.38 GB 之间(不含):swap

思考题

在实际使用中,/ 分区很快就会被填满,而 /home 几乎完全为空。并且原生的文件系统不支持磁盘的再分配,如缩减分区,调整顺序。

你认为这种设计的根本缺陷在哪?请尝试改正并通过邮件列表向 OpenBSD 项目提交改进建议。

实际执行计算的是同 sbin/disklabel/editor.carrow-up-right 文件内的函数 allocate_space(),其中 if (xtrablks < sa[i].minsz) 表明先验证磁盘总大小是否满足初次分配的最小要求。从结构体 alloc_big[]alloc_medium[]alloc_small[] 最后到 alloc_stupid[] 依次降级计算。

函数 allocate_partition() 则执行实际写入。

思考题

请分析在 UEFI 下,OpenBSD 自动生成的 EFI 分区在哪个位置?

自动安装的分区如下:

以人类可读格式显示 sd0 磁盘的磁盘标签信息:

400 G 硬盘自动分区如下:

执行手动分区

了解自动分区的机制后,可以根据实际需求执行手动分区,以更合理地分配磁盘空间。

在系统分区阶段,选择 C(Custom),即“自定义设置”。

p m(注意之间的空格)

输入 p m(注意之间的空格)来显示硬盘。其他选项如下表:

代码
作用

p m

查看分区大小

A

自动分区

a

增加分区

d

删除分区

z

删除全部分区

q

确认分区

假设磁盘容量为 80 GB,可规划分区为:EFI 260 MB/ 75 G、其余空间分配给 swap

顺序不可动,否则无法启动!必须先分一个 /,再分 swap。基本思路:自动分区 → 删去 i 分区以外的分区 → 分 / → 分 swap

使用 d 删除现有的分区,但会保留 i 分区这个 EFI 分区(OpenBSD 7.5 及以上,7.5 以下请逐个删除除 MSDOS 以外的所有分区

查看当前分区状态:

设置 75 GB 的 / 分区:

设置交换分区,把剩余空间都给交换分区:

然后查看当前分区状态:

需要注意的是,在 size 一栏中未输入具体数值而直接按 回车键,表示将上一步剩余的全部容量分配给该分区,即 swap 分区。

配置完毕,记得输入 q 确认。

回车确认写入新的分区标签。

至此,分区配置完成。

从 release 升级到 stable 或 current

除了标准的 release 版本外,OpenBSD 还提供了 stable 和 current 版本供高级用户选择。本节介绍如何从 release 版本升级到这些版本。

OpenBSD 的版本分为三类:release、stable 和 current。release 是官方正式发布的稳定版本,每六个月发布一次;stable 是在 release 基础上应用安全补丁的版本;current 是开发版本,包含最新的功能但可能不稳定。

OpenBSD 不建议arrow-up-right从 release 升级到 current,建议直接使用 快照版本arrow-up-right(即预构建的 current)。这是因为 current 版本的 ABI 变动频繁,从 release 直接升级可能遇到兼容性问题。

经过测试,如果直接从 release 升级到 current 可能会遇到问题,例如:

获取 current 版本源码的步骤:

获取 7.3 -stable 版本源码的步骤:

从源码编译和升级系统的步骤:

参考文献

课后习题

  1. 在 QEMU 中安装 OpenBSD CURRENT,使用自定义分区(仅 / 和 swap),记录安装过程并验证系统能否正常启动,分析这种极简分区方案的适用场景与限制。

  2. 检出 OpenBSD CURRENT 源码,修改 sbin/disklabel/editor.c 中的 alloc_big 数组,将 / 分区最大限制从 1 GB 调整为 10 GB,重新编译 disklabel 工具并在测试环境中验证其效果。

  3. 从 OpenBSD -release 版本通过源码升级到 -stable,记录整个升级过程中遇到的问题(如 _shutdown 用户组缺失等),并分析为什么 OpenBSD 团队选择不保持向下兼容的设计决策及其对用户的约束。

最后更新于