编译OpenWRT


本文总阅读量

目前公开的网上大佬编译的 OpenWRT 固件,一般来说都很好用,不存在什么大的影响使用的 bug,但要么插件过多,要么插件太少,使用起来有些不方便。鉴于网上编译教程十分详细,于是尝试自行编译,可以达到自定义使用的目的。

1 本地编译

1.1 编译服务器准备

准备本地编译环境,为了编译调试方便。这部分内容直接参考 Lean 的教程 ,比较详细,也和我目前的机器配置相当。以下均采用 debian 11 系统。

1.2 安装编译依赖

安装编译依赖要么用 root,要么使用有权限的用户,为了方便,这里全部采用 root 用户操作。

sudo apt update -y
sudo apt full-upgrade -y
sudo apt install -y ack antlr3 aria2 asciidoc autoconf automake autopoint binutils bison build-essential bzip2 ccache cmake cpio curl device-tree-compiler fastjar flex gawk gettext gcc-multilib g++-multilib it 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-pip libpython3-dev qemu-utils rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev

建议从这一步开始,使用非 root 用户,防止出现不必要的麻烦!!!!!
建议从这一步开始,使用非 root 用户,防止出现不必要的麻烦!!!!!
建议从这一步开始,使用非 root 用户,防止出现不必要的麻烦!!!!!

# 添加用户并配置home目录  
useradd dev  -d /home/dev 
# 配置密码(之前有一次放开dev机器到外网,然后密码123456,被人扫到了,靠!)  
passwd dev
# 切换用户进入到/home/dev  
su dev
cd 

1.3 准备源代码

git clone https://github.com/coolsnowwolf/lede
cd lede

1.4 配置第三方插件

由于很多插件都是由第三方库维护的,所以还需要添加许多的插件才能实现某些功能。

# 包含许多有用的插件,最主要的有PSSWALL  
echo "src-git kenzok8 https://github.com/kenzok8/openwrt-packages.git" >> ./feeds.conf.default  

# PSSWALL插件的依赖在这个库里  
echo "src-git small https://github.com/kenzok8/small" >> ./feeds.conf.default  

# 测速插件  
echo "src-git netspeedtest https://github.com/sirpdboy/netspeedtest.git" >> ./feeds.conf.default  

# 目前使用起来,感觉最好用的配置DDNS的插件。原版的虽然可以每个域名配置不同的dns服务商,每个域名都需要配置全量的参数。但我就单独只用一个服务商,还是这个好用,而且速度极快,支持IPV4和IPV6  
echo "src-git ddnsgo https://github.com/sirpdboy/luci-app-ddns-go.git ddnsgo" >> ./feeds.conf.default

1.5 更新 Feeds

配置好插件 feed,需要更新后才可使用,否则进入配置页面没法看到添加的插件。此处建议科学上网,否则报错信息一大片。

./scripts/feeds update -a
./scripts/feeds install -a

1.6 调整配置, DIY 自己的固件

make menuconfig  

所有内容只说明调整项,未提及的则默认!!!!!

1.7 下载 Dl 库,编译固件 (-j 后面是线程数,第一次编译推荐用单线程)

make download -j$(nproc) V=s

1.8 编译固件

make -j$(nproc) V=s

2 云编译

云编译使用的是github的actions服务,目前来说,性能还不错,最大的优势的编译依赖的各种包下载起来不会网络出错。参考 Lean 的教程,但因为考虑到自己有一些调整,就自己建立了一个新库。

2.1 准备编译库

随便建立一个新库,此处我建立的 OpenWrtBuilder.
目录结构如下:
BuildOpenwrt目录结构.png

2.2 修改x86_64.config

本地编译通过后,可以直接执行

./scripts/diffconfig.sh > diffconfig

将diffconfig的内容复制到x86_64.config文件中去。

2.3 修改Build_X86_64.yaml

这是actions的脚本。

name: Build_x86_64

on: 
  workflow_dispatch:


jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@master

    - name: Initialization environment
      env:
        DEBIAN_FRONTEND: noninteractive
      run: |
        set +e
        docker rmi `docker images -q`
        echo "Deleting files, please wait ..."
        sudo rm -rf \
          /usr/share/dotnet \
          /etc/mysql \
          /etc/php
        sudo -E apt-get -y purge \
          azure-cli \
          ghc* \
          zulu* \
          hhvm \
          llvm* \
          firefox \
          google* \
          dotnet* \
          powershell \
          openjdk* \
          mysql* \
          php*
        sudo -E apt-get update
        sudo -E apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3 python2.7 unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler g++-multilib antlr3 gperf wget curl swig rsync libtinfo5 lib32gcc-s1
        sudo -E apt-get -y autoremove --purge
        sudo -E apt-get clean

    - name: Clone source code
      env: 
        REPO_URL: https://github.com/coolsnowwolf/lede
        REPO_BRANCH: master
      run: |
        git clone --depth 1 $REPO_URL -b $REPO_BRANCH openwrt
        cd openwrt
           
    - name: Import external feeds
      working-directory: ./openwrt
      run: |
	    # 相当于吧本地编译配置第三方插件的内容搬过来
	    echo "src-git kenzok8 https://github.com/kenzok8/openwrt-packages.git" >> ./feeds.conf.default  
	    echo "src-git small https://github.com/kenzok8/small" >> ./feeds.conf.default 
	    echo "src-git netspeedtest https://github.com/sirpdboy/netspeedtest.git" >> ./feeds.conf.default  
	    echo "src-git ddnsgo https://github.com/sirpdboy/luci-app-ddns-go.git ddnsgo" >> ./feeds.conf.default

    - name: Update & Install feeds
      working-directory: ./openwrt
      run: |
        ./scripts/feeds update -a
        ./scripts/feeds install -a
        ./scripts/feeds install -a

    - name: Configuration Customization
      env:
        CONFIG_FILE: 'x86_64.config'
      run: |
        [ -e $CONFIG_FILE ] && mv $CONFIG_FILE openwrt/.config
        cd openwrt && make defconfig
        
    - name: Download package
      working-directory: ./openwrt
      run: |
        make download -j$(nproc) V=s
        find dl -size -1024c -exec ls -l {} \;
        find dl -size -1024c -exec rm -f {} \;

    - name: Build firmware
      working-directory: ./openwrt
      run: |
        echo -e "$(nproc) thread build."
        make -j$(nproc) V=s

    - name : Upload artifact
      uses: actions/upload-artifact@master
      with:
        name: OpenWrt
        path: openwrt/bin

2.4 执行编译

固件并不是经常更换,为了节约资源,采取手动触发。

进入acitons手动触发即可。
执行BuildOpenwrt编译.png

2.5 下载固件

编译完成后,对应的job显示完成后,即可进入下载。
下载固件.png

3 关于启用IPV6

修改/etc/sysctl.conf,将以下内容加进去,大意说接收广播并开启IPv6转发

net.ipv6.conf.default.forwarding=2
net.ipv6.conf.all.forwarding=2
net.ipv6.conf.default.accept_ra=2
net.ipv6.conf.all.accept_ra=2
net.ipv6.conf.default.accept_dad=2
net.ipv6.conf.all.accept_dad=2
net.ipv6.conf.default.dad_transmits=2
net.ipv6.conf.all.dad_transmits=2


2017–2023 ZyTomorrow
本站总访问量