OpenWrt LEDE 固件编译
章节 | 内容 |
---|---|
编译 LEDE | 配置编译环境,配置编译,编译 LEDE |
编译时故障 | 在编译时可能遇上的故障 |
使用时故障 | 在使用时可能遇上的故障 |
文件系统相关 | 一些其他的问题 |
eMMC 写入 | 写入 eMMC |
环境参考
Ubuntu 20
建议 Ubuntu 或者 Debian 系的系统进行编译,方便解决依赖问题
云服务器
下载依赖速度快,优先推荐海外的(带宽充足)
2 x Intel® Xeon® Gold 6133 CPU @ 2.50GHz
4GB MemoryWindows 11 Build 10.0.22621
只要有 openssh,都行
编译 LEDE
环境准备
- 不建议使用
root
来编译,容易发生很多魔法问题 - 建议采用全新环境编译,避免遇上魔法问题
- 不建议使用中文编码环境编译,避免遇上魔法问题
- 魔法问题,就是虽然有办法应对,可以简单解决就不要复杂化的问题
一般 VPS 为了图省事,都会安装只有 root 用户的系统,但 lede 这里不能用 root 用户,需要重新创建一个:
1 | # 查看当前是否为 root |
依赖库比较多,在服务器里面可以开个 Ubuntu 的 Docker 镜像专门用来编译,防止破坏环境
1 | #换源 |
如果在安装依赖,或者下面步骤关闭了终端,或者丢失了连接,都可以通过下面命令连回,并且不会中断命令执行。
1 | screen -r openwrt |
源码准备
源码准备需要连接 GitHub,最好在出海带宽富裕的时候使用(10MB/s)
1 | # 拉取源码 |
编译目标配置
1 | make menuconfig |
需要从上到下配置的为以下几个选项,后面几个是需要添加进去的软件包,可以根据实际情况添加。
原文 | 解释 |
---|---|
Target System | 编译目标架构(处理器厂商) |
Subtarget | 细分处理器类型 |
Target Profile | 细分硬件类型(用在什么板子上) |
Target Images | 编译生产的镜像格式/打包方式 |
Firmware | 硬件驱动 |
Development | 开发工具(gcc) |
Languages | 开发语言(Python) |
Libraries | 依赖库(加密解密库) |
LuCI | [重点] LuCI 的一大堆东西,插件 |
Multimedia | 媒体解码器( FFmpeg) |
Network | 网络相关的各种软件 |
Sound | 音频解码器 |
Utilities | 系统工具 |
关于 LuCI 这一部分,进入 LuCI --> Applications 可以自定义更多的插件
配置完记得选择 Save 保存为 .config
保存好。
配置完成后需要下载编译目标所需的 dll 库:
1 | # V=s 是 openwrt 需要的参数,建议 8 线程以缓解服务器压力 |
编译
一般比较久,1h 起步,对于云服务器务必采用 screen 防止意外断流带来的编译中断。
1 | # 非 root 用户 |
编译完成后在 bin/targets/ 下可以找到对应的编译目标
文件名 | 说明 | 用途 |
---|---|---|
xxx-generic-squashfs-combined.img.gz | 带引导分区文件 | 直接刷入 |
xxx-generic-squashfs-combined.vmdk | 带引导分区的 Vmware 虚拟磁盘 | 虚拟机 |
xxx-rootfs-squashfs.img.gz | 分区文件,无引导 | 升级 |
xxx-generic-squashfs-combined-efi.img.gz | 带 EFI 引导分区文件 | 直接刷入 |
xxx-ext4-combined.img.gz | ext4 分区文件,无引导 | 升级 |
xxx-combined-squashfs.iso | 镜像 | 直接刷入 |
注意,这里的
img.gz
后缀均为压缩文件,需要解压缩后刷入系统
1
2
3
4 # 解压后会删除原文件
gzip -d *.img.gz
# 解压后不删除原文件
gzip -dk *.img.gz
二次编译
一次编译好后在第二次会根据配置的 .conf
进行编译,可以设置定时任务每天编译。
1 | # 更新 |
使用 Action 编译
Github Action 进行云构建
https://github.com/P3TERX/Actions-OpenWrt/generate
当然还有一种玩法就是用 act 进行本地构建:
1 | curl -s https://raw.githubusercontent.com/nektos/act/master/install.sh | sudo bash |
编译时故障
网络问题
- 自己想办法
- 等出海带宽闲置时候拉取源码
- 用云服务器
- 用 Github Action 编译
root 下编译失败
无视不安全配置
1 | make FORCE_UNSAFE_CONFIGURE=1 -j$(nproc) V=s |
这会导致编译出来的源码权限混乱,因此不建议用 root 权限编译,会带来极大的安全风险。
重新配置 feeds 后编译错误
清理掉 feeds 重新下载,重新编译
1 | ./scripts/feeds clean |
更换目标架构/出错
需要清理目录
1 | make dirclean |
或者删除目录重新下载
内存不足
out of memory
- 加内存
- 换大内存服务器
- 加 swapfile
添加 swapfile 方法
1 | # 创建 1024M 的 /swapfile |
提示:在 WSL 下需要将主机的 Chromium 内核的软件全部关闭,以确保能编译成功。 很多次遇上 WSL 里面的编译错误,都是因为主机内存被 Chromium 大量占用。
大小不兼容问题
编译时提示不兼容大小写不敏感系统
1 | Build dependency: OpenWrt can only be built on a case-sensitive filesystem |
常见于 Windows 下进行编译,不要跨文件系统运行,因为 Windows 的文件系统是大小写不敏感的,Linux 的文件系统是大小写敏感的。
常见于 WSL 时又喜欢敲完 wsl
直接回车,编译时目录都在 Windows 的 NTFS 文件系统下
1 | PS C:\Users\0xac> wsl |
实际工作目录是在主机的用户目录下,自然容易遇到很多奇怪的问题,只需要切换到用户目录下即可:
1 | > cd ~ |
使用时故障
镜像空间不足
驱动/包多时,会占用大量空间,需要扩大镜像的空间
在 make menuconfig
中调整
1 | Target Images ---> (16) Kernel partition size (in MB) |
Kernel partition size (内核分区)扩大到 256MB
Root filesystem partition size (根文件分区)扩大到 512MB
IPv6 支持
在 make menuconfig
中勾选
1 | Extra packages ---> ipv6helper |
或者勾选:
1 | Network ---> odhcp6c |
刷固件后用不了 Wifi
无法识别 Wifi 网卡,需要确认 Firmware
中的 对应 网卡驱动是否勾上
换源
需要先配置好 ssl
相关套件
1 | opkg update |
文件系统相关
大文件上传
一般 lede 的 WebUI 中上传超过 2GB 的文件都不怎么稳定,推荐使用 ssh
协议下的 scp
进行上传:
1 | scp ./230513.img.tar.gz root@10.22.33.1:~/230513.img.tar.gz |
上传写入 eMMC
对于某些板子上带有 eMMC 的,使用 LEDE 的网页写入容易出现故障,这里可以采用手动写入的方法。
1 | # 本地,上传 img |
分区拓展
实际上非常简单,对于有连续未使用的空间,都可以拓展上去
1 | # 注意找到对应的分区 |
这种方法是无损的,不需要关闭当前系统,然后挂上另外一个系统,进行操作的
文件损坏
报错: Read Only File system
多出现于宿舍这种经常断电的地方,从结果上看,基本上是:
- 文件系统错误
- 硬件故障
- 只读挂载
说人话就是是:
- 经常断电,拔电式关机,导致文件数据出错
- 软件编写有问题,写坏文件系统
- 脑子抽了,写了成只读
只读挂载
如果挂载为只读,只需要重新以可读写方式挂载。
1 | # 找到对于的目录 |
但这对 /
根目录没有用,因为一般 根目录只读,都是文件系统故障,需要用命令进行修复。
修复文件系统
对于文件系统损坏,可以修复文件系统
1 | # 检测系统日志,寻找报错点 |
写入 eMMC
写入 eMMC 分四步走:
- 外部引导进入系统,比方说从 TF 卡启动(具体启动方法见厂商)
- 刷入
.img
镜像 - 调整分区
- 拔卡重启
外部引导进入系统
- 一部分设备有 MASK 按键,上电同时长按 5s 以上,10s 以下,就能强制从 TF 卡(TF 卡需要刷好系统镜像)引导。
倘若不知道系统是否正常启动,可以使用调试器,接入设备上的串口。查看从上电开始的命令行输出是否正常。
- 可以直接破坏 eMMC 分区,导致系统只能从 TF 卡引导启动:
1 | dd if=/dev/zero of=/dev/mmcblk0 bs=1M count=1 status=progress |
上传并写入系统镜像
1 |
|
调整分区
如果镜像没有打包好,就会出现 32G 的空间,实际上只分到 1 GB 的区,用上一段时间,日志就会写满这个分区,然后报错。
这里是一种在 Linux 下通用的,无损拓展分区的方法。
这里的拓展只能将现有分区,拓展到后面跟着的连续分区上。
无法拓展当前正在运行的系统的分区。
1 | # 接着上一步,不要重启设备 |
参考资料
【1】: https://www.right.com.cn/forum/thread-344825-1-1.html
【2】: https://imgki.com/archives/openwrt-lean.html
【3】: https://www.cnblogs.com/fansys/articles/12142292.html
【4】: https://blog.csdn.net/wxq4100798/article/details/104006964