title.jpg
相信玩路由器的都了解openwrt这个开源项目,大家熟知的SSRplus+以及passwall等工具都非常全面强大,更不用说各种去广告和流控功能了。
最近玩VMware 虚拟机想集合hystria,naive proxy以及最新的xtls-rprx-vision流控,结果翻了一圈,好像暂时没大佬做最新的vmdk版本,那就只能自己动手编译了。

一、编译流程简介

我们可以通过windows虚拟机安装ubuntu 22.04,然后有两种方式去编译,一种拉取openwrt git对应tag版本的sdk库,直接update feeds列表进行install和build,另一种方式就是自行下载安装需要的编译环境和组件,然后update。
第一种sdk编译方法参考前辈的文章分享:
openwrt官方原版编译passwall插件
而我们这次自行安装所需环境和依赖,然后更新feeds列表,接下来将自己想要安装的组件项目加入feeds,update后就可以make menuconfig对最终镜像进行配置和功能勾选,最后make进行编译,过程思路还是很简单的,一些小坑比较多,我们一一捋顺。

二、安装ubuntu并配置vmware虚拟机网络环境

首先我们下载ubuntu对应镜像,在VMware中安装准备自行编译openwrt:
国内镜像源有很多,这里随便列两个:
https://mirrors.sdu.edu.cn/ubuntu-releases/
http://mirrors.163.com/ubuntu-releases/
Vmware 创建新的虚拟机选择ubuntu 64位直接安装就可以,cd/dvd选择开机后自动连接,选择刚才下载的镜像就可以了,安装配置时候将/boot分区设置500m以上,/home分区最好设置30gb以上。
当然你也可以用别人安装制作好的vmdk盘直接导入:
https://www.linuxvmimages.com/images/ubuntu-2004/

System Details & Login Information
NOTES    
SYSTEM DETAILS    LOGIN DETAILS
vCPU: 2    Username: ubuntu
RAM: 4 GB    Password : ubuntu
DISK: 51 2GB    (to become root, use sudo su -)
Network: NAT

注意网站说明的登陆信息
建议使用nat模式连接,然后你的v2rayn设置勾选允许局域网连接访问
12.16.v2rayN_参数设置161.png
使用sstap等全局代理工具,配置一个新的socks5 代理,地址为127.0.0.1:10808,
12.16.SSTap_SSTap_Beta_1.0.9.7_-_享受游戏162.png
这里端口是对应默认v2rayn监听端口10808,如果你v2rayn更改过,那么这个socks5代理也需要同步修改端口,sstap建议选择1.0.9.8以前版本,才有全局代理模式,当然你也可以使用仅代理国外ip模式也可以实现ubuntu访问github更新。
启动sstap,然后你的ubuntu虚拟机就可以通过nat局域网访问本机,再通过sstap的socks5全局代理经由v2rayn访问外网更新和访问github了.
你也可以给ubuntu设置本地系统代理端口也可以的。

三、正式编译openwrt

目前openwrt比较热门的翻墙插件就是ShadowsocksRplus+以及passwall,当然还有其他的去广告插件之类的,那就需要你自己关注对应github大神的进度了。
1.编译插件前需要安装各种编译器环境和依赖组件,每次更新插件前都要关注对应的日志和公告,进行依赖和环境安装的补齐;
2.然后是每个插件的组件包,需要将github项目源加入feeds配置文件;
3.你还需要输入lspic查询当前虚拟机的ubuntu的网卡型号,然后在luci插件编译的目录里添加对应网卡驱动,而不仅仅是VMware默认的e1000虚拟网卡型号
准备完毕,接下来我们具体操作吧!

1.安装编译环境和依赖

我们需要用非root用户进行编译操作,打开terminal:
12.16.ubuntu-terminal.jpg
官方openwrt编译需要的环境和依赖:
https://openwrt.org/docs/guide-developer/toolchain/install-buildsystem
由于新的22.03和21.02版本openwrt已经淘汰了python2.7.就不需要安装了
Ubuntu 22.04以上版本内置了python3,所以也不用编译了
如果依赖包报错,则需要根据编译错误日志去找对应的库了
因此根据openwrt官方建议,我们对ubuntu22.04系统执行以下操作:

