NanoPi-R2S的Openwrt系统中运行dotnetcore的程序

由 jinlife 发布

现在dotnetcore的程序不止支持X86的Linux,也已经可以支持ARM系统。貌似从dotnetcore V3.1就已经开始能支持了。现在的V5.0, V6.0 和 V7.0支持起来更是没问题。
最近需要用到R2S来运行一些dotnetcore的程序,所以稍微调查研究了下。R2S当前的CPU是Rockchip RK3328, 四核 Cortex-A53。

目前网上最火的一篇文章是在树莓派4上面的Openwrt里面运行dotnetcore。本来想参考在R2S里面玩一下,不过可惜我这边没成功。最终还是靠万能的Docker实现了,也比较简单。
https://davidjmclaughlin.com/projects/how-to/2020/03/15/running-.net-core-on-openwrt-and-raspberry-pi-4.html
按上面的文章,装了dotnet的runtime后,再装了那几个依赖库libstdcpp6等,还是出现如下问题
Error relocating ./dotnet: _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7reserveEm: symbol not found
猜测可能是ARM上面的库缺函数,不匹配。这个不好解决,咱就不浪费时间了。

另外,参考如下X86的也没成功。
http://xuxiaorong2014.github.io/programming/dotnet-core-openwrt.html

前期准备

  1. 硬件准备个R2S,带个8G的SD卡,还有SD卡烧写器。
  2. 编译或者找到一个能支持Docker的R2S的Openwrt固件。
  3. 找到能支持ARM64的.NET Core musl的Docker。
  4. 准备一个aspdotnetcore的测试程序。

原生系统的尝试

直接在Openwrt系统里面运行Dotnetcore.
下载aspdotnet的库

wget https://download.visualstudio.microsoft.com/download/pr/b6bb9baf-d083-49bf-be3e-9c49f0431595/5362de83ac461764edceaca561182cfc/aspnetcore-runtime-5.0.14-linux-musl-arm64.tar.gz

用如下命令解压

tar -xzvf aspnetcore-runtime-5.0.14-linux-musl-arm64.tar.gz -C dotnet

进入dotnet目录运行 .\dotnet 会报很多错,装上依赖库,还是一堆错。于是放弃,先记录在这,等以后有空再试试。

Docker基本操作

支持Docker的R2S的Openwrt固件。

推荐到这里下载: https://github.com/DHDAXCW/NanoPi-R2S/releases
有能力可以Fork之后自己定制一个。

烧写Openwrt的固件至SD卡

将编译好的Openwrt固件下载到本地,一般都是如下squashfs格式,也可以用ext4的。

openwrt-rockchip-armv8-friendlyarm_nanopi-r2s-squashfs-sysupgrade.img.gz

Windows上面使用balenaEtcher-Portable-1.7.7.exe工具,直接将上面的镜像文件烧到SD卡里面去。烧写完成后,Windows将无法识别这个SD卡的Linux的文件格式,不要格式化,直接插入到R2S里面使用。
balenaEtcher 下载地址 https://github.com/balena-io/etcher/releases

拉取Docker镜像

支持ARM64的Docker

这个微软官方有提供,我这边用的.NetCore V5.0的Docker。路径是

mcr.microsoft.com/dotnet/aspnet:5.0.14-alpine3.14-arm64v8

更多版本可以到这里找到: https://hub.docker.com/_/microsoft-dotnet-aspnet
2022-03-02T04:00:07.png
注意得是 arm64v8 的才支持R2S的CPU, 其他的dotnet会运行起来没反应,说找不到文件之类的。

运行Openwrt成功后,在Docker下面的镜像页面拉取上面微软的官方dotnetcore的路径。
2022-03-02T04:39:37.png

创建Docker成功后,可以在Docker里面运行dotnet --info命令看看是否正常。一般没啥问题。
2022-03-02T04:45:16.png

运行程序

运行docker成功后可以把publish出来的测试程序丢上去跑一下,应该没啥问题。docker的好处就是不用管库啥的,环境都是好的,只要运行程序即可。

编译aspdotnetcore程序

准备一个aspdotnetcore的测试程序,工程的大版本需要跟Docker里面的运行时一致。我这边也是5.0
运行如下命令生成所需的文件,必须要指定目标编译是linux-musl-arm64的runtime,不需要自包括运行时,Docker里面都有,最后会生成一些文件在app目录里面。

dotnet publish -c release -o /app -r linux-musl-arm64 --self-contained false --no-restore

可以把这个app目录用7zip软件压缩成tar格式的压缩包,然后用下面的页面上传到Docker里面即可自动解压,可以在Docker里面运行这个aspdotnetcore程序看看情况。
2022-03-02T04:49:32.png

自定义Docker

如果想发布自带aspdotnetcore测试程序功能的自定义Docker,可以参考如下Dockerfile做一个。
注意上层目录有个 aspnetapp 的程序,这样生成的docker自带runtime运行时和aspnetapp程序。
https://github.com/dotnet/dotnet-docker/blob/main/samples/aspnetapp/Dockerfile.alpine-arm64

R2S用Docker跑dotnetcore很简单,没什么库问题要解决,用Alpine的镜像也占不了多少硬盘,运行起来大概也就占几十MB的内存。R2S的1G内存,8G的SD卡硬盘跑起来绰绰有余。可以将Docker里web程序的80换个端口,不跟Openwrt的冲突,然后设定host网络之后可以直接用Openwrt的IP访问,跟装在Openwrt里面运行没啥区别。还能隔离开,出了问题也互不干扰。

本文作者:jinlife
本文链接:NanoPi-R2S的Openwrt系统中运行dotnetcore的程序 - https://blog.jinlife.com/index.php/archives/61/
版权声明:本博客内容遵守 “署名-非商业性使用-禁止演绎 4.0 国际”协议(CC BY-NC-ND 4.0),除特别说明外内容皆为原创,可以自由转载与传播,但请署名及注明文章出处。

暂无评论

发表评论


captcha
请输入验证码