背景
根據我以前寫的文章 將 Net 項目升級 Core項目經驗:(一)遷移Net項目爲Net Core\Standard項目,咱們將公司內部最核心的ORM框架遷移到net core 上面,並在window和mac操做系統上運行測試經過,在後續咱們開始準備遷移web 項目到net core 上,並運行在linux系統上。
咱們選擇的linux不是國際上的大牌linux發行版本,而是咱們國內的linux發行版-中標麒麟。在遷移的過程當中遇到了太多的問題,最後花費了1個星期的時間,部署成功了。我將其中遇到的坑和走過的路記錄下來,給本身和其它同窗再次安裝起到做用。html
在此安裝過程當中,感謝以前的前輩寫的文章,幫助我少走了不少的彎路。 最後說明,能在國內的linux發行版運行dotnet core程序,在其餘的大牌linux發行版就都不是問題。
上面幾點是必備的,由於在個人安裝過程當中,沒有網上寫的帖子那麼兩三步,一路順風的就部署成功了,我從開始部署到測試成功總共花費了一個星期的時間,個人以前文章也可能在下次部署一樣的環境,會有所不一樣的問題。linux
根據Net Core 微軟linux推薦的方式安裝,只有redhat,centos,ubuntu,debian,fedora 等大牌的linux發行版安裝,能夠看微軟的文章來查看支持的linux和安裝方式Get started with .NET in 10 minutes,對於國內的linux發行版,沒有明確的指示。 我使用是中標麒麟系統,根據命令的方式,相似redhat的發行版,可是根據redhat的安裝方式,沒法安裝。因此支持採起最原始的方式來安裝,壓縮包安裝。c++
下載dotnet壓縮包,打開dotnet linux官網下載地址 選擇linux run app,到寫文章的時候,目前是2.0.7版本,有個 install .net core runtime 2.0.7Package .tar.gz download的連接,點擊下載,而後將文件複製到服務器上。web
如下是個人安裝步驟,裏面的文件夾路徑,能夠安裝大家本身的名字來創建,步驟以下:ubuntu
以上步驟,是我在參考Linux安裝.Net core 環境並運行項目 這篇文章,根據本身服務器的狀況在作的。centos
而後輸入 dotnet --info來驗證是否成功瀏覽器
dotnet --info
輸入 dotnet --info服務器
出現錯誤提示:/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.18' not found網絡
緣由是系統的gcc 版本過低,查詢了下系統gcc的版本顯示 4.4.7app
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
參看如下三個連接的:
雖然看我寫的文章不長,可是在安裝的過程當中,遇到了不少的問題,主要是對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。 下一步就是來解決這個錯誤
緣由是系統的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 found 和 Linux/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]#
繼續打怪獸吧。