麒麟 Linux aarch64安装.NET 6,并适配.net应用(达梦数据库)
适用环境:麒麟 Linux aarch64,达梦(DM)数据库,.NET 6。
部署目录约定:
-
.NET 运行时:
/home/hmf/dotnet -
应用本体:
/home/hmf
一、安装.NET6运行环境
wget https://dot.net/v1/dotnet-install.sh -O dotnet-install.sh
chmod +x dotnet-install.sh
不加 --runtime 参数 = 装完整 SDK(含编译工具链 + 对应运行时)
./dotnet-install.sh --channel 6.0 --install-dir /home/hmf/dotnet
配置环境变量(安装在用户目录下,写入 ~/.bashrc 即可,不需要 root)echo 'export DOTNET_ROOT=/home/hmf/dotnet' >> ~/.bashrc
echo 'export PATH=$PATH:/home/hmf/dotnet' >> ~/.bashrc
source ~/.bashrc
#验证版本
dotnet --info
dotnet --list-sdks # 应该能看到 6.0.x
dotnet --list-runtimes # 应该能看到 Microsoft.AspNetCore.App 6.0.x 和 Microsoft.NETCore.App 6.0.x
离线环境(连不了外网):改成下载 dotnet-sdk-6.0.x-linux-arm64.tar.gz(dotnet.microsoft.com),传到 tidb 后解压到 /home/hmf/dotnet,其余步骤一样。
#检查版本Version: 6.0.36

二、适配应用
2.1、准备达梦驱动
达梦官网(<www.dameng.com>)下载中心,用达梦通行证账号登录后下载 .NET 驱动包(文件名类似 dotNet-<日期>.zip),解压后会看到几个文件夹,比如:
dmDriver/
DmProvider/ <- 这个就是我们要用的
DM.DmProvider.8.3.1.51364.nupkg <- 真正的 NuGet 包文件
net40/ net45/ net5.0/ net6.0/ ... <- 包展开后按目标框架分的 lib 目录,不用管
EFCore.Dm6.0/ <- Entity Framework Core 驱动,本项目用不到,不用管
把 DmProvider 这个文件夹整个传到目标机,比如放在 /home/hmf/dmDriver/DmProvider。
注册为本地 NuGet 源
dotnet nuget add source /home/hmf/dmDriver/DmProvider --name dm-local
如果提示 dm-local 这个名字已经存在(比如之前加过、指向了别的路径),改用:
dotnet nuget update source dm-local --source /home/hmf/dmDriver/DmProvider
确认一下:
dotnet nuget list source
dm-local 那一行应该显示 /home/hmf/dmDriver/DmProvider
2.2、加到项目里
cd /home/hmf/TestApp
dotnet add package DM.DmProvider --version 8.3.1.51364 -s /home/hmf/dmDriver/DmProvider
会自动把 <PackageReference Include="DM.DmProvider" Version="8.3.1.51364" /> 写进 TestApp.csproj,不用手动改文件。
换了机器部署时,这一步(下载驱动 + 注册本地源 + add package)都要重新做一遍,因为
dotnet nuget add source是注册在当前机器的全局 NuGet 配置里的,不会跟着项目代码一起传过去。
2.3、还原依赖并编译
cd /home/hmf/TestApp
dotnet build -c Release
2.4、 修改数据库连接配置
编辑 /home/hmf/TestApp/appsettings.json:
{
"ConnectionStrings": {
"DmConn": "Server=<达梦库地址>;Port=<端口,默认5236>;User Id=<用户名>;PWD=<密码>;"
},
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://0.0.0.0:8089"
}
}
}
}
监听地址建议用 0.0.0.0(监听所有网卡)而不是写死具体 IP,机器换 IP 或有多网卡时更省心。
2.5、 运行前先验证数据库网络连通性
telnet <达梦库地址> 5236
或
nc -zv <达梦库地址> 5236
有 disql 等达梦客户端工具的话,也可以直接拿账号密码连一下确认,OK 之后再启动本应用,避免网络问题和应用层报错混在一起排查。
2.7、发布并直接运行验证
cd /home/hmf/TestApp
dotnet publish -c Release -o /home/hmf/TestApp/out
cd /home/hmf/TestApp/out
dotnet TestDmPlugin.dll
看到类似输出说明启动成功:
Now listening on: http://0.0.0.0:8089
Application started. Press Ctrl+C to shut down.
浏览器访问 http://10.1.1.229:8089/,应看到 select/other 两个 SQL 输入框的界面,测试 SQL 确认能正常连上达梦库并返回结果。
Ctrl+C 停止后,继续第 8 步配置为系统服务长期运行。
查看日志
页面每次点击 execSelect / execOther 执行 SQL,都会记录一条日志(请求的 SQL、成功返回行数/影响行数、或失败时的异常堆栈),写入运行目录下的 logs 文件夹,按天滚动:
/home/hmf/TestApp/out/logs/app-20260720.log
-
日志目录可通过
appsettings.json里的Logging:LogDirectory配置,默认值logs(相对可执行文件所在目录),也可以填绝对路径。 -
前台运行(第7步)和 systemd 服务(第8步)用的是同一份代码,都会写这个日志文件,跟终端输出/
journalctl是两份独立的记录,互不影响。 -
排查问题时优先看这个文件,比
journalctl更完整(包含每次 SQL 请求明细)。
tail -f /home/hmf/TestApp/out/logs/app-$(date +%Y%m%d).log
三、配置systemd服务和开放端口
3.1、置systemd服务
创建 /etc/systemd/system/testapp.service:
Unit
Description=TestApp DM Plugin Test
After=network.target
Service
WorkingDirectory=/home/hmf/TestApp/out
ExecStart=/home/hmf/dotnet/dotnet /home/hmf/TestApp/out/TestDmPlugin.dll
Restart=always
RestartSec=5
KillSignal=SIGINT
SyslogIdentifier=testapp
User=hmf
Environment=ASPNETCORE_ENVIRONMENT=Production
Install
WantedBy=multi-user.target
启用并启动:
systemctl daemon-reload
systemctl enable testapp
systemctl start testapp
systemctl status testapp
查看日志:
journalctl -u testapp -f
除了 journald,应用自身还会把日志写入文件(详见下方「日志文件」一节),路径固定在 /home/hmf/TestApp/out/logs/,不受 systemd/前台运行方式影响,且不会随终端关闭或服务重启丢失。
后续改了代码,重新发布只需要:
cd /home/hmf/TestApp
dotnet publish -c Release -o /home/hmf/TestApp/out
systemctl restart testapp
3.2、开放防火墙端口
firewalld
firewall-cmd --permanent --add-port=8089/tcp
firewall-cmd --reload
或 iptables
iptables -I INPUT -p tcp --dport 8089 -j ACCEPT
四、常见问题
| 现象 | 可能原因 | 处理 |
|---|---|---|
dotnet build/dotnet add package 报找不到 SDK |
只装了 Runtime,没装 SDK | 回到第 1 步,用不带 --runtime 的命令装完整 SDK |
dotnet add package DM.DmProvider 报 NU1101/找不到包 |
本地 NuGet 源没注册对,或路径指错了 | dotnet nuget list source 确认 dm-local 指向的路径就是 DmProvider 那个文件夹(里面直接能看到 .nupkg 文件的那一层) |
编译报 warning MSB3245: Could not locate the assembly "DmProvider" |
csproj 里残留旧的 <Reference HintPath=...> 写法 |
打开 TestApp.csproj,删掉 <Reference Include="DmProvider"> 那一整段,只留 <PackageReference Include="DM.DmProvider" ...> |
| 连接达梦库报错/超时 | 连接串错误、网络不通、达梦库未开放对应端口 | 先做第 6 步的网络连通性验证;检查 appsettings.json 连接串 |
| 页面打不开 | 端口未监听/防火墙未放行/进程未启动 | ss -lntp | grep 8089 确认监听;检查 systemctl status testapp 和防火墙规则 |
| 中文乱码 | 精简版系统缺少区域/编码支持 | 确认系统已装 locale(zh_CN.UTF-8) |
| 权限不足无法监听端口 | 非 root 用户尝试监听 1024 以下端口 | 用 1024 以上端口(已经是 8089,没问题),或给可执行文件加 setcap 'cap_net_bind_service=+ep' |
五、其他:达梦驱动下载
达梦官方下载平台(离线内网用,下载完整 ARM 驱动包)
主下载页(官方入口)
https://eco.dameng.com/download/
两种下载方式获取.NET 驱动
-
下载 DM8 ARM64 开发版安装包(推荐)
- CPU 平台:鲲鹏 920(aarch64/ARM 通用)
- 系统:银河麒麟 / 统信 UOS
- 下载后解压 / 安装,路径:
dmdbms/drivers/dotNet/ - 内含
Dameng.Data.Provider.8.x.x.nupkg离线安装包

2、页面底部【工具与驱动】单独下载.NET 驱动 下滑页面找到「.NET 开发包」,直接下载对应 DM8 版本驱动压缩包。本次我下载的是这个。下载的文件包为:dotNet-20260710.zip