OpenWrt编译固件的两三事


前言

GitHub Action 在线编译参考:

然而,鉴于大家可能的本地编译固件需求,我提供了在WSL (Windows Subsystem Linux) 里编译固件的教程。

安装WSL参考教程

参考链接:史上最全的WSL安装教程

在WSL内使用代理教程

宿主机安装代理工具如 ClashV2rayN等工具,配置好连接。

由于 Linux 子系统也是通过 Windows 访问网络,所以 Linux 子系统中的网关指向的是 Windows,DNS 服务器指向的也是 Windows,基于这两个特性,我们可以将 Windows 的 IP 读取出来。

例如,在 Ubuntu 子系统中,通过 cat /etc/resolv.conf 查看 DNS 服务器 IP。

cat /etc/resolv.conf

# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 172.25.44.1

可以看到 DNS 服务器是 172.25.44.1,通过环境变量 ALL_PROXY 配置代理:

export ALL_PROXY="http://172.25.44.1:7890"

7890 是 Windows 上运行的代理客户端的端口,记得要在 Windows 代理客户端上配置允许本地局域网请求。

打开你的WSL Shell 输入下方命令,配置代理端口:

# 设置host_ip
host_ip=172.25.44.1        # 记得改成自己的dns主机

# 使用Clash

export HTTP_PROXY=http://$host_ip:7890
export HTTPS_PROXY=http://$host_ip:7890
export ALL_PROXY=socks5://$host_ip:7890

# 使用v2rayN

export HTTP_PROXY=http://$host_ip:10809
export HTTPS_PROXY=http://$host_ip:10809
export ALL_PROXY=socks5://$host_ip:10808
一键配置脚本

将上面的过程写入一个 bash 脚本,可以轻松的实现一键配置代理:

#!/bin/bash
host_ip=$(cat /etc/resolv.conf |grep "nameserver" |cut -f 2 -d " ")
export ALL_PROXY="http://$host_ip:7890"

输入以下命令,确保代理服务器已经添加到临时环境变量中:

echo $<代理变量>         # 如HTTP_PROXY,HTTPS_PROXY,ALL_PROXY

1. 安装编译依赖

sudo apt update -y

sudo apt full-upgrade -y

sudo apt install -y ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \
bzip2 ccache cmake cpio curl device-tree-compiler fastjar flex gawk gettext gcc-multilib g++-multilib \
git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libglib2.0-dev libgmp3-dev libltdl-dev \
libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libreadline-dev libssl-dev libtool lrzsz \
mkisofs msmtp nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pyelftools \
libpython3-dev qemu-utils rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip \
vim wget xmlto xxd zlib1g-dev

2. 下载源代码

git clone https://github.com/openwrt/openwrt           #官方版本

git clone https://github.com/coolsnowwolf/lede         #lede版本

git clone https://github.com/Lienol/openwrt            #lienol版本

git clone https://github.com/immortalwrt/immortalwrt   #immortalwrt版本
cd openwrt                                             #切换到文件目录

如需指定openwrt版本,可以使用以下命令

git tag                            # 查看稳定版,回车键拉到最低,按Q结束!

git checkout v22.03.3              # 指定版本,红色部分位版本号

3. 添加插件或主题

打开openwrt文件夹,找到feeds.conf.default文件打开,添加到最下面!

src-git amlogic https://github.com/ophub/luci-app-amlogic         # 必须添加

src-git alist https://github.com/sbwml/luci-app-alist             # Alist插件

src-git passwall_packages https://github.com/xiaorouji/openwrt-passwall.git;packages

src-git passwall_luci https://github.com/xiaorouji/openwrt-passwall.git;luci  

src-git kenzo https://github.com/kenzok8/openwrt-packages

src-git argonnew https://github.com/jerrykuku/luci-theme-argon.git;main   # 主题

4. 更新源码

./scripts/feeds update -a             # 更新源码

./scripts/feeds install -a            # 拷贝源码

5. 定制openwrt系统

make menuconfig                       # 打开openwrt配置面板

以下是menuconfig页面中各选项的说明:

  1. Target System:选择你的设备所使用的处理器架构。
  2. Subtarget:根据设备的详细型号,选择相应的子目标。
  3. Target Profile:选择你的设备型号。这会自动设置与设备兼容的预设选项。
  4. Target Images:选择生成的固件类型,例如:squashfsext4等。
  5. Global build settings:配置全局编译设置,例如:启用/禁用软件包的签名检查、IPv6支持等。
  6. Base system:选择基本系统组件,例如:网络配置、系统日志、防火墙等。
  7. Extra packages:选择额外的软件包,如:文件系统支持、VPN、代理等。
  8. Kernel modules:选择内核模块,如:支持的硬件设备、文件系统、网络协议等。
  9. LuCI:选择Web界面组件,包括主题、应用、协议支持等。
  10. Languages:选择系统支持的语言包。
  11. Libraries:选择编译时需要的库文件,如:加密库、数据库库等。
  12. Utilities:选择实用工具,如:文件管理器、终端模拟器、脚本语言支持等。

