國產中標麒麟Linux部署dotnet core 環境並運行項目 (一) 安裝dotnet core

背景
根據我之前寫的文章 將 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]#

繼續打怪獸吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章