4. 添加新软件包

任务说明

本案例目标是将一个自定义的C语言程序(系统信息读取工具)打包为OpenWrt软件包,并安装到运行OpenWrt的设备上。你需要完成:编写程序源码、编写OpenWrt软件包Makefile、在OpenWrt源码树中构建该包、将生成的.ipk文件安装到设备。

实现步骤

1. 创建程序源码

首先创建一个简单的C程序,用于读取并打印系统基本信息(内核版本、内存总量、空闲内存)。该程序不依赖任何第三方库,仅使用标准C库和Linux系统接口。

// sysinfo.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/utsname.h>
#include <sys/sysinfo.h>

int main(void) {
    struct utsname uts;
    struct sysinfo si;

    if (uname(&uts) != 0) {
        perror("uname");
        return 1;
    }

    if (sysinfo(&si) != 0) {
        perror("sysinfo");
        return 1;
    }

    printf("Kernel: %s %s\n", uts.sysname, uts.release);
    printf("Machine: %s\n", uts.machine);
    printf("Total RAM: %lu MB\n", si.totalram * si.mem_unit / (1024 * 1024));
    printf("Free RAM: %lu MB\n", si.freeram * si.mem_unit / (1024 * 1024));

    return 0;
}

2. 编写OpenWrt软件包Makefile

在OpenWrt源码树的package/目录下创建名为sysinfo的文件夹,在其中创建Makefile。该Makefile遵循OpenWrt软件包构建规范,定义包元数据、依赖和构建规则。

# package/sysinfo/Makefile
include $(TOPDIR)/rules.mk

PKG_NAME:=sysinfo
PKG_VERSION:=1.0
PKG_RELEASE:=1

PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)

include $(INCLUDE_DIR)/package.mk

define Package/sysinfo
    SECTION:=utils
    CATEGORY:=Utilities
    TITLE:=System information reader
    DEPENDS:=+libc
endef

define Package/sysinfo/description
    A simple tool to display kernel version and memory usage.
endef

define Build/Prepare
    mkdir -p $(PKG_BUILD_DIR)
    cp ./src/sysinfo.c $(PKG_BUILD_DIR)/
endef

define Build/Compile
    $(TARGET_CC) $(TARGET_CFLAGS) -o $(PKG_BUILD_DIR)/sysinfo \
        $(PKG_BUILD_DIR)/sysinfo.c
endef

define Package/sysinfo/install
    $(INSTALL_DIR) $(1)/usr/bin
    $(INSTALL_BIN) $(PKG_BUILD_DIR)/sysinfo $(1)/usr/bin/
endef

$(eval $(call BuildPackage,sysinfo))

3. 目录结构

在OpenWrt源码树中,完整的目录结构如下:

package/sysinfo/
├── Makefile
└── src/
    └── sysinfo.c

4. 构建软件包

在OpenWrt源码根目录执行以下命令构建软件包:

make package/sysinfo/compile V=s

构建完成后,生成的.ipk文件位于bin/packages/<架构>/base/目录下,文件名类似sysinfo_1.0-1_<架构>.ipk。

5. 安装到设备

将生成的.ipk文件拷贝到OpenWrt设备上,然后执行安装命令:

opkg install sysinfo_1.0-1_*.ipk

验证方法

安装完成后,在设备终端执行以下命令验证软件包是否正常工作:

sysinfo

预期输出应包含类似以下内容(具体数值取决于设备实际状态):

Kernel: Linux 5.4.238
Machine: mips
Total RAM: 128 MB
Free RAM: 87 MB

同时可通过以下命令确认软件包已正确安装:

opkg list-installed | grep sysinfo

若输出包含sysinfo - 1.0-1,则说明安装成功。

判定标准

  • 软件包能够成功编译生成.ipk文件,无编译错误;
  • 安装到设备后,sysinfo命令可执行并正确输出系统信息;
  • 通过opkg remove sysinfo可正常卸载软件包。
OpenWrt软件包构建与安装流程 package/sysinfo/ ├── Makefile └── src/ └── sysinfo.c (源码+构建规则) OpenWrt构建系统 make package/sysinfo/ compile V=s 交叉编译工具链 TARGET_CC / TARGET_CFLAGS 生成 .ipk 文件 sysinfo_1.0-1_ mips.ipk 位于 bin/packages/ <架构>/base/ 传输到OpenWrt设备 scp sysinfo_1.0-1_*.ipk root@192.168.1.1:/tmp/ (通过SCP或U盘拷贝) 安装软件包 opkg install sysinfo_1.0-1_*.ipk (opkg包管理器) 验证执行 # sysinfo Kernel: Linux 5.4.238 | Total RAM: 128 MB | Free RAM: 87 MB