成熟的软路由
一个成熟了的软路由该是什么样子的?应该是会自我编译,会自我升级。利用 openwrt 里的 docker 环境,编译出固件并进行自我升级。
一个成熟的软路由需要:
- 不太差的硬件配置
- 不太差的网络环境
- openwrt + docker 环境
成熟之前的准备
安装好 openwrt x86 和 docker 之后(网上安装教程比较多不再累述),在 docker 里部署用于编译 openwrt 的 ubuntu 系统,我这里提供了集成编译 openwrt 的 ubuntu 系统镜像,有兴趣的也可以自己制作一个镜像。
登录 openwrt ssh:
# mkdir /opt/openwrt/
# docker pull noreph/ubuntu:latest
# docker run -d --restart=always -name op -p 2201:22 -v /opt/openwrt/:/home/ noreph/ubuntu:latest
ps:2201 是容器对外的 ssh 端口,可自行修改;/opt/openwrt/ 挂载到容器 /home/,方便在 openwrt 里取到编译出的固件用于升级。
使用 ssh (账号 root,密码 123456)登入开启的容器后,新建普通用户用于编译 openwrt,假设用户名为 abc:
# useradd -m -g root -s /bin/bash abc
切换到 abc 用户:
# su - abc
下载 lean 的 openwrt 源码(我这里用的是大雕的源码):
$ git clone https://github.com/coolsnowwolf/lede
进入源码目录并编译(建议编译前使用 screen):
PS:make menuconfig 一定要记住勾选 docker
$ cd lede
$ ./scripts/feeds update -a
$ ./scripts/feeds install -a
$ make menuconfig
$ make -j1 V=s
编译无误后就可以进入成熟的阶段了。
成熟的软路由
上面已经为成熟的软路由打好了各种基础,现在距离成熟只差自动更新源码、自动编译和自动升级了,而这几步用一个脚本和定时任务就可以完成了。
接上面编译完成后输入 cd 切换到 abc 的家目录,新建一个脚本(vi 用法自行搜索使用):
$ vi openwrt.sh
键入以下内容:
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
# 获取源码最新更新时间
lede_update_time=$(curl -s https://api.github.com/repos/coolsnowwolf/lede | grep -i "updated_at" | tr -d '[ \t]')
# 获取上次本地更新源码的时间
last_update_time=$(cat ~/.lede_update | tr -d '[ \t]')
# 对比两次更新时间,一致退出脚本无需更新
if [ "$lede_update_time" = "$last_update_time" ];then
exit 0
fi
# 去掉定时任务
crontab -l | grep -v '/home/abc/op.sh' | crontab -
# 进入自我编译模式
cd ~/lede
rm -rf tmp
rm -rf bin/targets/*
git pull
./scripts/feeds update -a
./scripts/feeds install -a
make -j1 V=s
# 判断返回值,有错误退出脚本。此处可加入通知,比如用 telegram 的 bot API 进行通知编译成功与否。
if [ $? -ne 0 ]; then
exit 1
fi
cd ~
# 记录本次更新源码的时间
echo $lede_update_time > ~/.lede_update
# 加上定时任务检查代码更新,在凌晨 3 点到早上 7 点之间没小时检查一次,避免在白天升级影响上网,可自行修改
(crontab -l ; echo "0 3-7 * * * /home/admin/op.sh > /dev/null 2>&1") | crontab -
# 在容器内登录到 openwrt 的 ssh,使用 sysupgrade 命令进行自我更新
ssh [email protected] "sysupgrade -v /opt/openwrt/abc/lede/bin/targets/x86/64/openwrt-x86-64-combined-squashfs.img"
PS:这里的登录 openwrt 我用密钥登录,免去输入密码的烦恼(其实是我不会解决 ssh 自动用密码登录的问题),自行解决密钥登录 ssh 。
最后开启软路由的成熟模式:
开启定时任务执行脚本
$ (crontab -l ; echo "0 3-7 * * * /home/admin/op.sh > /dev/null 2>&1") | crontab -
最后总结:
整个过程就是,部署好编译用的环境,使用脚本定时执行源码更新、固件编译,然后在 openwrt 里获取到固件并进行升级。思路扩展,只要把自动编译这一部分放在其他地方,比如 vps 上,编译后了之后给出下载地址,在 openwrt 里获取到固件使用 sysupgrade 命令升级就可以了,这样每个路由器(openwrt)都可以是一个成熟的路由器了(不怕变砖的话)。
你若要问我这么做的意义,意义就是可以这么玩。
