# 在 OpenWrt 上安装

在 OpenWrt 路由器上安装 doona v0.1.0-rc.2 和 honk。所有命令均在路由器的 root shell 中执行，安装期间保持同一 shell。

## 1. 检查路由器并准备工具

下载前先检查[后端前提条件](https://doona.daeuniverse.org/zh-CN/install.md#install)，包括内核、BTF、cgroup 和 CPU 要求。有对应的 doona 软件包，不代表路由器可以运行 honk。检查安装文件与下载目录所需的空间：

```sh
uname -r
uname -m
df -h / /tmp
```

OpenWrt 25.12 使用 apk-tools 3；OpenWrt 24.10 及更早版本使用 opkg 和 ipk 软件包。官方 OpenWrt 24.10 使用 [Linux 6.6](https://github.com/openwrt/openwrt/blob/openwrt-24.10/target/linux/x86/Makefile)，低于上文链接中 honk 的最低内核要求。安装格式匹配的 UI 软件包不能解决这一兼容性问题。

按路由器的包管理器选择命令。OpenWrt 提供 [veth 模块](https://github.com/openwrt/openwrt/blob/openwrt-25.12/package/kernel/linux/modules/netsupport.mk)与 [NFQUEUE 模块](https://github.com/openwrt/openwrt/blob/openwrt-25.12/package/kernel/linux/modules/netfilter.mk)软件包：

```sh tab="apk"
apk update
apk add curl ca-bundle kmod-veth kmod-nft-queue
```

```sh tab="opkg"
opkg update
opkg install curl ca-bundle kmod-veth kmod-nft-queue
```

启用了 NFQUEUE，但缺少前提条件时，honk 可能继续运行，同时停用 NFQUEUE staging 并输出启动警告。检查[服务日志](https://doona.daeuniverse.org/zh-CN/service-management.md)；服务启动成功不代表 NFQUEUE staging 已启用。

<a name="openwrt-packages"></a>

## 2. 下载并校验 doona

以下软件包安装标准版。lite 请使用[手动安装](https://doona.daeuniverse.org/zh-CN/install-manual.md)中的压缩包方式，省略 `sudo`，然后返回第 4 步。

下载到 `/tmp/doona`，按固件使用的格式选择软件包。OpenWrt apk 软件包与 Alpine 软件包不同。

`/tmp` 使用内存，重启后会清空。下载 honk 时，必须预留同时存放压缩包与解压目录的空间。

```sh
mkdir -p /tmp/doona
cd /tmp/doona
BASE=https://github.com/Zakkaus/doona/releases/download/v0.1.0-rc.2
```

```sh tab="apk"
FILE=doona-0.1.0_rc2-r1.apk
curl -fL -O "$BASE/$FILE" -O "$BASE/doona-openwrt.adb" \
  -O "$BASE/doona-openwrt.pem" -O "$BASE/SHA256SUMS"
awk -v file="$FILE" '$2 == file' SHA256SUMS | sha256sum -c -
awk '$2 == "doona-openwrt.adb"' SHA256SUMS | sha256sum -c -
awk '$2 == "doona-openwrt.pem"' SHA256SUMS | sha256sum -c -
```

```sh tab="opkg"
FILE=doona_0.1.0-rc.2-1_all.ipk
curl -fL -O "$BASE/$FILE" -O "$BASE/SHA256SUMS"
awk -v file="$FILE" '$2 == file' SHA256SUMS | sha256sum -c -
```

所有选定文件都显示 `OK` 后才能继续。如果校验失败或找不到校验和条目，先核对文件名并重新下载，再安装。

下载或执行文件出错时，见[安装故障](https://doona.daeuniverse.org/zh-CN/install.md#安装故障)。

## 3. 安装软件包

使用 apk 时，安装已校验的公钥，并通过已签名的索引安装。索引与软件包文件应放在同一目录。

```sh tab="apk"
mkdir -p /etc/apk/keys
cp /tmp/doona/doona-openwrt.pem /etc/apk/keys/doona-openwrt.pem
apk add -X /tmp/doona/doona-openwrt.adb doona
```

```sh tab="opkg"
opkg install "/tmp/doona/$FILE"
```

没有发布公钥和索引时，可以直接安装已校验的本地 apk：

```sh
apk add --allow-untrusted "/tmp/doona/$FILE"
```

此方式跳过签名信任检查，因此使用前必须校验软件包对应的 SHA-256 条目。

```sh
ls -l /usr/share/doona/index.html
```

最后一条命令必须列出 `index.html`。使用[最小配置](https://doona.daeuniverse.org/zh-CN/minimal-configuration.md)中的 OpenWrt 示例时，将 UI 目录设为 `/usr/share/doona`。

### 可选软件包

按需选择[可选资源](https://doona.daeuniverse.org/zh-CN/install.md#doona)。将选定文件下载到 `/tmp/doona`，并像第 2 步那样使用 `SHA256SUMS` 中对应的条目校验。

| 软件包 | apk 文件名 | opkg 文件名 |
| --- | --- | --- |
| `doona-fonts` | `doona-fonts-0.1.0_rc2-r1.apk` | `doona-fonts_0.1.0-rc.2-1_all.ipk` |
| `doona-precompressed` | `doona-precompressed-0.1.0_rc2-r1.apk` | `doona-precompressed_0.1.0-rc.2-1_all.ipk` |

使用 apk 时，将安装命令中的 `doona` 改为所选软件包名后执行。使用 opkg 时，将 `FILE` 设为所选文件名，再执行安装命令。

## 4. 安装 honk

在另一个下载目录中按[安装 honk](https://doona.daeuniverse.org/zh-CN/install.md#install)操作，避免后端的 `SHA256SUMS` 覆盖 doona 的文件。选择 musl 构建和 OpenWrt 安装标签页，将可执行文件安装到 `/usr/bin/honk-core`，再返回本页。

确认已安装的可执行文件正常后，使用绝对路径删除其下载压缩包和解压目录。所有选定的可选 UI 软件包安装完成后，再使用绝对路径删除 `/tmp/doona` 中下载的软件包、索引、公钥副本与校验和文件。仍需用于安装的下载文件应先保留。

<a name="install-geodata"></a>

## 5. 准备数据目录

采用[最小配置](https://doona.daeuniverse.org/zh-CN/minimal-configuration.md)中 OpenWrt 示例的持久化目录布局。`data_dir` 的含义见[配置参考](https://doona.daeuniverse.org/zh-CN/configuration.md#config)。

```sh
mkdir -p /etc/honk/config.d /etc/honk/data
chmod 0700 /etc/honk /etc/honk/config.d /etc/honk/data
```

仅在规则需要时下载 geodata，具体条件见 [geodata 要求](https://doona.daeuniverse.org/zh-CN/feature-requirements.md#req-geodata)。采用上述目录时执行：

```sh
curl -fL --retry 3 -o /etc/honk/data/geosite.dat \
  https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/release/geosite.dat
curl -fL --retry 3 -o /etc/honk/data/geoip.dat \
  https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/release/geoip.dat
```

也可以安装发行版提供的 [v2ray geodata 软件包](https://github.com/openwrt/packages/blob/openwrt-25.12/net/v2ray-geodata/Makefile)，替代上面的直接下载方式：

```sh tab="apk"
apk add v2ray-geosite v2ray-geoip
```

```sh tab="opkg"
opkg install v2ray-geosite v2ray-geoip
```

honk 会搜索 `/usr/share/dae`，不会直接搜索 `/usr/share/v2ray`。先检查 `/usr/share/dae` 中已有的文件或链接，仅创建缺少的链接：

```sh
mkdir -p /usr/share/dae
ln -s ../v2ray/geosite.dat /usr/share/dae/geosite.dat
ln -s ../v2ray/geoip.dat /usr/share/dae/geoip.dat
```

已配置的数据目录中若存在同名文件，honk 会优先使用这些文件。

编写配置与按[服务管理](https://doona.daeuniverse.org/zh-CN/service-management.md)创建服务时，使用 OpenWrt 版本的步骤。

## 在 sysupgrade 后保留配置

执行保留配置的普通 sysupgrade 前，将尚未列出的以下路径加入 `/etc/sysupgrade.conf`，再检查[备份清单](https://github.com/openwrt/openwrt/blob/openwrt-25.12/package/base-files/files/sbin/sysupgrade)：

```sh
printf '%s\n' '/etc/honk/' '/etc/init.d/honk-core' >> /etc/sysupgrade.conf
sysupgrade -l
```

确认清单包含 honk 配置、数据文件与 init 脚本。这份配置备份不会恢复已安装的内核模块、`/usr/bin/honk-core` 或 `/usr/share/doona`。

升级后重复第 1–4 步，重新安装工具、内核模块、UI 软件包和 honk 可执行文件。若选用发行版的 geodata 软件包，再按第 5 步重装并重新创建链接。保留已恢复的配置与数据，然后重新启用并启动服务：

```sh
/etc/init.d/honk-core enable
/etc/init.d/honk-core start
/etc/init.d/honk-core status
```

检查[服务日志](https://doona.daeuniverse.org/zh-CN/service-management.md)，再重复下方快速开始中的 API 检查。

接着按[快速开始](https://doona.daeuniverse.org/zh-CN/quick-start.md)配置 honk 并登录。
