背景

根据我之前写的文章 将 Net 项目升级 Core项目经验:(一)迁移Net项目为Net Core\Standard项目,我们将公司内部最核心的ORM框架迁移到net core 上面,并在window和mac操作系统上运行测试通过,在后续我们开始准备迁移web 项目到net core 上,并运行在linux系统上。

我们选择的linux不是国际上的大牌linux发行版本,而是我们国内的linux发行版-中标麒麟。在迁移的过程中遇到了太多的问题,最后花费了1个星期的时间,部署成功了。我将其中遇到的坑和走过的路记录下来,给自己和其它同学再次安装起到作用。

在此安装过程中,感谢之前的前辈写的文章,帮助我少走了很多的弯路。

最后说明,能在国内的linux发行版运行dotnet core程序,在其他的大牌linux发行版就都不是问题。

前期准备

  1. 中标麒麟高级服务器版linux
  2. 好的耐心
  3. 降火的饮料
  4. 百度和google

上面几点是必备的,因为在我的安装过程中,没有网上写的帖子那么两三步,一帆风顺的就部署成功了,我从开始部署到测试成功总共花费了一个星期的时间,我的之前文章也可能在下次部署同样的环境,会有所不同的问题。

安装 .NET Core

根据Net Core 微软linux推荐的方式安装,只有redhat,centos,ubuntu,debian,fedora 等大牌的linux发行版安装,可以看微软的文章来查看支持的linux和安装方式Get started with .NET in 10 minutes,对于国内的linux发行版,没有明确的指示。 我使用是中标麒麟系统,根据命令的方式,类似redhat的发行版,但是根据redhat的安装方式,无法安装。所以支持采取最原始的方式来安装,压缩包安装。

采用压缩包安装方式

下载dotnet压缩包,打开dotnet linux官网下载地址 选择linux run app,到写文章的时候,目前是2.0.7版本,有个 install .net core runtime 2.0.7Package .tar.gz download的链接,点击下载,然后将文件复制到服务器上。

以下是我的安装步骤,里面的文件夹路径,可以安装你们自己的名字来建立,步骤如下:

  1. 在home建立NetCoreSDK 文件夹,并将上步下载好的文件复制到这个文件夹中
  2. 重命名文件为dotnet.tar.gz
  3. 在NetCoreSDK 文件夹中右键打开终端,后续输入以下命令:
  4. yum install libunwind libicu (安装libicu依赖,实际上会安装失败的,后续需要通过手动安装修复)
  5. mkdir -p /home/dotnet && tar zxf /home/NetCoreSdk/dotnet.tar.gz -C /home/dotnet (此命令首先在home下创建一个dotnet文件夹,然后解压dotnet.tar.gz文件到 home/dotnet文件中)
  6. ln -s /home/dotnet/dotnet /usr/local/bin (此命令是创建软链接的,可以使得dotnet命令注册到全局,在任何文件夹中都能识别dotnet 命令)

以上步骤,是我在参考Linux安装.Net core 环境并运行项目 这篇文章,根据自己服务器的情况在做的。

然后输入 dotnet --info来验证是否成功

dotnet --info

安装成功后,验证

输入 dotnet --info

出现错误提示:/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.18' not found


