最近想在麒麟系统上运行.NET 6程序,经过一番折腾最终完成了,简单记录一下。

目标系统:

  • CPU: aarch64架构(ARM64)
  • 操作系统:银河麒麟V10高级服务器系统

银河麒麟V10系统(以下简称麒麟)使用的是redhat类似的dnf包管理方式,但是无法安装epel,因此很多软件无法直接包安装。

方案

  1. 直接在麒麟上安装dotnet,并运行dotnet程序

    这种方式很直接,无奈dotnet不支持在ARM64架构下的包管理安装,只能使用snap、安装脚本或者手动进行安装。然后snap我在麒麟上发现也不好装,一直没有成功;安装脚本需要连接国外的服务器,我这联外网有点问题,死活是装不上;手动方式我觉得好麻烦,直接放弃吧。

感兴趣的朋友可以参考这两篇文章:文章1文章2

  1. 通过docker的形式执行dotnet程序

    这种方式兼容性强,只要对应依赖的组件有aarch64版本的docker镜像就可以用,dotnet是有的,麒麟也支持docker。

于是乎选择的使用docker进行部署,由于还需要部署数据库,选择使用docker-compose是更好的选择。只需要在系统中执行

dnf install docker docker-compose

系统即可安装好必要的docker组件。

要点记录

有关如何将在Docker上运行.NET 6程序,很多文章已经有写,官网也有很详细的说明,我就不重复了写了。

.NET程序参数传递

传统上.NET程序一般使用appsettings.json进行参数的设置,在docker中,为了配置方便,更多使用环境变量进行参数的传递,默认.NET依赖注入的IConfiguration就可以直接读取环境变量,但是对于手动的情况,需要指定AddEnvironmentVariables()方法:

var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true)
.AddEnvironmentVariables()
.Build();

如果需要设置如下参数:

  "IdentityConfig": {
"server.urls": "http://*:5000", // 服务地址
}

那么在docker-compose设置中应当这么写:

environment:
# - ASPNETCORE_ENVIRONMENT=Docker
- IdentityConfig__server.urls=http://*:5000 #

冒号在yaml配置中应当替换为两个连续下划线“__”,dotnet读取配置的时候,依然可以使用config[IdentityConfig:server.urls]获得参数。

Dockerfile设置

选择docker这种方式的话,需要从源代码编译.NET应用,因此在执行Dockerfile的时候,会执行dotnet restore之类的命令,强烈建议换成国内的nuget源,国外的还是慢了点。

国内的有:

EMQ X设备用户名与密码登录

最为非常流行的mqtt服务器,emqx也提供了docker的安装方式。这里需要说一下,现在很多mqtt设备只能支持固定的用户名和密码登录,因此启动docker的时候,需要通过文件指定(在EMQX 4.4上测试通过)。

volumes:
- ./emqx/emqx_auth_mnesia.conf:/opt/emqx/etc/plugins/emqx_auth_mnesia.conf

文件内容很简单:

## Password hash.
##
## Value: plain | md5 | sha | sha256 | sha512
auth.mnesia.password_hash = plain ##--------------------------------------------------------------------
## ClientId Authentication
##-------------------------------------------------------------------- ## Examples
##auth.client.1.clientid = id
##auth.client.1.password = passwd ##--------------------------------------------------------------------
## Username Authentication
##-------------------------------------------------------------------- ## Examples:
auth.user.1.username = test
auth.user.1.password = test
##auth.user.2.username = feng@emqtt.io
##auth.user.2.password = public

postgesql数据库文件配置

由于对docker的volume机制不是很熟悉,即便指定了文件夹映射(./postgres_data:/var/lib/postgresql/data),新建了数据库之后,工作虽然一切正常,但是宿主文件夹内部没有任何东西,每次docker-compose down删除了容器后,数据消失的一干二净。最后按照文档的对数据存储的推荐方式,指定了PGDATA最后得以解决。

    volumes:
- ./postgres_data:/var/lib/postgresql/data/pgdata
environment:
POSTGRES_PASSWORD: "123456"
PGDATA: "/var/lib/postgresql/data/pgdata"