根据你的设备型号和需求进行配置,在配置过程中要注意不要选择有冲突的软件包。配置完成后,保存并退出。


Arm平台

cpu参考按需更换,或按照如下配置运行在虚拟机内

*** 必须设置项目(CPU架构,镜像文件格式)

Target System  ->  QEMU ARM Virtual Machine 

Subtarget ->  QEMU ARMv8 Virtual Machine (cortex-a53)

Target Profile  ->  Default

Target Images  ->   tar.gz

x86平台

*** 必须设置项目(CPU架构,镜像文件格式):

Target System  ->  x86

Subtarget ->  x86_64

Target Profile  ->  Generic x86/64

Target Images  ->   tar.gz

按需配置

*** 基础依赖包,保证打出的包可以写入EMMC,可以在EMMC上在线升级,不包含具体的应用(有在线升级的需求选填) 

Languages -> Perl               

             ->  perl-http-date
    
             ->  perlbase-file
    
             ->  perlbase-getopt
    
             ->  perlbase-time
    
             ->  perlbase-unicode                              
    
             ->  perlbase-utf8        

Utilities -> Compression -> bsdtar 或 p7zip(非官方源)、pigz

          -> Disc -> blkid、fdisk、lsblk、parted            
    
          -> Filesystem -> attr 、btrfs-progs(Build with zstd support)、chattr、dosfstools、e2fsprogs、f2fs-tools、f2fsck、lsattr、mkf2fs、xfs-fsck、xfs-mkfs
    
          -> Shells  ->  bash         
    
          -> gawk、getopt、losetup、tar、uuidgen
*** Wifi必选

Kernel modules -> Wireless Drivers -> kmod-cfg80211
	
                                   -> kmod-mac80211
	
                -> USB Support -> kmod-usb2
    
                               -> kmod-usb3

Network  ->  WirelessAPD -> hostapd-common
	
                         -> wpa-cli
    
                         -> wpad-basic
    
         ->  iw

添加应用参考(通用)

OpenWrt 编译 LuCI-> Applications 插件应用说明

*** 插件和主题,语言设置选项,根据需求设置,为了减少编译失败的概率,除了必要的晶晨插件,其他都不要安装,主题也是。可以编译成功后单独编译插件在安装。
LUCI -> 1. Collections -> luci-ssl-openssl 启用OpenSSL 防止进不去
	
	 -> 2. Modules -> Translations -> Chinese simplified 简体中文 自选
	
     -> 3. Applications  -> luci-app-amlogic  晶晨插件,必选
       
	 -> 4. Themes   尽量不要安装,不然容易后台面板进不去!

6. 开始编译固件

初次编译

make download -j8     # 下载 dl 库,编译固件 (-j 后面是线程数)
make V=s -j1          # 初次编译有debug需求,推荐线程数为1,便于快速找到错误

二次编译

cd lede

git pull

./scripts/feeds update -a 

./scripts/feeds install -a

make defconfig

make download -j8

make V=s -j$(nproc)

重新编译

rm -rf ./tmp && rm -rf .config #清理缓存和配置文件

make menuconfig

make V=s -j$(nproc)

编译失败,执行以下命令清除文件:

make clean                       # 删除编译目录/bin和/build_dir目录中的文件

make dirclean                   # 除了删除编译目录之外还删除编译工具目录,删除/bin /build_dir目录的中的文件(make clean)以及/staging_dir、/toolchain、/tmp和/logs中的文件,一般在更换CPU架构的情况下才操作。

7. 下载编译压缩包

编译完成后输出路径:bin/targets

后排提示,由于openwrt灵活度高,入门时候就容易觉得东西太多不知道用,所以其实很多东西不用选(大不了以后改),按照默认配置来即可,官方也提供默认配置,还有不懂之处可以看官方wiki.

Inference

OpenWrt 固件自编译教程:从入门到酸爽 X86安装openwrt 教你如何编译OpenWrt,定制属于自己的固件 从零开始:自己编译OpenWrt系统 openwrt编译教程及踩坑记录 新手折腾进阶篇-openwrt编译入门

Comments

Leave a comment