sudo apt update
sudo apt install build-essential  clang flex g++ gawk gcc-multilib gettext \
git libncurses5-dev libssl-dev python3-distutils qemu-utils rsync unzip zlib1g-dev \
file wget

关于各种组件依赖的解释


build-essential是个编译组件包,包括gcc,g++,和make。
binutils binutils-common binutils-x86-64-linux-gnu dpkg-dev fakeroot g++ g++-9 gcc gcc-9 libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl libasan5 libbinutils libc-dev-bin libc6-dev libcrypt-dev libctf-nobfd0 libctf0 libfakeroot libgcc-9-dev libitm1 liblsan0 libquadmath0 libstdc++-9-dev libtsan0 libubsan1 linux-libc-dev make manpages-dev

Clang 是c++ 编译器
binfmt-support clang-10 lib32gcc-s1 lib32stdc++6 libc6-i386 libclang-common-10-dev libclang-cpp10 libclang1-10 libffi-dev libllvm10 libncurses-dev libobjc-9-dev libobjc4 libomp-10-dev libomp5-10 libpfm4 libtinfo-dev libz3-4 libz3-dev llvm-10 llvm-10-dev llvm-10-runtime llvm-10-tools python3-pygments

Flex 是语法分析工具
g++在build-essential 内已经安装好了,这里可以不再安装。
gcc-multilib是为了附带安装以下工具包:
gcc-9-multilib lib32asan5 lib32atomic1 lib32gcc-9-dev lib32gomp1 lib32itm1 lib32quadmath0 lib32ubsan1 libc6-dev-i386 libc6-dev-x32 libc6-x32 libx32asan5 libx32atomic1 libx32gcc-9-dev libx32gcc-s1 libx32gomp1 libx32itm1 libx32quadmath0 libx32stdc++6 libx32ubsan1

gawk是awk文本编辑器的一种,gettext是一种数据转换工具,git工具方便拉取github的项目文件
Libncureses5-dev libssl-dev 开发包按照官方要求安吧
Python3-distutils在编译python3模块需要用到
qemu-utils创建vmdk格式文件需要用到
Zlib1g 是zlib新库,编译时需要用到
而rsync unzip file wget这些常用工具在系统更新中已经安装完毕,可以不用再单独安装
所以如果你也是ubuntu22.04版本,其实执行以下安装就够了:
sudo apt install -y build-essential clang gawk gcc-multilib flex git gettext libncurses5-dev libssl-dev python3-distutils qemu-utils zlib1g-dev

准备就绪,我们选择合适的openwrt版本进行编译:

2.官方编译流程简介

根据官方教程:
https://openwrt.org/docs/guide-developer/toolchain/use-buildsystem

标准编译操作流程如下:

下载并更新git源
git clone https://git.openwrt.org/openwrt/openwrt.git
cd openwrt git pull
选择指定的发布版本
git branch -a git tag
git checkout v21.02.3
更新feeds源
./scripts/feeds update -a
./scripts/feeds install -a
配置固件镜像和核心
make menuconfig
make -j $(nproc) kernel_menuconfig
编译固件文件
make -j $(nproc) defconfig download clean world

我们按着流程实际操作一下:
目前最新是22.03.2:
iptables based firewall3 to the nftables based firewall4
一个最明显的更新就是将iptables更换成nftables,日常使用注意工具的更替。
我们按着提示操作:

3.下载并更新git源

官方演示指令为
git clone https://git.openwrt.org/openwrt/openwrt.git [<buildroot>]
这里将编译存放目录设置为/home/ubuntu/openwrt/,而官方源采用的github源/官网源都行的。
12.16.openwrt_This_repository.png
那么指令示例如下:

mkdir -p /home/ubuntu/openwrt
git clone https://github.com/openwrt/openwrt.git  /home/ubuntu/openwrt

12.16.vmware_Ubuntu_20.04.4_VM_git-clone.png

如果需要检查更新,只需要

cd /home/ubuntu/openwrt
git pull

拉取项目来获得更新
如果你的网络不太好,请多试试
拉取官方项目代码库到本地完毕,可以执行feeds更新:

./scripts/feeds update -a

shfit+PageUp/Down来查看翻页,是否有error

12.16.vmware_Ubuntu_20.04.4_update-feeds.png
然后我们可以选择添加自己想要的项目插件库到feeds列表里,获得自定义的插件功能。

4.更新添加feeds

这里演示的是添加ssrplus+和passwall
执行指令前记得先cd到项目目录下。

cd /home/ubuntu/openwrt

毕竟以后更新编译经常从这一步开始,所以多看看自己所在位置。
这里选择两个插件项目添加到feeds
一个是fw876大佬的helloworld也就是ssrplus+

  • 添加feeds:

    sed -i "/helloworld/d" "feeds.conf.default"
    echo "src-git helloworld https://github.com/fw876/helloworld.git" >> "feeds.conf.default"

  • 更新helloworld项目:

    ./scripts/feeds update helloworld
    ./scripts/feeds install -a -f -p helloworld

  • 移除指令:

    sed -i "/helloworld/d""feeds.conf.default"./scripts/feeds clean
    ./scripts/feeds update -a
    ./scripts/feeds install -a

另一个是xiaorouji大佬的openwrt-passwall项目,包含了很多翻墙插件包,我们也加入feeds:

echo "src-git passwall_packages https://github.com/xiaorouji/openwrt-passwall.git;packages" >> feeds.conf.default
echo "src-git passwall_luci https://github.com/xiaorouji/openwrt-passwall.git;luci" >> feeds.conf.default

以上命名比如helloworld passwall_packages passwall_luci都是对应软件包的自定义命名,会在你的项目目录下创建对应的文件夹,并且可以用此自定义名字单独更新对应的软件包。
你可以使用cat feeds.conf.default指令查看是否增添成功:
12.16.cat-feeds-conf-default.png

5.更新feeds并安装

接下来你可以使用./scripts/feeds update xxx指令指定更新安装对应软件包或者 -a全部更新:

./scripts/feeds  update  -a

然后安装:

./scripts/feeds install -a

为了以防万一,你可以fork到自己账号以防删库。
最后将此配置保存为默认配置:

make defconfig

12.16.make-fefconfig.png

6.配置编译选项

各种组件包都下载安装完毕,接下来我们就可以开始配置需要编译的项目了:

make menuconfig

make-menuconfig.png
这是一个比较复杂的菜单页面,我们需要将要用的功能空格键或者y键勾选星号*来实现编译。同时有很多项目需要配置:
我们一项项来:
Target System
首先上下光标箭头移动选项,回车键进入选项编辑
第一个Target System目标系统,这里选择vmware下的ubuntu就用x86,你要用到自己的路由器就查询自己的路由器品牌和cpu架构
Target-System-x86
空格选好回车,然后第二项Subtarget副目标就是x86_64位系统了:
Subtarget-System-x86_64
第三项 Target Images 目标镜像我们这次选择Vmware image files VMDK
下面(16)项核心分区大小设置256M吧,Root 文件系统分区则设置为512M。
Kernel-partition-size-256m
Root-filesystem-partition-size-512m
最后选项参考:
Target-Images-config
光标右移到Exit回车,我们回到首页继续设置

选择Kernel Modules --> Network Devices: 配置虚拟网卡,新开一个teminal窗口,输入lspic指令查看你的虚拟网卡型号,如果列表有你的网卡选项,也勾选上,以防不兼容。
默认的e1000适应大部分的intel网卡。
Ethernet-controller

