编译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
所有内容只说明调整项,未提及的则默认!!!!!
- Target System: x86. 因为是 x86 的机器,此处选择 x86 即可
- Subtarget: x86_64. - Target Profile: Generic x86/64
- Target Images:
- Root filesystem images:
- squashfs: 该选项必须打开,否则后续无法升级固件
- Build xxxx image:这几个看需求,我没特殊需要,全部关闭
- (1024) Root filesystem partition size (in MiB) :修改固件大小,建议大一些,不在乎这1G空间
- squashfs: 该选项必须打开,否则后续无法升级固件
- Root filesystem images:
- Enable experimental features by default: 是否打开实验功能,建议还是不开,家庭使用稳定为主
- Image configuration:
- Version configuration options : 可以设置编译者信息,意义不大,忽略
- Separate feed repositories:把自己加进去的几个feed关闭,因为基本上没有release
- Preinit configuration options
- Show all preinit network messages:打开
- IP address for preinit network messages:家里设置的10.0.10.1
- Broadcast address for preinit network messages:家里设置的10.0.10.255
- Base System
- auc: 升级需要的插件,主动打开。
- Extra packages
- autosamba:关闭,基本不用
- ipv6helper: 开启,ipv6支持
- Kernel modules:
- Network Support
- kmod-wireguard: 关闭
- Network Devices:
- kmod-ixgbevf:SRIOV网卡驱动。
- Video Support:
- kmod-drm-amdgpu:走的虚拟机,这俩不需要,后续如果用单独的机器装可以考虑打开
- kmod-drm-i915:走的虚拟机,这俩不需要,后续如果用单独的机器装可以考虑打开
- kmod-drm-amdgpu:走的虚拟机,这俩不需要,后续如果用单独的机器装可以考虑打开
- Network Support
- LuCI
- Applications
重中之重,所有的插件都在这里配置
- luci-app-accesscontrol:关闭
- luci-app-adbyby-plus:关闭。TODO: 去广告效果不好,后续再测试
- luci-app-bypass: 取消所有插件,后续passwall会配置
- luci-app-ddns:关闭,使用luci-app-ddns-go代替
- luci-app-ddns-go:开启
- luci-app-ipsec-vpnd:采用了tailscale组网,可以取消这个
- luci-app-netspeedtest:测速插件
- luci-app-passwall:科学上网必备,必须要
- Include ChinaDNS-NG:开启
- Include Hysteria:由于我只使用hysteria了,所以就直接他了
- luci-app-passwall2:关闭子配置
- luci-app-rclone:关闭子配置
- luci-app-ssr-plus: 目前基本不使用
- luci-app-turboacc:开启全部加速
- luci-app-unblockmusic:关闭
- luci-app-vsftpd:关闭。一个FTP服务器
- luci-app-vssr:关闭
- luci-app-wireguard:关闭
- luci-app-wol:关闭
- luci-app-xlnetacc:迅雷加速,关闭
- luci-app-zerotier:用tailscaled代替
- luci-app-serverchan: 微信推送
- luci-app-mwan3:mwan平衡
- luci-app-syncidal: 多拨(与upnp存在一定冲突)
- luci-app-netdata:实时监控
- luci-app-samba4:关闭
- luci-app-accesscontrol:关闭
- Protocols
- luci-proto-wireguard: 关闭
- Applications
- Utilities
- Virtualization
- qemu-ga:开启PVE QEMU Guest Agent必备选项
- Virtualization
- Multimedia
- UnblockNeteaseMusic-Go:关闭
- Network
- Firewall
- ip6tables:回车开启全部子选项
- File Transfer
- vsftpd-alt:关闭
- IP Addresses and Names
- ddns-scripts:关闭
- VPN
- wireguard-tools:关闭
- zerotier:关闭
- Web Servers/Proxies
- shadowsocks-libev-ss-local:关闭
- shadowsocks-libev-ss-redir:关闭
- shadowsocks-libev-ss-server: 关闭
- shadowsocksr-libev-ssr-check:关闭
- shadowsocksr-libev-ssr-local:关闭
- shadowsocksr-libev-ssr-redir:关闭
- shadowsocksr-libev-ssr-server:关闭
- wol: 关闭
- xray-core:关闭
- simple-obfs-client:关闭
- Firewall
1.7 下载 Dl 库,编译固件 (-j 后面是线程数,第一次编译推荐用单线程)
make download -j$(nproc) V=s
1.8 编译固件
make -j$(nproc) V=s
2 云编译
云编译使用的是github的actions服务,目前来说,性能还不错,最大的优势的编译依赖的各种包下载起来不会网络出错。参考 Lean 的教程,但因为考虑到自己有一些调整,就自己建立了一个新库。
2.1 准备编译库
随便建立一个新库,此处我建立的 OpenWrtBuilder.
目录结构如下:
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手动触发即可。
2.5 下载固件
编译完成后,对应的job显示完成后,即可进入下载。
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