前情提要

本来今天是打算继续摸鱼的,但实在是没忍住写了一篇,怕过段时间就忘了。

前情提要的前情提要

怎么回事呢,这得追溯到 2020 年 8 月,我用刷了 Armbian 的 N1 盒子替换下 2014 年双十一买的树莓派 1B+(那会还在上大学,查了下淘宝购物记录才想起来具体时间)。

20 年那会 ArchiSteamFarm(以下简称 ASF)刚刚出现没多久,还是用 .netframework 作为运行库运行的,mono 库还是带的起来的,但后来随着 ASF 版本升级,就渐渐用不上了。

换了 N1 后,把 Samba、Aria2、Caddy、ASF 之类的工具部署上,这个古早的树莓派彻底进入我的「收藏抽屉」吃灰,很长时间没想起来我还有这么个玩意儿了。

这是真的前情提要

然后从 2020 年 8 月到 2023 年 11 月底,也就是前几天,N1 都还运行的好好的,直到我插在上面的硬盘盒坏了,然后我又手贱进行了一次重启之后,盒子进入启动不能的状态,看了下网上的教程知道怎么救砖,但是 USB 公对公线没有,所以淘宝现买了个。

在等线到的这个时间里,我终于从脑海里的不知道哪个犄角旮旯,想起了我之前用的树莓派 1B+ 了,但拿出来插个电,两个灯常亮,以为是寄了,就又放回去了。

11 月底,终于线到了,然后成功救砖,靠脑子恢复了里头 80% 不可恢复的数据,然后一切恢复正常。

那么这和树莓派有什么关系呢?

没有关系,就是今天在想是不是因为 SD 卡放太久导致系统寄了才启动不了的,然后看了下树莓派官网,发现 1B+ 的系统在 2014 年的 wheezy 断更之后,竟然现在又有新系统支持了,那我不得折腾一下?

熟练的下载镜像,格式化 SD 卡,写入新镜像,搞一下 ssh。然后一连,绝了!真活了!我还一度以为是坏了呢,没想到活得好好的。

但问题来了,在这个 armv6l 的机器上,要怎么才能跑得起来 ASF 用于挂卡呢?于是才有了后面的内容。

如何在树莓派 1B+ 上运行

尝试 + 搜索

那当然第一步,先试试 linux-arm 版能不能跑啊,然而最后发现是真跑不起来。

然后看看有没有运行库能用,还真没有。下载回来全部报错。

那我不能这么放弃啊,经过一番搜索,终于让我在这个 issue 里找到了些猫腻。原来有人编译出来过能跑的版本,那我试试吧就。

一顿下载运行,dotnet 是正常了,但不包含 AspNet 包,ASF 还是跑不起来,这下头大了,那怎么办呢?

1

继续搜索,在刚刚那个 issue 往下一点的位置(其实这个是先看到的,上面那个反而折叠起来了),就有另一条回复简单的描述了整个编译的过程。

但这个看起来真的很复杂,有没有什么别的法子?

柳暗花明

又是一番搜索,终于在一个[不起眼的角落]里找到了有价值的内容。

好家伙,竟然是一个支持 armv6 的 dotnet docker 镜像!包含 SDK,甚至还支持 ASP!正是我需要的,还免去了编译的痛苦。

但,问题又来了,怎么用呢?

编译 ASF

想了下,因为我不确定我能从里头提取出能在 armv6 跑的运行库,毕竟 docker 镜像是 linux/amd64,那我还不如直接交叉编译 ASF,让 ASF 自带运行库不就能运行了嘛!

说动手就动手,因为 ASF 5.5 打算上 .NET 8,而现在最新的 5.4.13.4 还是使用 .NET 7,那么跟着 ASF wiki 的编译指南,我就直接开始了。

当然,肯定是用 linux 系统开始下面的步骤,这里我用了 gitpod,懒得搞本地系统了。

下面直接贴代码吧,因为步骤真的不算少。

准备步骤 1

# 拉取并进入容器
docker run -it taphome/dotnet7armv6:latest /bin/bash
# git clone ASF 以及子模块 ASF-ui
git clone https://github.com/JustArchiNET/ArchiSteamFarm --recursive
# 安装最新的 node.js,参考官网 https://github.com/nodesource/distributions?tab=readme-ov-file#nodejs
# 因为容器内直接 root,所以不需要 sudo
## 添加 GPG Key
apt update
apt install -y ca-certificates curl gnupg
mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
## 添加 APT 源
NODE_MAJOR=20
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list
## 安装 nodejs
apt update
apt install nodejs -y
# 进入 ASF 目录,等待后续操作
cd ArchiSteamFarm/
# 切换到 5.4.13.4 的那个 commit
git checkout -b build 72703dc
# 安装个文本编辑器,等下一步用
apt install nano

准备步骤 2

因为要交叉编译,所以要修改 cc.shArchiSteamFarm/ArchiSteamFarm.csproj

ArchiSteamFarm.csproj 根据该 issue 的提示,在 <PropertyGroup> 中加入两行,修改之后应该是类似这样:

<PropertyGroup>
		<DefaultItemExcludes>$(DefaultItemExcludes);config/**;debug/**;logs/**;overlay/**</DefaultItemExcludes>
		<TargetFramework>net7.0</TargetFramework>
		<RuntimeFrameworkVersion>7.0.10</RuntimeFrameworkVersion>
		<GenerateDocumentationFile>true</GenerateDocumentationFile>
		<OpenApiGenerateDocuments>false</OpenApiGenerateDocuments>
		<OutputType>Exe</OutputType>
</PropertyGroup>

Ctrl + X 保存文件,修改 cc.sh

这里需要改后面 DOTNET_FLAGSPUBLISH_FLAGS 参数后面的内容:

DOTNET_FLAGS="-c $CONFIGURATION -f $TARGET_FRAMEWORK -p:ContinuousIntegrationBuild=true --nologo"
PUBLISH_FLAGS="-r linux-armv6 --self-contained"

这样可以生成一个自带运行库的 ASF linux-armv6 版本。

修改完之后,开始最后的编译步骤。

编译开始

没什么好说的,就一句

sh cc.sh

等跑完就完事儿。

打包,并且从容器里复制出来

编译完毕的内容在 out/result 里,而且还是一大摊,那当然是

cd out/result
tar -zvcf asf-linux-armv6.tar.gz *
# 移动到 /root 目录,方便后面复制
mv *.gz ../../..
# 退出容器
exit

然后在宿主机上运行

docker ps -a
# 找到关闭的容器 ID,然后
docker cp 363:/root/asf-linux-armv6.tar.gz .

拷贝到树莓派里试一下,完全OK,大功告成!

2

如果有想要下载我编译好的,可以在这里下载

睡觉!