关于docker volume一些行为没太摸清楚,现在感觉是如果指定一个空文件夹映射,只有在容器内新生成的文件才能出现的宿主中,以后有机会在研究吧。

VNC设置

一直比较习惯使用xrdp,通过windows自带的远程桌面访问linux,不过麒麟系统dnf里面并没有这个包。只能用VNC了。大体步骤和[这篇文章](https://blog.csdn.net/qq_28903377/article/details/116565345写的一样,只要给麒麟安装上server并配置启动就好了,我稍微简化了一下,因为dnf源里面自带了tightvnc-server,不需要手动下载了,直接

dnf install tightvnc-server

客户端只要安装tightvnc-viewer就可以了。

docker-compose

  • 按照docker官方的说法,执行docker-compose up -d的时候,会自动加载docker-compose.yml以及docker-compose.override.yml两个文件。如果使用-f参数指定其他名称的文件时,比如:docker-compose-linux.yml,请注意,docker不会自动加载docker-compose-linux.override.yml文件。
  • docker-compose对同一个网络内的服务设置了服务名称的主机名解析,因此需要在服务之间相互访问(常见于反向代理)时,不应该使用IP,而应该使用服务名称替代。
  • docker-compose内可以指定healthcheck进行服务的健康检查,如果对启动顺序要求比较高的话,建议加上,如何对.NET 6程序进行健康检查,官方有一个文档,但是一些步骤不是很清楚,以后有机会单独写一篇。
  • 停止docker-compose运行的服务时,不要使用docker-compose down,这个命令会删除所有的容器,容器产生的信息在没有正确使用volumes的情况下会丢失,建议使用docker-compose stop替代。
  • docker-compose.yml中,需要谨慎设置build节中的context与dockerfile,参考Dockerfile确定它的当前目录是什么设置context。
  • 成功编译并且运行docker-compose后,可以删除.NET项目源代码并删除docker-compose.yml中的build设置,只要不删除image,容器依然可以正常启动。

总结

aarch64上的国产银河麒麟v10系统,已经有很多软件可用了(redis、pg等),可能还有一些软件无法适配(只支持x64平台的),但是对于.NET程序来说,由于runtime已经完全支持aarch64,绝大部分应用可以正常运行。

本文使用docker-compose在linux与windows(windows desktop wsl2)上都测试.NET 6通过。

.NET 6应用程序适配国产银河麒麟V10系统随记的更多相关文章

  1. 国产银河麒麟 安装wps 的简单方法

    前提说明 银河麒麟 是总部在天津的企业 有国防科大还有 ubuntu的母公司一起在维护 主要的产品有 优麒麟 还有 银河麒麟 优麒麟 可以看做是 国产版的ubuntu的社区版 银河麒麟 则是 面向国内 ...

  2. 银河麒麟V10安装ASP.NET Core并配置Supervisor让网站开机自动运行

    银河麒麟高级服务器操作系统V10是针对企业级关键业务,适应虚拟化.云计算.大数据.工业互联网时代对主机系统可靠性.安全性.性能.扩展性和实时性的需求,依据CMMI 5级标准研制的提供内生安全.云原生支 ...

  3. ubuntukylin16.04LTS(乌班图麒麟版长期支持版,并非银河麒麟)安装体验

    最近,国产银河麒麟版在政府部门推广使用.我有幸接触了,感觉还是不错的.这次政府软件正版化整改中,也列入了windows和银河麒麟的选项.我想试安装一下,可是没找到.就近找了它的类似系统ubuntuky ...

  4. C# 搞桌面UI适配国产麒麟Linux+龙芯遇到的一些坑

    由于一些国企有国产化的需求,所以搞了C#适配银河麒麟,适配了X64和龙芯MIPS版本 1. 在银河麒麟的龙芯版本中 pipe2 不能使用,x64版本上却可以用.  pipe2 用来做自定义消息的,搞U ...

  5. [转帖]银河麒麟Kydroid 2.0全新发布:原生支持海量安卓APP

    银河麒麟Kydroid 2.0全新发布:原生支持海量安卓APP https://news.cnblogs.com/n/652299/将手机操作系统 转移到 桌面 跟chromebook 类似的策略吧 ...

  6. 国产化之虚拟ARM64-CPU安装银河麒麟操作系统

    背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟v4,CPU使用飞腾处理器.我本地没有这个国产的处理器,但飞腾是基于ARMv8架构的64位处理器,所以理论上基于这个CPU架构的硬件应 ...

  7. 国产化之银河麒麟安装达梦数据库DM8

    背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟,数据库使用DM8. 虽然在之前的文章中已经成功模拟国产飞腾处理器,但是运行效率不高,所以这里的银河麒麟操作系统还是运行在x64平台上 ...

  8. 国产化之银河麒麟安装.NetCore-包管理器方式

    背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟,数据库使用达梦V8,CPU平台的范围包括x64.龙芯.飞腾.鲲鹏等. 考虑到这些基础产品对.NETCore的支持,最终选择了3.1版 ...

  9. 国产化之银河麒麟.netcore3.1访问https服务的两个问题

    背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟,数据库使用达梦V8,CPU平台的范围包括x64.龙芯.飞腾.鲲鹏等. 考虑到这些基础产品对.NETCore的支持,最终选择了3.1版 ...

随机推荐

  1. 意味着JNPF迈入新时代的3.4版本,与3.3.3版本有着哪些功能区别呢?

    在线开发‍ 3.3.3版本 同一个功能分功能设计和移动设计 功能设计没有更换模式 功能设计没有同步菜单 功能设计和移动设计无表模式 3.4.1版本 同一个功能可以在功能设计里面设计,根据客户需求自己选 ...

  2. SmartIDE v0.1.18 已经发布 - 助力阿里国产IDE OpenSumi 插件安装提速10倍、Dapr和Jupyter支持、CLI k8s支持

    SmartIDE v0.1.18 (cli build 3538) 已经发布,在过去的Sprint 18中,我们集中精力推进对 k8s 远程工作区 的支持,同时继续扩展SmartIDE对不同技术栈的支 ...

  3. singlelinklist

    C++实现单链表 阅读先知 链表是一种动态数据结构,他的特点是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放数据元素. 链表中每一个元素成为"结点",每一个结点都是由数 ...

  4. java面试:关于public static void main(String[] args)是什么意思?

    它是作为JAVA中的主函数,所有java程序的运行起点就是这个方法,除了args这个名字可以不一样外,其他必须是这样. 主函数的一般写法如下: public static void main(Stri ...

  5. python和numpy中sum()函数的异同

    转载:https://blog.csdn.net/amuchena/article/details/89060798和https://www.runoob.com/python/python-func ...

  6. [react] 什么是虚拟dom?虚拟dom比操作原生dom要快吗?虚拟dom是如何转变成真实dom并渲染到页面的?

    壹 ❀ 引 虚拟DOM(Virtual DOM)在前端领域也算是老生常谈的话题了,若你了解过vue或者react一定避不开这个话题,因此虚拟DOM也算是面试中常问的一个点,那么通过本文,你将了解到如下 ...

  7. 用一个性能提升了666倍的小案例说明在TiDB中正确使用索引的重要性

    背景 最近在给一个物流系统做TiDB POC测试,这个系统是基于MySQL开发的,本次投入测试的业务数据大概10个库约900张表,最大单表6千多万行. 这个规模不算大,测试数据以及库表结构是用Dump ...

  8. 在海思芯片上使用GDB远程调试

    1 前言 使用海思平台上(编译工具链:arm-himix200-linux)交叉编译 GDB 工具(使用版本8.2,之前用过10.2的版本,在编译 gdbserver 遇到编译出错的问题,因为关联了其 ...

  9. Vuex的各个模块封装

    一.各个模块的作用: state 用来数据共享数据存储 mutation 用来注册改变数据状态(同步) getters 用来对共享数据进行过滤并计数操作 action 解决异步改变共享数据(异步) 二 ...

  10. 全国土壤阳离子交换量CEC空间分布数据

    数据下载链接:百度云下载链接​ 土壤阳离子交换量,简称CEC,是指土壤胶体所能吸附各种阳离子的总量.土壤阳离子交换量 cation exchange capacity 即CEC 是指土壤胶体所能吸附各 ...