Skip to content

Latest commit

 

History

History
730 lines (530 loc) · 42.9 KB

File metadata and controls

730 lines (530 loc) · 42.9 KB

OpenWrt 制作及使用指南

English Instructions | 中文说明

使用 GitHub Actions 云编译 OpenWrt 的方法,以及本文档中的许多内容,来源于 P3TERX、Flippy 等众多技术创新者和资源分享者。感谢他们的无私奉献,让我们得以在盒子中轻松使用 OpenWrt。

GitHub Actions 是 Microsoft 推出的一项服务,提供了性能配置优良的虚拟服务器环境,可用于项目的构建、测试、打包和部署。公开仓库可免费使用,无时间限制,且单次编译时长可达 6 小时,对于编译 OpenWrt 而言完全足够(通常约 3 小时即可完成一次编译)。本文件仅为经验交流,不足之处敬请谅解,请勿在网络上发起任何不当攻击行为,也请勿恶意滥用 GitHub Actions。

目录

1. 注册自己的 Github 的账户

注册自己的账户,以便继续进行固件个性化定制操作。点击 github.com 网站右上角的 Sign up 按钮,按提示完成账户注册。

2. 设置隐私变量 GITHUB_TOKEN

根据 GitHub 文档,每个工作流作业开始时,GitHub 会自动创建唯一的 GITHUB_TOKEN 密钥以供工作流使用。可在工作流作业中通过 ${{ secrets.GITHUB_TOKEN }} 进行身份验证。

3. Fork 仓库并设置工作流权限

现在可以 Fork 仓库了。打开仓库 https://github.com/ophub/amlogic-s9xxx-openwrt ,点击右上角的 Fork 按钮,将仓库代码复制一份到自己的账户下。稍等片刻,Fork 完成后,前往自己账户下的 amlogic-s9xxx-openwrt 仓库。在右上角的 Settings > Secrets > Actions > General > Workflow permissions 下选择 Read and write permissions 并保存。图示如下:

4. 个性化 OpenWrt 固件定制文件说明

经过前面 3 步准备工作,现在开始进行个性化固件定制。config/lede_master 目录下的 3 个文件用于 OpenWrt 固件个性化定制。本章仅作最简要的说明,让您快速上手体验个性化定制的乐趣,更复杂的定制操作将在第 10 节中介绍,需要您具备一定的基础知识。

4.1 .config 文件说明

该文件是 OpenWrt 软件包个性化定制的核心文件,包含了全部配置信息。文件中的每一行代码对应一个配置选项。虽然配置项众多,但管理方法十分简单。下面开始实际操作。

4.1.1 首先让固件支持本国语言

在# National language packs, luci-i18n-base: 以法国为例,启用法语支持,就把

# CONFIG_PACKAGE_luci-i18n-base-fr is not set

修改为

CONFIG_PACKAGE_luci-i18n-base-fr=y

.config 文件中的个性化定制均可采用上述方式操作。对于不需要的项目,在行首添加 #,并将行尾的 =y 改为 is not set。对于需要的项目,去掉行首的 #,并将行尾的 is not set 改为 =y

4.1.2 选择个性化软件包

#LuCI-app: 启用和删除默认软件包的做法和上面一样,这次我们删除默认软件包里的 luci-app-zerotier 这个插件,就把

CONFIG_PACKAGE_luci-app-zerotier=y

修改为

# CONFIG_PACKAGE_luci-app-zerotier is not set

相信您已经很清楚如何进行个性化配置了。.config 文件中的每一行代表一个配置项,所有配置项均可使用上述方法启用或禁用。该文件的完整内容达数千行,此处提供的仅是精简版。如何获取完整配置文件并进行更复杂的个性化定制,将在第 10 节中介绍。

4.2 DIY脚本操作: diy-part1.sh 和 diy-part2.sh

脚本 diy-part1.sh 和 diy-part2.sh 分别在 feeds 的更新与安装前后执行。当我们引入 OpenWrt 源码库进行个性化编译时,有时需要修改源码库中的部分代码,或者添加、删除、替换某些软件包,例如修改默认 IP、主机名、主题、添加/删除软件包等。这些对源码库的修改指令可以写入这 2 个脚本中。以下以 coolsnowwolf 提供的 OpenWrt 源码库为例进行说明。

我们以下的操作都以这个源码库为基础: https://github.com/coolsnowwolf/lede

举例1,添加第三方软件包

第一步,在 diy-part2.sh 里加入以下代码:

git clone https://github.com/jerrykuku/luci-app-ttnode.git package/lean/luci-app-ttnode

第二步,到 .config 文件里添加这个第三方软件包的启用代码:

