CentOS 6.x 安装 dotnet core 环境

dotnet core 正式发布已有小半年了,目前已经到了 1.1.0 的版本,只可惜受限于技术栈,一直未能在生产环境上试用。

官方的安装文档在这里:

https://www.microsoft.com/net/core#linuxcentos

可惜的是,官方文档里只支持 CentOS 7.1。而在我厂老掉牙的 CentOS 6.x 上运行时,会直接报错:

Failed to load /home/work/dotnet/host/fxr/1.1.0/libhostfxr.so, error: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /home/work/dotnet/host/fxr/1.1.0/libhostfxr.so)

The library libhostfxr.so was found, but loading it from /home/work/dotnet/host/fxr/1.1.0/libhostfxr.so failed

Installing .NET Core prerequisites might help resolve this problem.

http://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409

可以看出,是因为 dotnet core 依赖了 GLIBC_2.14,而 CentOS 6.x 上的版本是 2.12。因此需要做个升级。

升级 glibc 至 2.14

wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz
tar zxf glibc-2.14.tar.gz
mkdir build
cd build
../glibc-2.14/configure --prefix=/opt/glibc-2.14
make
sudo make install

然后测试一下

LD_PRELOAD=/opt/glibc-2.14/lib/libc.so.6  ./dotnet --version

换了个错误:

Failed to initialize CoreCLR, HRESULT: 0x80131500

原因是 libicu 的版本太低。于是继续升级。

升级 icu 至版本 50

wget http://download.icu-project.org/files/icu4c/50.1.2/icu4c-50_1_2-RHEL6-x64.tgz
tar zxf icu4c-50_1_2-RHEL6-x64.tgz

执行 dotnet

由于需要依赖新的 glibc 和 icu,因此需要额外搞一个启动脚本

#!/bin/bash
### file_path: /usr/local/bin/dotnet  替代原有的软链
DOTNET_PATH=/home/work/dotnet         # dotnet 的路径
GLIBC_PATH=/opt/glibc-2.14            # glibc 的路径
LIBICU_PATH=${DOTNET_PATH}/libicu     # libicu 的路径

export LD_PRELOAD=${GLIBC_PATH}/glibc/lib/libc-2.14.so     # 用来加载新的 glibc
export LD_LIBRARY_PATH=${LIBICU_PATH}/usr/local/lib        # 用来寻找 libicu
${DOTNET_PATH}/dotnet $*                                   # 执行 dotnet 命令

试一下

dotnet --version

1.0.0-preview2-1-003177

成功!