Luci配置
1.collections
Luci界面是最关键的,这里有我们日常需要的各种软件,你可以按需勾选:
Luci-collections
Collections 内选择第一项默认的Luci界面即可:
Luci
2.Luci-->Modules模块设置
Exit回到Luci-->Modules页面,选择Translations项,勾选简体中文:
Luci-translations
3.Luci-->Applications应用设置
返回Luci页面,选择Applications项,勾选你要安装的Luci软件包:
Luci-Applicaitons
这里有大佬归纳的大部分软件对照翻译:

常用插件列表中英文对照表

插件中文名Luci App
网络向导luci-app-quickstart
实时监控luci-app-netdata
释放内存luci-app-ramfree
WireGuard 状态luci-app-wireguard
Web管理luci-app-webadmin
TTYD 终端luci-app-ttyd
磁盘管理luci-app-diskman
高级设置luci-app-advanced
定时重启luci-app-autoreboot
Argon 主题设置luci-app-argon-config
文件传输luci-app-filetransfer
关机luci-app-poweroff
应用商店luci-app-store
阿里云盘 WebDAVluci-app-aliyundrive-webdav
Mentohust 锐捷拨号客户端luci-app-mentohust
Minieap 锐捷拨号客户端luci-app-minieap
甜糖星愿自动采集luci-app-ttnode
Hello Worldluci-app-vssr
Clash(frainzy1477)luci-app-clash
PassWallluci-app-passwall
Bypassluci-app-bypass
V2ray 服务器luci-app-v2ray-server
广告屏蔽大师 Plus+luci-app-adbyby-plus
iKoolProxy 滤广告luci-app-ikoolproxy
DNS 过滤器luci-app-dnsfilter
ShadowSocksR Plus+luci-app-ssr-plus
AdGuard Homeluci-app-adguardhome
京东签到服务luci-app-jd-dailybonus
易有云文件管理器luci-app-linkease
DDNS.to内网穿透luci-app-ddnsto
微信推送luci-app-serverchan
全能推送luci-app-pushbot
上网时间控制luci-app-accesscontrol
解锁网易云灰色歌曲luci-app-unblockmusic
OpenClashluci-app-openclash
阿里DDNSluci-app-aliddns
动态 DNS(支持阿里腾讯)luci-app-ddns
QoS Nftables 版luci-app-nft-qos
SmartDNSluci-app-smartdns
LXC Containersluci-app-lxc
天翼家庭云/天翼云盘提速luci-app-familycloud
网络唤醒luci-app-wol
WatchCatluci-app-watchcat
UU游戏加速器luci-app-uugamebooster
VPN 绕过luci-app-vpnbypass
Frpsluci-app-frps
Frp 内网穿透luci-app-frpc
UPnPluci-app-upnp
Nps 内网穿透luci-app-nps
迅雷快鸟luci-app-xlnetacc
OpenConnect VPNluci-app-ocserv
OpenVPN(客户端)luci-app-openvpn
uHTTPdluci-app-uhttpd
KMS 服务器luci-app-vlmcsd
RP PPPoE Serverluci-app-rp-pppoe-server
IPTV 帮手luci-app-iptvhelper
组播代理luci-app-omcproxy
udpxyluci-app-udpxy
MWAN3 分流助手luci-app-mwan3helper
AirPlay 2 音频接收器luci-app-airplay2
Docker CE 容器luci-app-docker
Docker(Dockerman)luci-app-dockerman
可道云luci-app-kodexplorer
NFS 管理luci-app-nfs
微力同步luci-app-verysync
USB 打印服务器luci-app-usb-printer
打印服务器(模块)luci-app-p910nd
硬盘休眠luci-app-hd-idle
网络共享(SMB)luci-app-samba
Aria2 配置luci-app-aria2
挂载 SMB 网络共享luci-app-cifs-mount
Rcloneluci-app-rclone
miniDLNAluci-app-minidlna
Transmissionluci-app-transmission
FTP 服务器luci-app-vsftpd
PCHiFi 数字转盘遥控luci-app-music-remote-center
qBittorrentluci-app-qbittorrent
aMuleluci-app-amule
BaiduPCS Webluci-app-baidupcs-web
N2N v2 VPNluci-app-n2n_v2
SoftEther VPN 服务器luci-app-softethervpn
IPSec VPN 服务器luci-app-ipsec-server
OpenVPN 服务器luci-app-openvpn-server
PPTP VPN 服务器luci-app-pptp-server
ZeroTierluci-app-zerotier
IP/MAC绑定luci-app-arpbind
简单MESHluci-app-easymesh
流量统计luci-app-bandwidthd
网速测试luci-app-netspeedtest
SQM QoSluci-app-sqm
IPv6 端口转发luci-app-socatg
网速控制luci-app-eqos
应用过滤luci-app-oaf
服务质量(QoS)luci-app-qos
多线多拨luci-app-syncdial
负载均衡luci-app-mwan3
Turbo ACC 网络加速luci-app-turboacc
网络带宽监视器luci-app-nlbwmon
实时流量监测luci-app-wrtbwmon
IPV6ipv6helper