错误:libstdc++.so.6: version `GLIBCXX_3.4.18' not found

原因是系统的gcc 版本太低,查询了下系统gcc的版本显示 4.4.7

gcc -v

查看gcc现有的版本库,

[root@gumis02 ~]# strings /usr/lib64/libstdc++.so.6 | grep GLIBC
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBC_2.3
GLIBC_2.2.5
GLIBC_2.3.2
GLIBCXX_FORCE_NEW

显示没有GLIBCXX_3.4.18 的库,所以我们需要升级GCC 的版本。中标麒麟的linux系统的包管理不是特别好用,在网上能找到各种包安装的,如rpm 包,yun install 等等都安装不了,在中标麒麟的系统上都没有用。所以最后只能采用源代码方式来编译安装。

gcc的所有版本源代码在 gun公司的gcc ftp上都有,最新的版本是8.1。根据我后续的经验,不要选择太高的版本,我选择的是5.3.0这个版本。

使用如下命令:

wget http://ftp.gnu.org/gnu/gcc/gcc-5.3.0/gcc-5.3.0.tar.gz
tar -xf gcc-5.3.0.tar.gz
cd gcc-5.3.0 ./contrib/download_prerequisites 

如使用wget命令下载不了,可以用浏览器下载,然后解压是一样的。

使用./contrib/download_prerequisites 会自己检测依赖的包安装,如果网络不好会下载失败,导致安装不了,需要手动下载三个依赖包。参考 安装gcc

依赖的这三个文件,download_prerequisites文件,里面写的着依赖什么文件。

下载 gmp-4.3.2.tar.bz2 、mpc-0.8.1.tar.gz、mpfr-2.4.2.tar.bz2。这三个文件都可以在gcc ftp上找到。 下好了,将三个文件复制到gcc-5.3.0 文件夹中,执行以下命令:

tar -jxvf gmp-4.3.2.tar.bz2
tar -zxvf mpc-0.8.1.tar.gz
tar -jxvf mpfr-2.4.2.tar.bz2
ln -sf gmp-4.3.2 gmp
ln -sf mpc-0.8.1 mpc
ln -sf mpfr-2.4.2 mpfr

接着可以开始编译安装了:

mkdir gcc-build-6.4.0
cd gcc-build-6.4.0 ../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib make j4
make install

最后查看gcc 版本验证是否成功。

[root@gumis02 ~]# gcc -v
\u4f7f\u7528\u5185\u5efa specs\u3002
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-unknown-linux-gnu/5.3.0/lto-wrapper
\u76ee\u6807\uff1ax86_64-unknown-linux-gnu
\u914d\u7f6e\u4e3a\uff1a../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
\u7ebf\u7a0b\u6a21\u578b\uff1aposix
gcc \u7248\u672c 5.3.0 (GCC) [root@gumis02 ~]# strings /usr/lib64/libstdc++.so.6 | grep GLIBC
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBC_2.3
GLIBC_2.2.5
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH
[root@gumis02 ~]# ^C

参看以下三个链接的:

  1. CentOS 6.6 升级GCC G++
  2. 安装gcc 4.9.0
  3. linux下安装或升级GCC4.8,以支持C++11标准

虽然看我写的文章不长,但是在安装的过程中,遇到了很多的问题,主要是对linux系统不熟悉,然后网上有很多的文章都很顺利,轻描淡写就安装成功了,我是在遇到了各种问题后,总结了自己的判断,觉得上面三个文章的链接解决了大部分的东西。 我安装gcc的时间用了1天半的时间,国产的linux还有很多路要走。

为什么我选择了gcc 5.3.0版本,其他的版本我也试过,试了三个版本(6.1.0, 6.4.0,7.3.0)都没有安装成功,各有各的问题,最终选择比较靠近4.4.7版本的时间点 5.3.0版本安装成功了,其主要原因可能是中标麒麟的linux内核版本不高,很多新的库都会编译不成功,缺少东西。

**注意: **

安装gcc 很有可能会导致你的linux系统启动不了,请慎重。

最后验证结果,输入 dotnet --info

出现新的错误提示:libc.so.6: version `GLIBC_2.14' not found。 下一步就是来解决这个错误


错误: libc.so.6: version `GLIBC_2.14' not found

原因是系统的glibc版本太低,软件编译时使用了较高版本的glibc引起的。

查看系统glibc支持的版本

[root@gumis02 dotnet]# strings /lib64/libc.so.6 |grep GLIBC_
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_PRIVATE

可以看到系统默认是2.12,需要安装更高的版本。

同样,没有办法利用rpm或yum install来安装,只能手工源代码的方式安装。

在安装glibc库的时候,是非常危险的,请谨慎处理,一不小心就系统运行不了。

最开始我选择了安装 2.14这个版本的glibc库,但是因为在上一步中,我安装了gcc 5.3.0版本,会在编译时提示 gcc old. 所以我选择了其他的版本来安装。在安装glibc库各种版本都失败,直道选择了 2.16.0这个版本才安装成功,每次安装重试都需要1到2个小时,非常的耗时间:

下载glibc 2.16.0 源代码,没有通过wget命令来下载,用此命令一直显示报错下载不了,之后用浏览器下载了,

需要下载两个文件:glibc-2.16.0.tar.gz

glibc-ports-2.16.0.tar.gz .

下载好,然后执行以下命令来安装:

tar -xvf  glibc-2.16.0.tar.gz
tar -xvf glibc-ports-2.16.0.tar.gz
mv glibc-ports-2.16.0 glibc-2.16.0/ports mkdir glibc-build-2.16.0
cd glibc-build-2.16.0 ../glibc-2.16.0/configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin make make install

其中在make的时候可能会提示一个错误,LD_LIBRARY_PATH 的一个错误,原因LD_LIBRARY_PATH系统变量的值,不能是:结尾,需要执行以下命令查看和修复

[root@gumis02 PublishOutput]# echo $LD_LIBRARY_PATH
/opt/dmdbms/bin
[root@gumis02 PublishOutput]# export LD_LIBRARY_PATH=/opt/dmdbms/bin
[root@gumis02 PublishOutput]#

然后再执行 make install.

如果安装成功,看下glibc的共享库:

可以看到2.12的旧库文件还在,多了2.16版本的库文件,而且软链接文件全部指向了2.16版本

[root@gumis02 DemoNetCore]# ll /lib64/libc*
-rwxr-xr-x 1 root root 1926520 2\u6708 25 2016 /lib64/libc-2.12.so
-rwxr-xr-x 1 root root 10736842 5\u6708 10 10:14 /lib64/libc-2.16.so
lrwxrwxrwx. 1 root root 18 7\u6708 20 2017 /lib64/libcap-ng.so.0 -> libcap-ng.so.0.0.0
-rwxr-xr-x 1 root root 21160 3\u6708 6 2014 /lib64/libcap-ng.so.0.0.0
lrwxrwxrwx. 1 root root 14 7\u6708 20 2017 /lib64/libcap.so.2 -> libcap.so.2.16
-rwxr-xr-x 1 root root 19016 2\u6708 27 2014 /lib64/libcap.so.2.16
lrwxrwxrwx. 1 root root 19 7\u6708 20 2017 /lib64/libcgroup.so.1 -> libcgroup.so.1.0.40
-rwxr-xr-x 1 root root 103096 7\u6708 24 2015 /lib64/libcgroup.so.1.0.40
-rwxr-xr-x. 1 root root 197064 2\u6708 25 2016 /lib64/libcidn-2.12.so
-rwxr-xr-x 1 root root 277593 5\u6708 10 10:14 /lib64/libcidn-2.16.so
lrwxrwxrwx 1 root root 15 5\u6708 10 10:14 /lib64/libcidn.so.1 -> libcidn-2.16.so
lrwxrwxrwx. 1 root root 17 7\u6708 20 2017 /lib64/libcom_err.so.2 -> libcom_err.so.2.1
-rwxr-xr-x 1 root root 17256 7\u6708 26 2015 /lib64/libcom_err.so.2.1
-rwxr-xr-x 1 root root 43392 2\u6708 25 2016 /lib64/libcrypt-2.12.so
-rwxr-xr-x 1 root root 163568 5\u6708 10 10:13 /lib64/libcrypt-2.16.so
lrwxrwxrwx. 1 root root 22 7\u6708 20 2017 /lib64/libcryptsetup.so.1 -> libcryptsetup.so.1.1.0
-rwxr-xr-x 1 root root 97536 10\u6708 20 2014 /lib64/libcryptsetup.so.1.1.0
lrwxrwxrwx 1 root root 16 5\u6708 10 10:14 /lib64/libcrypt.so.1 -> libcrypt-2.16.so
lrwxrwxrwx 1 root root 12 5\u6708 10 10:14 /lib64/libc.so.6 -> libc-2.16.so

上述命令参考两个网址:解决/lib64/libc.so.6: version `GLIBC_2.14' not foundLinux/CentOS 升级C基本运行库CLIBC的注意事项(当想解决GLIBC_2.x找不到的编译问题)

安装成功后,查看:

[root@gumis02 dotnet]# strings /lib64/libc.so.6 |grep GLIBC_
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_2.15
GLIBC_2.16
GLIBC_PRIVATE

到此执行 dotnet --info 显示正常了。

[root@gumis02 DemoNetCore]# dotnet --info

Microsoft .NET Core Shared Framework Host

  Version  : 2.0.7
Build : 2d61d0b043915bc948ebf98836fefe9ba942be11 [root@gumis02 DemoNetCore]#

到此,终于将dotnet 环境安装成功了。

后续

我们将在此环境部署我在上一篇文章将 Net 项目升级 Core项目经验:(三)迁移后的Net Standard版本的类库测试和多平台项目实测的例子。

预告一下:

开心的将写好的控制台程序放到系统上执行,然而结果告诉了我,我还是太年轻了,报错。

首先将用vs发布一下,然后把文件放到中标麒麟的系统上,在文件夹打开终端,执行 dotnet **.dll,结果如下:

[root@gumis02 PublishOutput]# dotnet Beyondbit.ConsoleFrameworkNetStandard.IntegrationTests.dll
Failed to load \ufffd=l, error: libunwind.so.8: cannot open shared object file: No such file or directory
Failed to bind to CoreCLR at '/home/dotnet/shared/Microsoft.NETCore.App/2.0.7/libcoreclr.so' [root@gumis02 PublishOutput]#

继续打怪兽吧。

