10

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

 2 years ago
source link: https://blog.jinlife.com/index.php/archives/61/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

于 2022-03-02 由 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),除特别说明外内容皆为原创,可以自由转载与传播,但请署名及注明文章出处。



About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK