2022年5月

自己编译了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))

用rust编写了一个dll给别的程序调用,但是因为之前是编译为i686-pc-windows-msvc目标。这样生成的文件对msvc运行库有所依赖,造成一些没有vc运行库的机器运行有问题。

于是打算编译为i686-pc-windows-gnu目标试试。在windwos下尝试指定目标为i686-pc-windows-gnu后,首先报找不到i686-w64-mingw32-gcc这个编译器。因为不想在windows下装cygwin再装MinGW-w64,所以决定转战linux。在linux下通过MinGW-w64交叉编译为windows的dll。

然而在linux下指定这个目标后,又报了一堆的错误。总结下来就是链接的时候,两个函数找不到链接的目标。分别是_Unwind_RaiseException与_Unwind_Resume。

网上翻找了一堆的方法后,通过添加编译参数“-C panic=abort”消除了_Unwind_RaiseException这个函数的链接。然而_Unwind_Resume这个链接怎么也没有办法解决。甚至有人已经下结论这个问题没法解决。

PS:如果指定为x86_64-pc-windows-gnu(64位)目标是没有问题的,但是项目要求必须是32位。

最后实在没有办法的时候,想了一个损招,自己实现并导出了一个叫_Unwind_Resume的方法……

#[cfg(target_arch = "x86")]
#[no_mangle]
pub extern "C" fn _Unwind_Resume() -> ! {
    panic!("call _Unwind_Resume function, so crash and burn!");
}

终于编译过去,因为没有异常处理,所以运行起来也暂时没什么问题。先这么凑合用吧。看以后官方会不会修复这个问题……

昨天发现,新创建的免费主机,却默认创建了非免费的引导卷。造成了对赠送的SGD扣款。

研究了跟我相同情况的一位朋友,和另外两位完全不扣费的同事的差异。终于发现了很大可能的情况。

在oracle试用帐号刚刚注册完成时,系统会提示正在配置帐号,配置完成后会发邮件通知。正常的两位同事都是在注册后很快就收到了提醒邮件,并正常登录后创建了免费主机。

而我和另一位朋友的情况是,迟迟没有收到邮件,并且在当天无法登录。在第二天还没有收到邮件的情况,尝试登录成功后,就在没有收到邮件的情况下创建免费主机。

在没有收到邮件的情况下登录,在系统中会提示帐号配置未完成,有部分功能无法使用。可能无法使用的功能就包括了免费引导卷。这种情况下创建的引导卷就不是永久免费的,也不会占用免费的200G免费额度。

新申请了一台oracle试用的免费主机。创建实例的时候,明确按照永久免费的范围设置。然而第二天却发现送的400 SGD发生了扣款。当时没有在意,又过了一天又产生了同样的扣款。这才好奇到底是哪里产生了费用。

通过计费查询功能,发现是Block Volume Storage与Block Volume Performance产生了费用。这就非常神奇了,因为我在块存储那边查看,并没有创建任何块存储。只有一个创建实例时,随实例自动创建的引导卷。

跟完全不扣费的同事创建的实例对比之后,终于发现他的实例上引导卷标记为永久免费,而我的引导卷却并没有!看来问题就出在这里,是这个引导卷产生了费用。

解决的办法就是把引导卷从实例中分离出来,编辑一下。引导卷就显示为永久免费了。再附加回实例上,启动实例。
目前看来并没有产生新的费用,具体再观察几天看看。