国产中标麒麟Linux部署dotnet core 环境并运行项目 (一) 安装dotnet core的更多相关文章

  1. 国产中标麒麟Linux部署dotnet core 环境并运行项目 (二) 部署运行控制台项目

    背景 在上一篇文章安装dotnet core,已经安装好dotnet core了.之前只是安装成功了dotnet, 输入dotnet --info,可以确认安装成功了,但是在运行代码时,还是报错了,本 ...

  2. 国产中标麒麟Linux部署dotnet core 环境并运行项目 (三) 部署运行WEB API项目

    部署dotnet Core Web API 上一步的文章,是我们公司最核心的一个ORM组件,在中标麒麟系统完成了一个插入数据的任务,这一步是将正式的从dot net framework 迁移到 dot ...

  3. Linux安装.Net core 环境并运行项目

    原文:Linux安装.Net core 环境并运行项目 一 安装环境 1.  从微软官网下载 Linux版本的.NetCoreSdk 2.0 安装包 打开终端: 第一步: sudo yum insta ...

  4. Linux部署java和tomcat的运行环境

    Linux部署java和tomcat的运行环境 1.上传下载的jdk的rpm包和tomcat的tar包,我是放到/opt目录了,文件直接去官网下载即可. 2.如果之前安装过其他版本的jdk,最好先现在 ...

  5. ASP.NET Core环境并运行 继续跨平台

    ASP.NET Core环境并运行 继续跨平台 无需安装mono,在Linux(Ubuntu)下搭建ASP.NET Core环境 继续.NET跨平台 上一篇:使用VS Code开发ASP.NET Co ...

  6. 基于Linux(中标麒麟)上QT的环境搭建

    最近由于公司需要,需要在中标麒麟上进行QT的二次开发,但是网上的资料很少,就算是有也基本都是其他的版本的Linux上的搭建.中标麒麟本身的资料也很好,而且还只能试用60天. 下面就介绍下我对此环境的搭 ...

  7. 基于Linux(中标麒麟)上QT的环境搭建——解决cannot find lGL的问题

    接上一篇,QT在中标麒麟环境安装完成后遇到运行报错的问题 一.问题描述: 在中标麒麟上配置好QT的环境后,新建一个工程,不做其他的任何操作,直接运行都会报cannot find lGL的错误.如图所示 ...

  8. 在Linux(Ubuntu)下搭建ASP.NET Core环境并运行 继续跨平台

    最新教程:http://www.cnblogs.com/linezero/p/aspnetcoreubuntu.html 无需安装mono,在Linux(Ubuntu)下搭建ASP.NET Core环 ...

  9. Linux下Java开发环境搭建—CentOS下Mysql安装教程

    本人学习Linux时使用的是CentOs5.5版本,在该环境中,Mysql的安装方法有很多种,下面我只讲我这次成功了的方法,作为一个记录,供大家参考,同时给自己做一个笔记. MySQL下载 1.进入网 ...

随机推荐

  1. thinkphp5文件上传问题

    tp5中文件上传如果没有数据就会报错,所以要先做一个判断 //先接收文件数据 $isfile=$_FILES;//判断是否上传图片数据,如果没有上传数据二位数组中的name会为空,如下例:if($is ...

  2. jmeter读取本地CSV文件

    用jmeter录制考试上传成绩等脚本时,出现的问题及解决方法如下: 1.beanshell前置处理器,不能读取本地csv文件里的数据: 方法一: 在beanshell里不能直接从本地的csv文件里读取 ...

  3. Ubuntu下rsyslog审计用户bash操作命令、收集、写入MySQL

    服务端 2台服务端:10.25.109.64.10.45.18.133 1.rsyslog最新版本安装 sudo add-apt-repository ppa:adiscon/v8-stable su ...

  4. Luogu P2624 [HNOI2008]明明的烦恼 Prufer+组合+高精

    好的我把标准版过了... 设$ r_i$为$i$的度数 首先,我们设 $ sum = \Sigma r_i-1$,$ tot $ 为所有能够确定度数的点 所以我们有 $ C ^ {sum} _{n-2 ...

  5. Trie UVALive 7192 Chip Factory (15长春J)

    题目传送门 题意:从n个数中选出不同的三个数a b c,使得(a+b)^c 最大 分析:先将所有数字按位插入到字典树上,然后删除两个数字,贪心询问与剩下的数字最大异或值. /************* ...

  6. KMP 串的模式匹配 (25 分)

    给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出.如果找不到,则输出“Not ...

  7. Git把旧仓库的分支拉到新仓库中

    背景:项目新建了个git仓库(B仓库),放改版的新项目,现在运维所有项目构建都是在一个Jenkins里构建,然后拉镜像到相应服务器里,为了不让运维每次构建不同项目需要改git仓库地址,需要把原来项目仓 ...

  8. pat1049. Counting Ones (30)

    1049. Counting Ones (30) 时间限制 10 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The task ...

  9. ACdream 1427—— Nice Sequence——————【线段树单点更新,区间查询】

    Nice Sequence Time Limit: 4000/2000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) Su ...

  10. case 范围取值

    你可以在单个case标签中指定一系列连续的值,就像这样:   case low ... high: 这和单独的case标签的合适数字有同样的效果,每个对应包含在从low到high中的一个整数值. 这个 ...