概述
如果您熟悉Linux类系统,那么OpenWrt对于您就非常简单。如果您不熟悉,那我们就需要首先从一些基础概念开始。
您应该已经知道OpenWrt是一个针对嵌入式设备的Linux发行版,Linux“发行版“是一个通过创建和维护一些软件包实现根据用户需求来定制Linux系统的项目。一个”软件包“是包含一个应用程序或一些脚本的压缩档案,其配置文件中还包含了用于将其集成到操作系统中的信息。软件包可被一个能够下载、打开、安装、卸载的应用程序——包管理器(OpenWrt中为opkg)处理。所以,一个OpenWrt固件是一些围绕Linux内核的软件包组装而成。
每个软件包都被独立进行编译,当软件包编译完成后,所需的软件包都被“安装”在一个临时文件夹中。其后,该文件夹会被压缩并变为设备固件的只读压缩分区(squashfs)。
内核也被当作一个软件包处理,但却通过特殊的方式添加到固件映像中以便设备的引导程序可以发现它。所以,您可以在不触及设备的引导程序(比较危险而且不是总是可行)的情况下替换设备原版的固件。
构建程序的最后一步才是生成一个固件文件(也就是您用于安装或升级OpenWrt的文件),这个文件通常是一个准备写入内置闪存储存装置磁盘映像,所以您会发现许多开发人员在IRC或邮件列表称其为“映像”。
如何编译软件包
如果您查看一个软件包的Makefile(用于定义设置以构建一个特殊软件包,详见https://github.com/openwrt/openwrt/blob/master/package/utils/busybox/Makefile),您会发现它指出了将被编译源码的官方下载链接,一个SHA256哈希值和两个版本号(一个给上游,一个给OpenWrt)用以检验下载的完整性。另外一些软件包会声明git提交/时间戳或使用其他方式以便检验下拉和构造来自同一源。他们一般都主张根据官方发布源来获得档案,但一些上游项目并不总是有。
在每个软件包文件夹下的/patches文件夹中,您可以发现任何已下载未编译并将应用于源的补丁(详见https://github.com/openwrt/openwrt/tree/master/package/utils/busybox/patches),还有用于存放配置文件或Luci集成(并不总是存在)的其他文件夹。
内核的makefile(详见https://github.com/openwrt/openwrt/blob/master/package/kernel/linux/Makefile)由于种种原因要复杂一点,但您可以看到它仍采用了相同的结构,每次均采用相同的内核版本。
所有软件包均通过OpenWrt自有的工具链进行编译,其本也被当作软件包处理。(详见源码中/toolchain和/tools文件夹),所以只要从同一版本同一源下载,您将拥有与其他人一样的编译器/工具。
当您在OpenWrt构造系统中运行一个 make 命令将首先使用您系统中已有基础设施来编译OpenWrt的工具链,然后使用工具链来编译软件包。这样做的主要好处是无需用户去创建一个相当恼人又相对复杂的交叉编译工具链。
软件包feeds
您能在OpenWrt中正确安装的软件包不是所有都来来自OpenWrt项目,其实大多数包都不是。
OpenWrt主资源库中的软件包(它们更重要,甚至是OpenWrt固件必不可少的组成部分,或者构建系统的部件)由核心开发人员直接维护,而”package feeds“是包含了额外软件包的源,是由社区成员维护(每个软件包都有自己的维护者)
OpenWrt的主资源库在github的https://github.com/openwrt/openwrt页面。
以下是官方软件包的feeds:
一旦成为”官方feeds”,软件包将被官方下载服务器编译并提供下载,但严格来讲它们不是OpenWrt的财产,它们是社区维护的。
“软件包feed”系统被设计可以方便的为自己定制的固件映像添加自己定制的feeds,只是您需要将其编译并在自己的服务器上提供它们。
如果您在下载服务器上查看已构建的软件包(在运行中的OpenWrt系统中,opkg也使用该服务器用来下载软件包) https://downloads.openwrt.org/releases/18.06.1/packages/x86_64/
它们通过feed进行区分,“base”下的软件包来自主资源库,同时也是您从设备特定目录获得软件包的主资源库,诸如https://downloads.openwrt.org/releases/18.06.1/packages/x86_64/packages/这样的链接,您看到的大多是kmod-*和其他驱动。
软件包版本号
正如上面所说,软件包的makefiles中有PKG_VERSION来展示上游版本号(即大版本号),PKG_RELEASE(即小版本号)则用于表现OpenWrt的变化。如果您的一个软件包版本号为123-1,则其大版本号为123,小版本号为1。
软件包的时间戳用于替代主版本号,仍然有次版本号。例如2016-09-21-42ad5367-1中的最后一个“1”就是小版本号.
您可以在table of packages的第一页查看所有已使用的版本号。
或浏览软件包下载文件夹中的Package.manifest(详见:https://downloads.openwrt.org/releases/18.06.1/packages/mips_24kc/base/Packages.manifest)
可重复构建
以上多数系统都允许重复构建,源码存档或提交的哈希值和时间戳将会被写入git库(不论是主资源库还是社区软件包feeds)中软件包的makefile中,您可以使用git查看该文件的所有历史变更记录。
有一台缓存服务器用于存储源码归档,这样相比构建机器人向上游下载服务器滥发更方便,而且当上游下载服务器消失时,它也是一个备份。它交存储源软件包一段时间(只要版本确认被支持,因为构建机器人会使用它)。