# 21.2 通过 FreeBSD Ports 安装 Rocky Linux 兼容层

## Rocky Linux 版本号概述

截至 2026 年 2 月 16 日，FreeBSD Ports 的 [emulators/linux-rl9](https://www.freshports.org/emulators/linux-rl9/)（其实际对应的基础包为 [emulators/linux\_base-rl9](https://www.freshports.org/emulators/linux_base-rl9/)）基于 Rocky Linux 9.7 发行版构建。

在 Rocky Linux 兼容层环境中查看当前 Linux 发行版的版本信息：

```sh
bash-5.1$ cat /etc/redhat-release      # Rocky Linux 兼容层内
Rocky Linux release 9.7 (Blue Onyx)
```

需要特别指出的是，该版本号仅具有参考意义，而非绝对的版本标识。其原因在于：文件 `/etc/redhat-release` 实际上是由 Rocky Linux 软件包 `rocky-release` 提供的静态文本文件。由于 Linux 发行版在本质上是由多个独立软件包组合而成的集合体，单个软件包的版本信息无法决定发行版中所有软件包的版本均归属某一特定版本。从更严格的意义上讲，Linux 发行版的版本号是一个相对概念，而非绝对标识。

观察提交 [emulators/linux\_base-rl9: update to Rocky Linux 9.7 (+)](https://github.com/freebsd/freebsd-ports/commit/3eb21a5228ef7b1c30886e17ad3f53b0066e1fa9)，可以发现，真正决定了版本号的是 Ports 框架中的 [Mk/Uses/linux.mk](https://github.com/freebsd/freebsd-ports/blob/main/Mk/Uses/linux.mk) 文件中的 `LINUX_DIST_VER` 变量的值：

```make
.  if empty(linux_ARGS)
.    if exists(${LINUXBASE}/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7)  # 检查兼容层内是否存在文件 RPM-GPG-KEY-CentOS-7，若有则为 CentOS 7 兼容层
linux_ARGS=		c7
.    elif exists(${LINUXBASE}/etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9) # 检查兼容层内是否存在文件 RPM-GPG-KEY-Rocky-9，若有则为 Rocky Linux 9 兼容层
linux_ARGS=		rl9
.    else
linux_ARGS=		${LINUX_DEFAULT}
.    endif
.  endif

.  if ${linux_ARGS} == c7  # 检查是不是 CentOS 7 兼容层
LINUX_DIST_VER?=	7.9.2009    # 当前引入的是 CentOS 7.9.2009
.  elif ${linux_ARGS} == rl9   # 检查是否为 Rocky Linux 9 兼容层
LINUX_DIST_VER?=	9.7  # 当前引入的是 Rocky Linux 9.7
.  else
ERROR+=			"Invalid Linux distribution: ${linux_ARGS}"  # 如果都不是则直接打印报错信息
.  endif
```

## 启用 Linux 兼容层服务

在安装 Rocky Linux 兼容层之前，需要先启用 Linux 兼容层服务。

```sh
# service linux enable   # 启用 Linux 兼容层服务，并设置为开机自启
# service linux start    # 启动 Linux 兼容层服务
```

## 安装基本系统

* 使用 pkg 安装：

```sh
# pkg install linux-rl9
```

* 或者使用 Ports 安装：

```sh
# cd /usr/ports/emulators/linux-rl9/ 
# make install clean
```

## 配置相关服务

安装完成后，还需要配置一些相关服务，以确保 Rocky Linux 兼容层能够正常工作。

```sh
# service dbus enable  # 通常桌面环境已经配置
# service dbus start  # 通常桌面环境已经配置
# dbus-uuidgen > /compat/linux/etc/machine-id  # 生成 machine-id 并写入 Linux 兼容环境配置文件（可选）
```

无需配置 `/etc/fstab`，`linux_mounts_enable` 会自动运行。

重启后生效。

## 课后习题

1. 查看 FreeBSD Ports 中的 `Mk/Uses/linux.mk` 文件，分析其检测不同 Linux 兼容层的机制，并尝试修改该检测逻辑以支持一个新的 Linux 发行版标识。
2. 在 Rocky Linux 兼容层中，修改 `/etc/redhat-release` 为不同的版本信息，观察 Ports 系统的行为变化，分析该版本标识机制。
3. 尝试不使用官方 Ports 中的 `linux_base-rl9`，而是通过容器镜像手动构建 Rocky Linux 9 兼容层，并对比两种方法的差异，尝试移植更多兼容层到 Ports。
