相信玩路由器的都了解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设置勾选允许局域网连接访问
使用sstap等全局代理工具,配置一个新的socks5 代理,地址为127.0.0.1:10808,
这里端口是对应默认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:
官方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源/官网源都行的。
那么指令示例如下:
mkdir -p /home/ubuntu/openwrt
git clone https://github.com/openwrt/openwrt.git /home/ubuntu/openwrt
如果需要检查更新,只需要
cd /home/ubuntu/openwrt
git pull
拉取项目来获得更新
如果你的网络不太好,请多试试
拉取官方项目代码库到本地完毕,可以执行feeds更新:
./scripts/feeds update -a
shfit+PageUp/Down来查看翻页,是否有error
然后我们可以选择添加自己想要的项目插件库到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
指令查看是否增添成功:
5.更新feeds并安装
接下来你可以使用./scripts/feeds update xxx
指令指定更新安装对应软件包或者 -a全部更新:
./scripts/feeds update -a
然后安装:
./scripts/feeds install -a
为了以防万一,你可以fork到自己账号以防删库。
最后将此配置保存为默认配置:
make defconfig
6.配置编译选项
各种组件包都下载安装完毕,接下来我们就可以开始配置需要编译的项目了:
make menuconfig
这是一个比较复杂的菜单页面,我们需要将要用的功能空格键或者y键勾选星号*来实现编译。同时有很多项目需要配置:
我们一项项来:
Target System
首先上下光标箭头移动选项,回车键进入选项编辑
第一个Target System目标系统,这里选择vmware下的ubuntu就用x86,你要用到自己的路由器就查询自己的路由器品牌和cpu架构
空格选好回车,然后第二项Subtarget副目标就是x86_64位系统了:
第三项 Target Images 目标镜像我们这次选择Vmware image files VMDK
下面(16)项核心分区大小设置256M吧,Root 文件系统分区则设置为512M。
最后选项参考:
光标右移到Exit回车,我们回到首页继续设置
选择Kernel Modules --> Network Devices: 配置虚拟网卡,新开一个teminal窗口,输入lspic指令查看你的虚拟网卡型号,如果列表有你的网卡选项,也勾选上,以防不兼容。
默认的e1000适应大部分的intel网卡。
Luci配置
1.collections
Luci界面是最关键的,这里有我们日常需要的各种软件,你可以按需勾选:
Collections 内选择第一项默认的Luci界面即可:
2.Luci-->Modules模块设置
Exit回到Luci-->Modules页面,选择Translations项,勾选简体中文:
3.Luci-->Applications应用设置
返回Luci页面,选择Applications项,勾选你要安装的Luci软件包:
这里有大佬归纳的大部分软件对照翻译:
插件中文名 | 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 |
阿里云盘 WebDAV | luci-app-aliyundrive-webdav |
Mentohust 锐捷拨号客户端 | luci-app-mentohust |
Minieap 锐捷拨号客户端 | luci-app-minieap |
甜糖星愿自动采集 | luci-app-ttnode |
Hello World | luci-app-vssr |
Clash(frainzy1477) | luci-app-clash |
PassWall | luci-app-passwall |
Bypass | luci-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 Home | luci-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 |
OpenClash | luci-app-openclash |
阿里DDNS | luci-app-aliddns |
动态 DNS(支持阿里腾讯) | luci-app-ddns |
QoS Nftables 版 | luci-app-nft-qos |
SmartDNS | luci-app-smartdns |
LXC Containers | luci-app-lxc |
天翼家庭云/天翼云盘提速 | luci-app-familycloud |
网络唤醒 | luci-app-wol |
WatchCat | luci-app-watchcat |
UU游戏加速器 | luci-app-uugamebooster |
VPN 绕过 | luci-app-vpnbypass |
Frps | luci-app-frps |
Frp 内网穿透 | luci-app-frpc |
UPnP | luci-app-upnp |
Nps 内网穿透 | luci-app-nps |
迅雷快鸟 | luci-app-xlnetacc |
OpenConnect VPN | luci-app-ocserv |
OpenVPN(客户端) | luci-app-openvpn |
uHTTPd | luci-app-uhttpd |
KMS 服务器 | luci-app-vlmcsd |
RP PPPoE Server | luci-app-rp-pppoe-server |
IPTV 帮手 | luci-app-iptvhelper |
组播代理 | luci-app-omcproxy |
udpxy | luci-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 |
Rclone | luci-app-rclone |
miniDLNA | luci-app-minidlna |
Transmission | luci-app-transmission |
FTP 服务器 | luci-app-vsftpd |
PCHiFi 数字转盘遥控 | luci-app-music-remote-center |
qBittorrent | luci-app-qbittorrent |
aMule | luci-app-amule |
BaiduPCS Web | luci-app-baidupcs-web |
N2N v2 VPN | luci-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 |
ZeroTier | luci-app-zerotier |
IP/MAC绑定 | luci-app-arpbind |
简单MESH | luci-app-easymesh |
流量统计 | luci-app-bandwidthd |
网速测试 | luci-app-netspeedtest |
SQM QoS | luci-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 |
IPV6 | ipv6helper |
更多插件说明:
https://www.right.com.cn/forum/thread-344825-1-1.html
这里附上更新到2022.11月的插件翻译说明表格:
OpenWRT编译LUCI插件说明2022.11.xlsx.zip
4.里面的Luci-app-passwall务必选上,
这是我们这次要安装的翻墙工具包,下面的Configuration-->配置选择进去勾选你需要的功能:
5.接下来回到Luci-->Applications 列表,选择 Luci-app-ssr-plus,也就是我们需要的SSRplus+上网大师:
各种工具的核心选择,配置情况供参考
6.Luci-->Themes 主题选择
外观党可以全部勾选
7.Luci-->Protocols支持协议
这里随意吧,一些国内没啥用的普通隧道协议
所有配置项设置完毕,接下来就是编译阶段了
7.下载所有组件,开始编译
make download -j8 V=s
-j8
是指使用8个线程下载,在网络正常的情况下,基本5分钟下载完毕
注意是否有下载失败的错误日志,然后自己去当前目录dl文件夹下排序看看最小文件是不是小于4kb,如果有,应该是下载不完整的文件,删了重下一次。
- 单线程编译,第一次使用单线程编译方便查看错误
make -j1 V=s
- 以最大线程编译
make V=s -j$(nproc)
大概3-4小时单线程编译
我虚拟机创建的8核心16线程,所以这里用的-j16跑满了i7 12700k,大概20来分钟完毕
温馨提示:使用V=99
用来查看更详细的日志情况,灵活使用筛查工具可以更清晰定位错误:
make -j16 V=s 2>&1 | tee build.log | grep -i -E "^make.*(error|[12345]...Entering dir)"
编译完成后输出路径:bin/targets/x86/64
拿到我们需要的文件后,就可以用vmware安装配置使用了,参考前篇文章VMware路由配置:
新版本的openwrt使用device来替代ifname,由于之前路由使用了192.168.0.88这个ip,我们现在第二个路由就修改到192.168.0.89,新建一个vmnet03,dhcp分配局域网ip段为192.168.12.xx ,这样就可以一起使用,自己管理自己对应的vmnet下接入的虚拟机了:
希望你也能尽快享受到使用自己编译的openwrt:
四、 一些提示和错误分析
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应该就行了:
建议先尝试只编译原版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/
2 comments
checkout指定版本之后,luci package直接用最新的,会不会容易出问题?我发现用指定版本的软件源版本编译没有问题,直接用最新出错概率更大
可以用指定的版本,毕竟内核还可以在路由器上手动升级的,我这个是当时xray vision流控只在测试版本1.6.6-2才有,所以编辑了一套最新的。没特殊需求,自己怎么稳定怎么来吧。