今年618买了两台红米AX6S路由器,组mesh网把家里面的wifi全线升级一下。然而,次卧里面的信号还是不太好,老爸还是有意见。为了不破坏mesh组网的漫游功能,只能再搞一台小米路由器加入mesh网。

因为已经花了不少钱了,于是准备尽可能少花钱把这事给办了。研究了一通之后,发现最便宜的能组mesh的小米路由器是与网络运营商合作的机器。运营商合作款系统上都是绑定网络,就需要刷机成官方系统后才能与其它小米路由器组mesh。

再研究之后,其中cr660x系列是便宜,也是最简单可以刷机的机器。咋一看所有的说法都是,直接用官方恢复工具,刷入AX1800的系统,就可以当官方AX1800来用了。因为没有再提到别的什么注意事项,于是在某拼上以最便宜的价格随便入手了一款。

到手时一看是联通订制的cr6606,上手就开始刷机。然而刷机之后却发现,并没有刷机成功的蓝灯。而是闪烁着一种奇怪的紫灯。系统也没有成为AX1800,还是cr6606。几次折腾后去网上一搜,发现居然也有不少人说有同样的问题。cr6606无法刷机!
当时我就慌了,图省钱买个便宜货来刷机。难道反而要亏掉这一台路由器的钱……
幸好后面看到有人提到,他解锁ssh后,刷了cr6608(移动订制款)的bootloader后,可以刷ax1800固件。
顿时我就觉得我又行了!

因为解锁ssh需要另外一台支持wifi的openwrt路由器,家里面没有。只好找玮哥借了一台传说中的K3让我折腾,恩人啊……

借到K3后,就正式开始了折腾之旅……
首先,解锁ssh就基本上把能踩的坑都踩了一遍。具体过程省略1000字……
ssh联上后,立马又出了一个问题,没有root密码…… 搜索了一番后,有人说到密码是通过SN计算出来的,并提供了计算的工具网站。但是我怎么算也还是登不上去,一度十分绝望…… 最后,终于发现有人提到。联通定制版的密码计算方式与官方版本不一样,那个网站只能计算官方版本的密码。于是我又必须先刷官方的cr6606固件……

一番折腾刷成官方cr6606固件后,终于成功的登录了ssh。这时又发现通过scp无法复制文件到到路由器上,报了一个找不到sftp的错误。差点准备在本地搭一个ftp服务端,然后从路由器上拉文件过去了。再研究了一下发现原来是不支持sftp协议,强制指定scp协议后就可以拷文件了。

因为看到有人提到他们的cr6606是可以直接刷ax1800固件的,加上总觉得刷6608的bl会不会有风险。所以决定先刷一个他们提供的6606的bl看看能不能解决问题。
这次刷6606的BL,再刷AX1800的尝试喜闻乐见的失败了……
最终再次解锁ssh后(每次重启路由器都要重新解锁),刷入cr6608的bootloader,成功通过官方恢复工具刷入了AX1800的固件。
重启后成功被识别为AX1800路由器,并与之前的AX6S路由器成功组成mesh网络。这几乎一天的艰难折腾,总算没有白费……

最后总结一下整个最简刷机流程。

联通cr6606 -> 刷官方cr6606固件 -> 解锁ssh(最烦步骤) -> 刷移动cr6608 Bootloader -> 刷官方AX1800固件

感受就是实在是麻烦得半死…… 有类似打算的哥们千万直接购买移动cr6608版本,可以直接刷AX1800固件。省去非常多的麻烦……

截止2022年6月14日,在Ubuntu 20.04.4 LTS中使用apt包管理通过自带默认源来安装golang的话,还是老旧的1.13版本。
而目前一些工程都已经要求使用1.18版以上的编译器来编译。

直接通过官方发布的包来更新终究是麻烦,还想用apt来更新就得添加第三方的源了。

sudo add-apt-repository ppa:longsleep/golang-backports

如果还未安装,就直接安装。

sudo apt install golang-go

如果已经安装了默认源的旧版本,可以先更新到新版本,再删除掉旧版本。

sudo apt upgrade golang-go
sudo apt autoremove

这个源目前已经更新到最新的稳定版本1.18.3

chrome是目前地球上最成功的浏览器,而它的开源项目chromium也是最重要的开源项目之一。
研究chromium的源码,就成为很多人(比如我)重要的工作与学习手段。但是在国内想要check一份可构建的chromium源码其实并不太容易。除了众所周知的原因外,也因为chromium经过长期高速的开发和迭代之后,积累下来了庞大的源码。

如果按官方文档中的方法check源码,默认会check出当前最新的开发版代码。
或者拉回完整的git仓库,再check到指定的稳定版tag。这样很可能会拉回很多我们根本不需要的分支和tag。

实际上,是可以从零开始,直接check出指定的tag代码的。

那么让我们开始之前,假设已经满足了以下条件。

  1. 克服了众所周知的问题。这个只能自己想办法……
  2. 安装了所有需要的开发环境,比如depot_tools等。这个可以参考官方文档。

此方法适用于所有平台。以目前最新官方正式版本102.0.5005.63为例。

