type
status
date
slug
summary
tags
category
icon
password
根据已有文件进行环境配置与交叉编译,最终实现将监测程序挂载到实际路由器H3C Magic NX30 Pro上运行。
前置工作
安装编译所需工具和依赖
在ubuntu终端上输入以下命令,完成更新和安装。
build-essential | 编译工具包的元宝,包含make、gcc |
clang | c/c++等语言的编译器前端 |
flex | 生成词法分析器 |
bison | 生成语法分析器 |
g++ | GNU的c++编译器 |
gawk | 文本处理工具,可以实现提取特征字段、计算数据等功能 |
gcc/++ -multilib | 允许用户在64位系统上编译32位的程序 |
gettext | 实现消息文本不同语言的翻译 |
libncurses5 -dev | 提供图形化界面的开发库 |
libssl -dev | 可以支持OpenSSL的加密功能,如 SSL/TLS 协议、加密算法 |
python3 - setuptools | 构建和安装Python包,提供自动生成setup脚本、管理依赖关系等 |
rsync | 用于在本地或远程主机之间同步文件和目录 |
swig | 提供将现有的 C/C + + 库封装成可以被其他语言调用的包 |
unzip | 解压工具 |
zlib1g - dev | 压缩库的开发包 |
这部分完成后,后续编译会使用到。
Linux环境下加速访问github
由于后续SDK是在github仓库获取更新,直接访问的连接不太稳定,且下载速度较慢,故利用Clash配置VPN,节省下载时间。
下载安装Clash
clash下载地址: 下载地址,ubuntu22.04以及以上版本选择如下:

解压安装
编写配置文件
配置文件需要修改为
config.yaml
后放到 `~/.config/clash/config.yaml,根据自己的订阅网址找到配置文件,复制粘贴即可。终端代理
默认终端不会启用代理,需要手动配置:
或者临时配置代理:仅当前运行窗口有效:
网络代理
ubuntu打开设置→网络,更改“网络代理”为“手动”,填写代理配置信息:
代理管理
浏览器进入 http://clash.razord.top/#/proxies 页面可以进行代理管理,
图形化界面中可以切换和详细配置,查看日志等。
Openwrt虚拟机运行程序编译
固件编译
除了直接使用官方提供的镜像外,还可以通过源码自行编译镜像,
在终端输入配置以下命令:
- 如果下载速度缓慢,打开网络代理
make menuconfig
命令执行后进入一个图形化窗口,主要关注 Target System , Subtarget 和 Target Profile 这三项:

比如在我的openwrt虚拟机上,选择为x86_64架构,Generic x86_64。
保存配置后退出,开始编译镜像,
- 如果是ubuntu执行
make
;
- WSL则需要声明环境变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin make
- 待编译完成后在 ./bin/target 下可以找到对应镜像,文件可以直接写入到路由器的存储设备中(如闪存)或者VM中来安装和运行 OpenWrt 系统
一般来说不会直接编译整个openwrt的包,因为对配置和时间要求比较高,大部分情况下建议直接下载官方镜像,安装openwrt系统。
这里仅作演示使用,在我实际开发过程中还是使用的编译后的镜像。
SDK编译源程序
- OpenWrt的SDK(Software Development Kit,软件开发工具包)是专门为开发和编译OpenWrt额外软件包而准备的一套集成工具和环境。(更侧重于用户的应用开发)
- SDK包含交叉编译工具链、头文件、Makefile 框架等,用户可以在本地直接编译 OpenWrt 支持的软件包。
- SDK版本和 OpenWrt 固件版本是配套的,编译出来的包能确保兼容现在的系统,避免因 ABI 不一致导致的各种“无法安装”问题。
对于实际Openwrt虚拟机的SDK,我的为x86_64架构:SDK下载地址
编译打包
下载后解压:
解压后将项目源代码的文件包放入SDK的package目录,得到以下目录结构:
其中Makefile文件规定了编译规则,内容如下:
注意Makefile文件一定要用TAB,而不是两个空格,否则编译时会报错;
同时中文注释的编码格式也有可能引起报错。
下来回到目录 openwrt-sdk-24.10.0-mediatek-filogic_gcc-13.3.0_musl.Linux-x86_64/ 下,执行命令:
执行make后会弹出一个类似
make menuconfig
的图形化配置窗口,注意global settings,advanced configuation options,libraries,base system配置。



编译打包时注意最好使用
-j=1
单线程,避免多个线程之间相互依赖报错,造成报错信息混乱。成功编译后,在/bin/package/x86_64/base里面找到相应.ipk文件:

上传运行
通过共享文件夹方式,上传lab2和libpcap程序包到Openwrt虚拟机,然后安装:

选择对应端口后可以看到,程序终端正确执行了流量监测的任务。
路由器H3C Magic NX30 Pro中运行程序编译
固件下载
在官网https://firmware-selector.openwrt.org/下搜索设备对应的固件

下载得到如下文件,即图中1,2,4项目:

将文件 openwrt-24.10.0-mediatek-filogic-h3c_magic-nx30-pro-initramfs-recovery.itb 重命名为 openwrt-mediatek-filogic-h3c_magic-nx30-pro-initramfs-recovery.itb
连接路由器
该款路由器(H3C Magic NX30 Pro)默认开启了telnet服务.
首先进入路由器管理网页设置登录密码。随后通过该密码与用户名 H3C 使用telnet服务进入路由器后台(telnet端口为99)
开启SSH服务
按照以下步骤开启 SSH:
固件备份
查看分区信息:
重点备份ubi、factory、pdt_data、plugin这几个分区
备份后使用scp命令传出并删除文件,避免存储空间不足。
OpenWrt 刷入
将前文下载的文件 openwrt-24.10.1-mediatek-filogic-h3c_magic-nx30-pro-bl31-uboot.fip 传入路由器中,使用 winscp 工具。
写入uboot:
随后需要将其刷入 kernel。先将路由器断电,按住背后 Reset 按钮不放,再插电,等待 10s 左右进入uboot。
接着使用 PC 机用网线连接到路由器的 LAN 口。在网络设置中将本机的IP设置为 192.168.1.X
,网关设置为 192.168.1.1。
交叉编译配置
下载SDK并构建项目目录
在下载地址中下载该路由器版本的cortex_a53架构SDK,解压后进入目录,传入之前写好的lab2源程序包,依然得到如下结构:
交叉编译软件包
先更新并安装依赖项:
编写的Makefile文件如下:
在/openwrt-sdk-24.10.0-mediatek-filogic_gcc-13.3.0_musl.Linux-x86_64/feeds/base/package/boot/uboot-mediatek文件目录下找到自带的Makefile,修改第838行的目标设备,指定为本型号路由器:
这是Openwrt的软件包BUG,如果不修改指定对应设备,编译时会一直尝试查找设备,进入如下死循环:

然后执行交叉编译:
编译后查看对应文件属性,确认是我们想要的架构的文件格式:

内存优化与传输运行
通过ubuntu和windows的共享文件夹和以及Openwrt和windows间的scp,上传对应编译后的软件包到/temp(临时)目录:

尝试安装libpcap时发现操作系统内存不足:

通过查看并删除不必要的大型文件,实现内存优化:
然后重新安装,移动可执行程序到系统目录usr/sbin/中稳定运行:
Powershell上通过SSH登录Openwrt终端(实际上重启后仍可以),选择端口,最终实现在路由器上稳定流量监测:

未来的改进方向
开发可视化界面
利用前后端分离技术,实现可视化图表的流量监测统计,优化展示界面。
利用USB拓展系统内存
目前的开发基于单型号路由器,由于路由器和Openwrt存储空间有限,如果后续增加应用功能会导致编译和烧录时的限制;
可以考虑挂载USB存储,再创建overlay的符号链接,拓展overlay分区,然后使用外部存储运行程序;
这样可以最大限度地解决存储空间限制这一问题。
📎 参考文章
有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~