更多插件说明:
https://www.right.com.cn/forum/thread-344825-1-1.html
这里附上更新到2022.11月的插件翻译说明表格:
OpenWRT编译LUCI插件说明2022.11.xlsx.zip
4.里面的Luci-app-passwall务必选上,
Luci-passwall
这是我们这次要安装的翻墙工具包,下面的Configuration-->配置选择进去勾选你需要的功能:
Luci-app-passwall-configration
5.接下来回到Luci-->Applications 列表,选择 Luci-app-ssr-plus,也就是我们需要的SSRplus+上网大师:
Luci-app-ssr-plus
各种工具的核心选择,配置情况供参考
6.Luci-->Themes 主题选择
外观党可以全部勾选

7.Luci-->Protocols支持协议
这里随意吧,一些国内没啥用的普通隧道协议
所有配置项设置完毕,接下来就是编译阶段了

7.下载所有组件,开始编译

make download -j8 V=s

-j8是指使用8个线程下载,在网络正常的情况下,基本5分钟下载完毕
Download
注意是否有下载失败的错误日志,然后自己去当前目录dl文件夹下排序看看最小文件是不是小于4kb,如果有,应该是下载不完整的文件,删了重下一次。

  • 单线程编译,第一次使用单线程编译方便查看错误

    make -j1 V=s

  • 以最大线程编译

    make V=s -j$(nproc)

大概3-4小时单线程编译
我虚拟机创建的8核心16线程,所以这里用的-j16跑满了i7 12700k,大概20来分钟完毕
Final-build
温馨提示:使用V=99用来查看更详细的日志情况,灵活使用筛查工具可以更清晰定位错误:

make -j16 V=s 2>&1 | tee build.log | grep -i -E "^make.*(error|[12345]...Entering dir)" 

编译完成后输出路径:bin/targets/x86/64
openwrt-x86_64-vmdk

拿到我们需要的文件后,就可以用vmware安装配置使用了,参考前篇文章VMware路由配置:

新版本的openwrt使用device来替代ifname,由于之前路由使用了192.168.0.88这个ip,我们现在第二个路由就修改到192.168.0.89,新建一个vmnet03,dhcp分配局域网ip段为192.168.12.xx ,这样就可以一起使用,自己管理自己对应的vmnet下接入的虚拟机了:
openwrt-vmware-network-config
希望你也能尽快享受到使用自己编译的openwrt:
12.17.vmware_openwrt.png

四、 一些提示和错误分析

1.如果想二次编译,可以参考以下操作:

不修改配置二次编译:

$ cd /home/ubuntu/openwrt
$ git pull
$ ./scripts/feeds update -a && ./scripts/feeds install -a
$ make defconfig
$ make -j8 download
$ make -j$(($(nproc) + 1)) V=s

如果需要重新配置编译:

$ cd /home/ubuntu/openwrt
$ rm -rf ./tmp && rm -rf .config
$ git pull
$ ./scripts/feeds update -a && ./scripts/feeds install -a
$ make menuconfig
$ make -j8 download
$ make -j$(($(nproc) + 1)) V=s

2.一些常见错误的排查解决

编译过程出现install错误,输入下面指令,再次编译

PATH=$(echo "$PATH" | sed -e 's/:\/mnt.*//g')

如果再次出错,可以删除dl文件夹,再download一次所有的文件

make dirclean

如果提示

But that file is already provided by package * dnsmasq * 

则重新make menuconfig取消选中 Base System-->dnsmasq
因为组件中的dnsmasq-full已经包含了dnsmasq所有功能
报错提示:
/home/ubuntu/openwrt/staging_dir/host/bin/grub-bios-setup: warning: Your BIOS Boot Partition is under 1 MiB, please increase its size..
则增加boot分区大小,修改/target/linux/x86/image/Makefile文件,找到如图位置,将256改为1024应该就行了:
Makefile-Rootfs-config-changesize

建议先尝试只编译原版openwrt,make menuconfig别动额外的内容,一步步来。

另外有大佬们更新的固件和ipk软件包,方便偷懒的朋友:
https://op.dllkids.xyz/
https://op.supes.top/
https://share.mianao.info/Router/

本地电脑不太好的,可以使用github Actions功能,进行云端编译:
https://github.com/P3TERX/Actions-OpenWrt

3.一些未验证的进阶操作

添加自定义插件

原理是把插件源码放到 package 目录下,编译时会自动遍历

示例:
安装最新 argon 主题

openwrt 源码
cd package
git clone https://github.com/jerrykuku/luci-theme-argon.git
Lean 源码
cd /package/feeds/luci
rm -rf luci-theme-argon
git clone -b 18.06 https://github.com/jerrykuku/luci-theme-argon.git

修改 Luci 后台地址
修改文件/package/basefiles/files/bin/config_generate

diff
                static)
                        local ipad
                        case "$1" in
+                        lan) ipad=${ipaddr:-"192.168.1.1"} ;;
                                *) ipad=${ipaddr:-"192.168.$((addr_offset++)).1"} ;;
                        esac

                        netm=${netmask:-"255.255.255.0"}

                        uci -q batch <<-EOF
                                set network.$1.proto='static'
                                set network.$1.ipaddr='$ipad'
                                set network.$1.netmask='$netm'
                        EOF
                        [ -e /proc/sys/net/ipv6 ] && uci set network.$1.ip6assign='60'
                ;;

修改主机名
修改文件/package/basefiles/files/bin/config_generate

diff
        uci -q batch <<-EOF
                delete system.@system[0]
                add system system
+                set system.@system[-1].hostname='OpenWrt'
                set system.@system[-1].timezone='UTC'
                set system.@system[-1].ttylogin='0'
                set system.@system[-1].log_size='64'
                set system.@system[-1].urandom_seed='0'

修改 SSH 登陆欢迎信息
修改文件/package/base-files/files/etc/banner
可以在此处定制自己的样式

修改 dts
默认的一般够用,实在不够再更改
/target/linux/ramips/dts/目录下找到自己机型的 dts,修改以下内容

dts
                        partition@50000 {
                                compatible = "denx,uimage";
                                label = "firmware";
                                reg = <0x50000 0x1fb0000>;
                        };

其中1f60000=32M;1fb0000=16M;7b0000=8M

附:
在线进制转换工具

感谢各位前辈的分享:

https://www.right.com.cn/forum/thread-8237696-1-1.html
https://kris.run/openwrt-%E7%BC%96%E8%AF%91%E6%81%A9%E5%B1%B1l%E5%A4%A7%E7%9A%84%E6%BA%90%E7%A0%81%E8%B8%A9%E8%BF%87%E7%9A%84%E5%9D%91/

Last modification:December 18, 2022
If you think my article is useful to you, please feel free to appreciate