CONFIG_PACKAGE_luci-app-ttnode=y

这样就完成了第三方软件包的集成,扩充了当前源码库中没有的软件包。

举例2,用第三方软件包替换当前源码库中的已有的同名软件包

第一步,在 diy-part2.sh 里加入以下代码:用第一行代码先删除源码库中原来的软件,再用第二行代码引入第三方的同名软件包。

rm -rf package/lean/luci-theme-argon
git clone https://github.com/jerrykuku/luci-theme-argon.git package/lean/luci-theme-argon

第二步,到 .config 文件里添加第三方软件包

CONFIG_PACKAGE_luci-theme-argon=y

这样就实现了使用第三方软件包替换当前源码库中的已有的同名软件包。

举例3,通过修改源码库中的代码来实现某些需求

我们为 luci-app-cpufreq 增加对 aarch64 架构的支持,以便在我们的固件中使用(某些修改需要谨慎操作,请确保您明确了解修改的影响)。

源文件地址: luci-app-cpufreq/Makefile 。修改代码加入对 aarch64 的支持:

sed -i 's/LUCI_DEPENDS.*/LUCI_DEPENDS:=\@\(arm\|\|aarch64\)/g' package/lean/luci-app-cpufreq/Makefile

这样就完成了对源码的修改。通过 diy-part1.sh 和 diy-part2.sh 这两个脚本,我们添加了相应的操作命令,使编译出的固件更符合个性化需求。

4.3 使用 Image Builder 制作固件