首先创建存放代码的目录:

mkdir chromium
cd chromium
mkdir src

创建纯文本文件.gclient并写入以下内容:

solutions = [
  {
    "name": "src",
    "url": "https://chromium.googlesource.com/chromium/src.git",
    "managed": False,
    "custom_deps": {},
    "custom_vars": {"checkout_pgo_profiles": True,},
  },
]

如果是要构建android平台的浏览器,就在这个文件最后添加一行内容:

target_os = ["android"]

接下来创建一个空的git仓库,来同步指定的tag。

cd src
git init
git remote add origin https://chromium.googlesource.com/chromium/src.git
git fetch origin tag 102.0.5005.63

最后一步就是在从官方的git中同步指定的tag。这个步骤是整个过程中最耗时的一步。具体的时间取决于网络情况与tag的新旧程度。越新的tag,需要同步的数据也就越大。
耐心等待tag同步完成。完成后src目录下还是空空如也,并没有代码文件。这时候就需要创建一个本地分支,从tag中check出代码。

git checkout -b local_102.0.5005.63 102.0.5005.63

这个步骤很快,完成后目录下就有chromium的代码了。但是目录中的代码还是不能构建出chromium浏览器,还缺少依赖的一些第三方工程,和构建需要的工具链。
接下来继续同步这些内容:

cd ..
gclient sync -D --with_branch_heads --with_tags

这个步骤也会花费一些时间,并且网络不佳的情况下还有可能会失败。不断重试直到最后全部成功就好。

当这个步骤完成后,完整的一份可构建的chromium源码就完成了。你可以构建出自己的chromium浏览器了,具体方法还是参考官方文档。

在这份代码上,还可以继续同步别的tag代码。只要把上面步骤中出现的版本号换成需要的tag版本号就可以了。这样可以节省不少的时间。

自己编译了openwrt固件,朋友试用之后,说web管理界面太丑了……
我是实用派,一开始完全没在意外观的问题。听朋友这么一说决定给换个默认主题。

看了一下目前lean使用的主流界面是argon,就决定用它了。

https://github.com/jerrykuku/luci-theme-argon.git

根据argon官方文档的说法,他的主分支是跟随openwrt官方版本的。而lean目前只支持18.06这个分支。

首先进入lede的根目录中,拉取最新的代码:

cd lede
rm -rf package/lean/luci-theme-argon
git clone -b 18.06 https://github.com/jerrykuku/luci-theme-argon.git package/lean/luci-theme-argon

替换默认主题:

sed -i 's/luci-theme-bootstrap/luci-theme-argon/' feeds/luci/collections/luci/Makefile

因为个人有点小洁癖,不喜欢带不需要的东西,所以只想带一个主题。运行:

make menuconfig

进入LUCI->Theme,选中Luci-theme-argon,并去掉原来默认的luci-theme-bootstrap主题。

接下来正常编译就行了。

使用的是lean的源:

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

大体步骤与文档中描述的基本一致,但是因为是在arm64的主机上。因此有几个点与x86机器编译不同,这里记录一下。

编译的系统是Ubuntu 20.04 aarch64。
首先安装编译环境的包就与x86不太一样。具体是:

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

用git拉回代码后,还需要加入特别需要的包。
feeds.conf.default 文件中添加三行:

src-git kenzo https://github.com/kenzok8/openwrt-packages
src-git passwall https://github.com/xiaorouji/openwrt-passwall
src-git small https://github.com/kenzok8/small

更新 feeds 什么的跟官方文档一样。

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

接下来,重点来了。必须多做一件与x86系统不同的配置,否则会报这个错误。

Makefile:366: * go-bootstrap cannot be installed on linux/arm64. Stop.

看报错信息,是编译过程无法安装go到arm64系统上。所以需要手动安装golang,并把路径设置到编译配置中。
在配置编译参数时:

make menuconfig

要加入以下设置:

Languages > Go > Configuration > External bootstrap Go root directory

按上面的环境安装后,go应该默认在 /usr/lib/go 目录下。将 /usr/lib/go 写入这项配置。

(/usr/lib/go) External bootstrap Go root directory

选好其它需要的配置后,开始编译:

make download -j8
make V=s -j1

慢慢等待编译完成吧。编译完成后输出路径:bin/targets

需要更新代码再次编译的话:

cd lede
git pull
./scripts/feeds update -a
./scripts/feeds install -a
make defconfig
make download -j8
make V=s -j$(nproc)

如果需要重新配置:

rm -rf ./tmp && rm -rf .config
make menuconfig
make V=s -j$(nproc)

PS:第一次编译有概率会出现一个错误。

bash: po2lmo: command not found

这个是因为包依赖关系没有处理好,被依赖的luci-base包没有先编译出来。所以只要先编译好就可以了。
用以下命令指定编译luci-base

make package/feeds/luci/luci-base/compile V=99

给编译的固件加个自己的签名……

cd lede
vim package/lean/default-settings/files/zzz-default-settings

找到DISTRIB_REVISION或者DISTRIB_DESCRIPTION,加上想要添加的内容。比如:

(Compiled by winger. On $(date +%F))