OpenWrt 官方网站提供了预构建的 openwrt-imagebuilder-*-armsr-armv8.Linux-x86_64.tar.zst 文件(下载地址:https://downloads.openwrt.org/releases),可以使用官方的 Image Builder 在此文件基础上添加软件包和插件,通常只需几分钟即可生成 openwrt-rootfs.tar.gz 文件。具体制作方法请参考官方文档:使用 Image Builder

本仓库提供了一键制作服务,只需将分支参数传入 imagebuilder 脚本 即可完成制作。

  • 本地化制作命令:在 ~/amlogic-s9xxx-openwrt 根目录下执行 sudo ./config/imagebuilder/imagebuilder.sh openwrt:24.10.4 即可生成。其中参数 24.10.4 是当前可下载使用的 releases 版本号。生成的文件位于 openwrt/bin/targets/armsr/armv8 目录下。

  • 使用 github.com 的 Actions 中进行制作:Build OpenWrt with Image Builder

4.4 如何保留配置切换源码分支

OpenWrtImmortalWrt 的源码仓库均提供了多个分支,以满足不同用户的需求,主要分为快照版(Snapshot)和稳定版(Stable)。以 OpenWrt 官方仓库为例,其中的 main 分支是开发前沿的快照版,它包含了最新添加的功能和软件更新,主要面向开发者和希望体验新特性的高级用户,但其稳定性未经充分验证。而 v24.10.4 等版本号分支是稳定版,它们基于某个特定的开发节点,经过了社区的全面测试和错误修复,是官方推荐给绝大多数普通用户在生产环境中使用的版本。

如果您之前在 main 分支上已经定制了一份 .config 配置文件,并且希望切换到更稳定的 v24.10.4 分支进行编译,直接复制 .config 文件是不可行的,因为两个分支的配置选项和软件版本可能存在差异。推荐使用以下方法,它能安全地保留您的个性化设置并将其应用到新分支:

# 1. 在 main 分支下,生成配置差异文件
# 这个命令会提取出您相对于默认配置所做的所有修改。
./scripts/diffconfig.sh > myconfig.diff

# 2. 切换到 v24.10.4 稳定版分支
git checkout v24.10.4
git pull

# 3. 更新并安装新分支的 feeds
./scripts/feeds update -a
./scripts/feeds install -a

# 4. 将配置差异文件应用到新分支
# 这会成为生成完整配置的基础
cp -f myconfig.diff .config

# 5. 生成完整的 .config 文件
# 系统会基于您的差异化配置,并结合稳定版分支的默认值,生成一份完整的配置文件。
make defconfig

# 6. (重要)核对并微调配置
# 打开菜单,检查您的软件包和选项是否都已正确应用。
# 由于版本差异,某些在 main 分支中的软件包在稳定版中可能不存在,需要您手动调整。
make menuconfig

5. 编译固件

默认系统的配置信息记录在 /etc/model_database.conf 文件中,其中 BOARD 名称必须唯一。

BUILD 值为 yes 的是默认打包的盒子系统,可以直接使用。BUILD 默认值为 no 的未进行打包,使用时需要下载相同 FAMILY 的已打包系统,写入 USB 后,可在电脑上打开 USB 中的 boot 分区,修改 /boot/uEnv.txt 文件中的 FDT dtb 名称,即可适配列表中的其他盒子。

本地编译时通过 -b 参数指定,在 github.com 的 Actions 中编译时通过 openwrt_board 参数指定。使用 -b all 表示打包所有 BUILDyes 的设备。通过指定 BOARD 参数打包时,无论 BUILDyesno 均可打包,例如:-b r68s_s905x3-tx3_s905l3a-cm311

5.1 手动编译

在自己仓库的导航栏中,点击 Actions 按钮,再依次点击 Build OpenWrt > Run workflow > Run workflow,开始编译。等待约 3 小时,全部流程结束后即完成编译。图示如下:

5.2 定时编译

在 .github/workflows/build-openwrt-system-image.yml 文件里,使用 Cron 设置定时编译,5 个不同位置分别代表的意思为 分钟 (0 - 59) / 小时 (0 - 23) / 日期 (1 - 31) / 月份 (1 - 12) / 星期几 (0 - 6)(星期日 - 星期六)。通过修改不同位置的数值来设定时间。系统默认使用 UTC 标准时间,请根据你所在国家时区的不同进行换算。

schedule:
  - cron: '0 17 * * *'

5.3 使用逻辑卷扩大 Github Actions 编译空间

Github Actions 编译空间默认为 84G,扣除系统和必要软件包后,可用空间约 50G。编译全部固件时可能遇到空间不足的问题,可以通过逻辑卷将编译空间扩展至约 110G。参考 .github/workflows/build-openwrt-system-image.yml 文件中的方法,使用以下命令创建逻辑卷,并在编译时使用逻辑卷的路径。

- name: Create simulated physical disk
  run: |
    mnt_size=$(expr $(df -h /mnt | tail -1 | awk '{print $4}' | sed 's/[[:alpha:]]//g' | sed 's/\..*//') - 1)
    root_size=$(expr $(df -h / | tail -1 | awk '{print $4}' | sed 's/[[:alpha:]]//g' | sed 's/\..*//') - 4)
    sudo truncate -s "${mnt_size}"G /mnt/mnt.img
    sudo truncate -s "${root_size}"G /root.img
    sudo losetup /dev/loop6 /mnt/mnt.img
    sudo losetup /dev/loop7 /root.img
    sudo pvcreate /dev/loop6
    sudo pvcreate /dev/loop7
    sudo vgcreate github /dev/loop6 /dev/loop7
    sudo lvcreate -n runner -l 100%FREE github
    sudo mkfs.xfs /dev/github/runner
    sudo mkdir -p /builder
    sudo mount /dev/github/runner /builder
    sudo chown -R runner.runner /builder
    df -Th

6. 保存固件

固件保存的设置同样在 .github/workflows/build-openwrt-system-image.yml 文件中控制。编译好的固件将通过脚本自动上传至 GitHub 官方提供的 Actions 和 Releases,或上传至第三方平台(如 WeTransfer)。

目前 GitHub Actions 的最长保存期为 90 天,Releases 为永久保存,第三方平台如 WeTransfer 为 7 天。首先感谢这些服务商提供的免费支持,也请各位节约使用,提倡合理利用免费服务。

6.1 保存到 Github Actions

- name: Upload artifact to Actions
  uses: kittaakos/upload-artifact-as-is@master
  if: ${{ steps.build.outputs.status }} == 'success' && env.UPLOAD_FIRMWARE == 'true' && !cancelled()
  with:
    path: ${{ env.FILEPATH }}/

6.2 保存到 GitHub Releases

- name: Upload OpenWrt Firmware to Release
  uses: ncipollo/release-action@main
  if: ${{ env.PACKAGED_STATUS }} == 'success' && !cancelled()
  with:
    tag: openwrt_amlogic_s9xxx_lede_${{ env.PACKAGED_OUTPUTDATE }}
    artifacts: ${{ env.PACKAGED_OUTPUTPATH }}/*
    allowUpdates: true
    token: ${{ secrets.GITHUB_TOKEN }}
    body: |
      This is OpenWrt firmware for Amlogic s9xxx tv box
      * Firmware information
      Default IP: 192.168.1.1
      Default username: root
      Default password: password
      Default WIFI name: OpenWrt
      Default WIFI password: none
      Install to EMMC: Login to OpenWrt → System → Amlogic Service → Install OpenWrt

6.3 保存到第三方

- name: Upload OpenWrt Firmware to WeTransfer
  if: ${{ steps.build.outputs.status }} == 'success' && env.UPLOAD_WETRANSFER == 'true' && !cancelled()
  run: |
    curl -fsSL git.io/file-transfer | sh
    ./transfer wet -s -p 16 --no-progress ${{ env.FILEPATH }}/{openwrt_s9xxx_*,openwrt_n1_*} 2>&1 | tee wetransfer.log
    echo "WET_URL=$(cat wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_ENV

7. 下载固件

下载已编译并上传至相关存储位置的 OpenWrt 固件。

7.1 从 Github Actions 下载

点击仓库导航栏中的 Actions 按钮,在 All workflows 列表中,点击已编译完成的固件列表,选择与自己盒子型号对应的固件进行下载。图示如下:

7.2 从 Github Releases 下载

从仓库首页右下角的 Release 版块进入,选择和自己盒子型号对应的固件。图示如下:

7.3 从第三方下载

在 .github/workflows/build-openwrt-system-image.yml 文件中,默认已关闭上传至第三方的选项。如需启用,将 false 改为 true,下次编译完成后就会自动上传至第三方。第三方的地址可以在固件编译流程的日志中查看,也可以输出到编译信息中。

UPLOAD_COWTRANSFER: false
UPLOAD_WETRANSFER: false

上传至第三方的功能来自 https://github.com/Mikubill/transfer ,如需要,可以根据其说明添加更多第三方支持(请节制使用,避免浪费过多免费资源)。图示如下:

8. 安装 OpenWrt

8.1 在编译时集成 luci-app-amlogic 操作面板

  1. 获得 luci-app-amlogic 源码,把源码放到 package 目录下,方法如下:
rm -rf package/luci-app-amlogic
git clone https://github.com/ophub/luci-app-amlogic.git package/luci-app-amlogic
  1. 在执行 menuconfig 后,可以选择插件 LuCI ---> 3. Applications ---> <*> luci-app-amlogic

插件的更多说明详见:https://github.com/ophub/luci-app-amlogic

8.2 使用操作面板安装

  1. Rockchip 平台的安装方法请查看说明文档中的 第 8 章节 的介绍,和 Armbian 的安装方法相同。

  2. AmlogicAllwinner 平台,使用 Rufus 或者 balenaEtcher 等工具将固件写入 USB 里,然后把写好固件的 USB 插入盒子。从浏览器访问 OpenWrt 的默认 IP: 192.168.1.1 → 使用默认账户登录进入 OpenWrt系统菜单晶晨宝盒安装 OpenWrt

8.3 安装 Docker 版本的 OpenWrt

可以在 Ubuntu/Debian/Armbian 等系统中使用 Docker 版本的 OpenWrt 镜像。这些镜像托管在 Docker Hub 上,可直接下载使用。

8.3.1 安装 Docker 运行环境

以下以 Ubuntu 系统为例,使用如下命令安装 Docker 运行环境:

curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
sudo newgrp docker

8.3.2 设置 macvlan 网络

# 查看已有的 docker 网络是否包含 macvlan 网络
docker network ls

# 如果没有 macvlan 网络,则创建 macvlan 网络
# 其中的网段、网关和网卡名称根据自己的实际网络修改
docker network create -d macvlan \
    --subnet=10.1.1.0/24 \
    --gateway=10.1.1.1 \
    -o parent=eth0 \
    macvlan

8.3.3 运行 OpenWrt Docker 容器

# 以后台方式运行 OpenWrt 容器
docker run -d --name=openwrt \
    --network macnet \
    --privileged \
    --restart always \
    ophub/openwrt-armv8:latest

# 查看 OpenWrt 容器日志
docker logs -f openwrt

# 进入 OpenWrt 容器
docker exec -it openwrt bash

# 修改 IP、网关、DNS等
# 修改完成后按 ESC 键,并输入 :wq! 保存修改结果
vi /etc/config/network
# 重启网络服务
/etc/init.d/network restart

# 退出 OpenWrt 容器
exit

# 停止并删除 OpenWrt 容器
docker rm -f openwrt

9. 升级 OpenWrt 系统或内核

通过浏览器访问 OpenWrt 系统,在 系统 菜单下选择 晶晨宝盒,通过 升级 OpenWrt 固件更换 OpenWrt 内核 功能进行升级。(支持从高版本如 5.15.50 降级到低版本如 5.10.125,也支持从低版本如 5.10.125 升级到高版本如 5.15.50。内核版本号的高低不影响升级操作,可自由升级/降级)。

[SOS]:因特殊原因导致的内核更新不完整等问题,造成系统无法从 eMMC/NVMe/sdX 启动时,可以从 USB 等其他磁盘启动任意内核版本的 OpenWrt 系统,在 系统菜单 > 晶晨宝盒 > 在线下载更新 > 救援内核 里进行内核救援,恢复原系统的正常使用;也可以在 TTYD 终端 里使用 openwer-kernel -s 命令进行内核救援。不指定磁盘参数时,默认将从 USB 设备恢复 eMMC/NVMe/sdX 中的内核,如果设备有多个磁盘,可以准确指定需要恢复的磁盘名称,举例如下:

# 恢复 eMMC 中的内核
openwer-kernel -s mmcblk1

# 恢复 NVMe 中的内核
openwer-kernel -s nvme0n1

# 恢复移动存储设备中的内核
openwer-kernel -s sda

# 磁盘名称可以简写为 mmcblk0/mmcblk1/nvme0n1/nvme1n1/sda/sdb/sdc 等,也可以使用完整的名称,如 /dev/sda
openwer-kernel -s /dev/sda

# 当设备只有 eMMC/NVMe/sdX 中的一个内置存储时,可以省略磁盘名称参数
openwer-kernel -s

10. 个性化固件定制晋级教程

如果您已经按照教程学习到这一步,相信您已经掌握了基本用法。但继续深入探索,将开启一段丰富的折腾之旅。您会遇到许多问题,这需要您做好持续探索的心理准备,善于借助搜索引擎解决问题,并花一些时间在 OpenWrt 社区中学习。

10.1 认识完整的 .config 文件

使用 OpenWrt 官方源码库或其他分支源码库进行一次本地化编译。例如选择 https://github.com/coolsnowwolf/lede 源码库,按照其编译说明在本地安装 Ubuntu 系统,部署环境并完成本地编译。在本地编译配置界面中,您还可以看到大量详细的说明,这将加深您对 OpenWrt 编译过程的理解。

完成 OpenWrt 个性化配置后,保存并退出配置界面,您可以在本地 OpenWrt 源码库的根目录下找到 .config 文件(在源码库根目录下执行 ls -a 命令可查看所有隐藏文件)。您可以将该文件直接上传至 github.com 中您的仓库,替换 config/lede_master/config 文件。

10.2 认识 workflow 文件

GitHub官方给出了详细的说明,关于 GitHub Actions 的使用方法,你可以从这里开始认识它: GitHub Actions 快速入门

让我们以现在仓库中正在使用的这个编译流程控制文件为例简单介绍下: build-openwrt-system-image.yml

10.2.1 更换编译源码库的地址和分支

#在第 63 行: 是指定 OpenWrt 编译源码的地址
REPO_URL: https://github.com/coolsnowwolf/lede

#在第 64 行: 是指定分支的名称
REPO_BRANCH: master

你可以修改成其他源码库的地址,如采用官方的源码库,使用其 openwrt-21.02 分支:

REPO_URL: https://github.com/openwrt/openwrt
REPO_BRANCH: openwrt-21.02

10.2.2 更改盒子的型号和内核版本号

在第 139 行附近, 查找标题为 Build OpenWrt firmware 的编译步骤, 其代码块类似这样:

- name: Build OpenWrt firmware
  if: ${{ steps.compile.outputs.status }} == 'success' && !cancelled()
  uses: ophub/amlogic-s9xxx-openwrt@main
  with:
    openwrt_path: openwrt/bin/targets/*/*/*rootfs.tar.gz
    openwrt_board: ${{ inputs.openwrt_board }}
    openwrt_kernel: ${{ inputs.openwrt_kernel }}
    auto_kernel: ${{ inputs.auto_kernel }}
    openwrt_size: ${{ inputs.openwrt_size }}

参考打包命令的相关参数说明。以上设置选项可以通过写入固定值来设置,也可以通过 Actions 面板进行选择:

10.3 自定义 banner 信息

默认的 /etc/banner 信息如下,你可以使用 banner 生成器 定制专属自己的个性化 banner 信息(下面的样式为 slant)。使用 10.5.2 的方法可以在制作 OpenWrt 时添加自定义 banner 以及其他 OpenWrt 文件。

     ____                 _       __     __        __    ___    ____
    / __ \____  ___  ____| |     / /____/ /_      / /   /   |  / __ )
   / / / / __ \/ _ \/ __ \ | /| / / ___/ __/     / /   / /| | / __  |
  / /_/ / /_/ /  __/ / / / |/ |/ / /  / /_      / /___/ ___ |/ /_/ /
  \____/ .___/\___/_/ /_/|__/|__/_/   \__/     /_____/_/  |_/_____/
      /_/ H E L L O - W O R L D   @   W I R E L E S S - F R E E D O M
───────────────────────────────────────────────────────────────────────

10.4 自定义 feeds 配置文件

当您查看源码库中的 feeds.conf.default 文件时,会发现它引入了许多软件包源码库。没错,在 GitHub 上不仅可以找到 OpenWrt 官方提供的源码库,还有很多人分享的 OpenWrt 分支及软件包。如果您熟悉这些资源,可以在此处添加。例如 coolsnowwolf 源码库中的 feeds.conf.default

10.5 自定义 OpenWrt 默认配置文件

10.5.1 第一种方法是在编译时添加自定义文件

在使用 OpenWrt 的过程中,很多软件已经进行了配置,这些配置信息大部分保存在 OpenWrt 的 /etc/config/ 等相关目录下。将这些配置文件复制到 GitHub 仓库根目录下的 files 文件夹中,请保持目录结构和文件名称一致。在 OpenWrt 编译时,这些配置文件将会被编译到固件中。具体做法在 .github/workflows/build-openwrt-system-image.yml 文件中,如下所示:

- name: Load custom configuration
  run: |
    [[ -d "files" ]] && mv -f files openwrt/files
    [[ -e "${CONFIG_FILE}" ]] && cp -f ${CONFIG_FILE} openwrt/.config
    chmod +x ${DIY_P2_SH}
    cd openwrt
    ${GITHUB_WORKSPACE}/${DIY_P2_SH}

请勿复制涉及隐私的配置文件。如果您的仓库是公开的,files 目录中的文件同样会公开,切勿泄露敏感信息。密码等信息可以使用您在 GitHub Actions 快速入门中学到的私钥设置等方法进行加密。请确保您了解自己在做什么。

10.5.2 第二种方法是在打包时添加自定义文件

使用 ophub 打包 OpenWrt 时,使用 openwrt_files 参数可以添加或覆盖自定义文件到 ophub 的 common-files 目录。目录结构必须与 OpenWrt 根目录保持一致,以确保文件被正确覆盖到固件中(例如:默认配置文件应存放于 etc/config/ 子目录下)。设置方法举例:

- name: Packaging OpenWrt
  uses: ophub/amlogic-s9xxx-openwrt@main
  with:
    openwrt_path: openwrt/output/*rootfs.tar.gz
    openwrt_files: files
    ...

10.6 Opkg 软件包管理

与大多数 Linux 发行版(或移动设备操作系统,如 Android 或 iOS)类似,可以通过从软件包存储库(本地或网络)下载并安装软件包来扩展系统功能。opkg 实用程序是专为嵌入式设备固件设计的轻量级软件包管理器。Opkg 是用于根文件系统的完整软件包管理器,支持内核模块和驱动程序。opkg 会尝试解析存储库中软件包的依赖关系,如果失败,将报告错误并中止安装。第三方软件包可能缺少依赖项,可从软件包的来源获取。若要忽略依赖错误,请使用 --force-depends 参数。

  • 如果您使用的是快照/主干/最新版本,当存储库中软件包所使用的内核版本新于您当前的内核版本时,安装软件包可能会失败,并收到类似 无法满足以下依赖关系…… 的错误信息。因此,强烈建议在 OpenWrt 固件编译时直接集成所需的软件包。

  • 非 openwrt.org 官方插件,如 luci-app-uugameboosterluci-app-xlnetacc 等,需要在固件编译时直接集成。这些软件包无法通过 opkg 从镜像服务器直接安装,但您可以手动上传这些软件包到 OpenWrt 并使用 opkg 进行安装。

  • 在主干/快照上时,内核和kmod软件包被标记为保留,opkg upgrade 命令将不会尝试更新它们。

Common commands:

opkg update                                       #更新可用的软件包列表
opkg upgrade <pkgs>                               #升级软件包
opkg install <pkgs>                               #安装软件包
opkg install --force-reinstall <pkgs>             #强制重新安装软件包
opkg configure <pkgs>                             #配置未打包的软件包
opkg remove <pkgs | regexp>                       #移除软件包
opkg list                                         #列出可用的软件包
opkg list-installed                               #列出已经安装的软件包
opkg list-upgradable                              #列出已安装和可升级的软件包
opkg list | grep <pkgs>                           #查找与关键字匹配的软件包

更多帮助请查阅 opkg

10.7 使用 Web 界面管理软件包

将 OpenWrt 固件安装到设备后,可以通过 Web 界面安装其他软件包。

  1. 登录 OpenWrt → 系统软件包
  2. 点击 刷新列表 按钮进行更新
  3. 填写 过滤器 字段,然后单击 查找软件包 按钮以搜索特定的软件包
  4. 切换到 可用软件包 选项卡以显示可以安装的软件包
  5. 切换到 已安装的软件包 选项卡以显示和删除已安装的软件包

如果要使用 LuCI 配置服务,请搜索并安装 luci-app-* 软件包。

更多帮助请查阅 packages

10.8 如何恢复原安卓 TV 系统

通常使用 openwrt-ddbr 对设备的安卓 TV 系统进行备份和恢复。

除此之外也可以通过线刷的方法,将安卓系统刷入 eMMC 中,安卓系统的下载镜像可在 Tools 中查找。

10.8.1 使用 openwrt-ddbr 备份恢复

建议您在全新的盒子里安装 OpenWrt 系统前,先对当前盒子自带的原安卓 TV 系统进行备份,以便在需要恢复系统时使用。请从 TF/SD/USB 启动 OpenWrt 系统,输入 openwrt-ddbr 命令,然后根据提示输入 b 进行系统备份,备份文件的存放路径为 /ddbr/BACKUP-arm-64-emmc.img.gz ,请下载保存。在需要恢复安卓 TV 系统时,将之前备份的文件上传至 TF/SD/USB 设备的相同路径下,输入 openwrt-ddbr 命令,然后根据提示输入 r 进行系统恢复。

10.8.2 使用 Amlogic 刷机工具恢复

  • 一般情况下,重新插入电源,如果可以从 USB 中启动,只要重新安装即可,多试几次。

  • 如果接入显示器后,屏幕是黑屏状态,无法从 USB 启动,就需要进行盒子的短接初始化了。先将盒子恢复到原来的安卓系统,再重新刷入 OpenWrt 系统。首先下载 amlogic_usb_burning_tool 系统恢复工具并安装好。准备一条 USB 双公头数据线,准备一个 曲别针

  • 以 x96max+ 为例,在盒子的主板上确认 短接点 的位置,下载盒子的 Android TV 固件包。其他常见设备的安卓 TV 系统固件及对应的短接点示意图也可以在此下载查看

操作方法:

1. 打开刷机软件 USB Burning Tool:
   [ 文件 → 导入固件包 ]: X96Max_Plus2_20191213-1457_ATV9_davietPDA_v1.5.img
   [ 选择 ]:擦除 flash
   [ 选择 ]:擦除 bootloader
   点击 [ 开始 ] 按钮
2. 使用 [ 曲别针 ] 将盒子主板上的 [ 两个短接点进行短接连接 ],
   并同时使用 [ USB 双公头数据线 ] 将 [ 盒子 ] 与 [ 电脑 ] 进行连接。
3. 当看到 [ 进度条开始走动 ] 后,拿走曲别针,不再短接。
4. 当看到 [ 进度条 100% ], 则刷机完成,盒子已经恢复成 Android TV 系统。
   点击 [ 停止 ] 按钮, 拔掉 [ 盒子 ] 和 [ 电脑 ] 之间的 [ USB 双公头数据线] 。
5. 如果以上某个步骤失败,就再来一次,直至成功。
   如果进度条没有走动,可以尝试插入电源。通长情况下不用电源支持供电,只 USB 双公头的供电即可满足刷机要求。

当完成恢复出厂设置,盒子已经恢复成 Android TV 系统,其他安装 OpenWrt 系统的操作,就和你之前第一次安装系统时的要求一样了,再来一遍即可。

10.9 在安装了主线 u-boot 后无法启动

  • 极少数设备选择写入主线 u-boot 后可能会无法启动,在显示器中看到的提示为 => 符号结尾的一段代码。这时你需要在 TTL 上焊接一个 5-10 K 的上拉或下拉电阻,解决盒子容易受周围电磁信号干扰而导致无法启动的问题,焊接电阻后就可以从 EMMC 启动了。

如果你选择安装了主线 u-boot 并且无法启动,请将盒子接入屏幕,查看是否为这样的提示:

Net: eth0: ethernet0ff3f0000
Hit any key to stop autoboot: 0
=>

如果你的现象如上所示,那么你需要在 TTL 上焊接一个电阻了: X96 Max Plus's V4.0 主板示意图

#######################################################           #####################################################
#                                                     #           #                                                   #
#   上拉电阻: 在 TTL 的 RX 和 GND 之间焊接                #           #   下拉电阻: 在 TTL 的 3.3V 和 RX 之间焊接            #
#                                                     #           #                                                   #
#            3.3V   RX       TX       GND             #     OR    #        3.3V               RX     TX     GND       #
#                    ┖————█████████————┚              #           #         ┖————█████████————┚                       #
#                      上拉电阻(5~10K)                #           #            下拉电阻 (5~10K)                        #
#                                                     #           #                                                   #
#######################################################           #####################################################

10.10 设置盒子从 USB/TF/SD 中启动

根据自己盒子的情况,分别使用初次安装和重新安装 OpenWrt 系统的两种方法。

10.10.1 初次安装 OpenWrt 系统

  • 把刷好固件的 USB/TF/SD 插入盒子。
  • 开启开发者模式: 设置 → 关于本机 → 版本号 (如: X96max plus...), 在版本号上快速连击 5 次鼠标左键, 看到系统显示 开启开发者模式 的提示。
  • 开启 USB 调试模式: 系统 → 高级选选 → 开发者选项 (设置 开启USB调试 为启用)。启用 ADB 调试。
  • 安装 ADB 工具:下载 adb 并解压,将 adb.exeAdbWinApi.dllAdbWinUsbApi.dll 三个文件拷⻉到 c://windows/ 目录下的 system32syswow64 两个文件夹内,然后打开 cmd 命令面板,使用 adb --version 命令,如果有显示就表示可以使用了。
  • 进入 cmd 命令模式。输入 adb connect 192.168.1.137 命令(其中的 ip 根据你的盒子修改,可以到盒子所接入的路由器设备里查看),如果链接成功会显示 connected to 192.168.1.137:5555
  • 输入 adb shell reboot update 命令,盒子将重启并从你插入的 USB/TF/SD 启动,从浏览器访问固件的 IP 地址,或者 SSH 访问即可进入固件。
  • 登录 OpenWrt 系统: 将你的盒子与电脑进行直连 → 关闭电脑的 WIFI 选项,只使用有线网卡 → 将有线网卡的网络设置为和 OpenWrt 相同的网段,如果 OpenWrt 的默认 IP 是: 192.168.1.1 ,你可以设置电脑的 IP 为 192.168.1.2 ,子网掩码设置为 255.255.255.0, 除这 2 个选项外,其他选项不用设置。你就可以从浏览器进入 OpwnWrt 了,默认 IP : 192.168.1.1, 默认账号: root, 默认密码: password

10.10.2 重新安装 OpenWrt 系统

  • 正常情况下,直接把刷写好 OpenWrt 的 U 盘插入 USB 即可直接从 U 盘中启动。USB 启动比 eMMC 具有优先启动权。
  • 个别设备可能出现无法从 U 盘启动的现象,可以先把 eMMC 里 OpenWrt 系统 /boot 目录下的 boot.scr 文件改个名字,例如 boot.scr.bak,然后再插入 U 盘启动,这样就可以从 U 盘启动了。

10.11 OpenWrt 必选项

此列表以 unifreq 的开发指南为基础进行整理。为保障安装/更新等脚本在 OpenWrt 中可以正常运行,当使用 make menuconfig 进行配置时,需要添加以下必选项:

Target System  -> Arm SystemReady (EFI) compliant
Subtarget      -> 64-bit (armv8) machines
Target Profile -> Generic EFI Boot
Target Images  -> tar.gz

OR

Target System  -> QEMU ARM Virtual Machine
Subtarget      -> QEMU ARMv8 Virtual Machine (cortex-a53)
Target Profile -> Default
Target Images  -> tar.gz


Kernel modules -> Wireless Drivers -> kmod-brcmfmac(SDIO)
                                   -> kmod-brcmutil
                                   -> kmod-cfg80211
                                   -> kmod-mac80211


Languages -> Perl
             -> perl-http-date
             -> perlbase-file
             -> perlbase-getopt
             -> perlbase-time
             -> perlbase-unicode
             -> perlbase-utf8
          -> Python
             -> Python3-ctypes
             -> Python3-logging
             -> Python3-yaml


Network -> File Transfer -> curl、wget-ssl
        -> Version Control Systems -> git
        -> WirelessAPD   -> hostapd-common
                         -> wpa-cli
                         -> wpad-mesh-openssl
        -> iw


Utilities -> Compression -> bsdtar、pigz
          -> Disc -> blkid、fdisk、lsblk、parted
          -> Editors -> nano、vim
          -> Filesystem -> attr、btrfs-progs(Build with zstd support)、chattr、dosfstools、
                           e2fsprogs、f2fs-tools、f2fsck、lsattr、mkf2fs、xfs-fsck、xfs-mkfs
          -> Shells -> bash
          -> Time Zone info -> zoneinfo-america、zoneinfo-asia、zoneinfo-core、zoneinfo-europe (other)
          -> acpid、coremark、coreutils(-> coreutils-base64、coreutils-dd、coreutils-df、coreutils-nohup、
             coreutils-tail、coreutils-timeout、coreutils-touch、coreutils-tr、coreutils-truncate)、
             gawk、getopt、jq、lm-sensors、losetup、pv、tar、uuidgen