CentOS 6.6に.NET Coreをインストール(失敗)

参考:http://dotnet.github.io/core/
Linux版はまだ開発中扱いだが、とりあえずマニュアルにしたがってインストール・動作させてみようと思った。
結局のところ、CentOS 6.6ではglibc-2.14以上がインストールできず、失敗した。
後日、CentOS 7でやってみたいと思う。

以下、今回取り組んだことをメモしておく。

システムへMonoのインストール:EPELのmono-coreを利用

.NET CoreのコンパイルにはC#コンパイラが必要だとされており、すでにLinuxなどで導入可能なMono Frameworkで対応する。
※最近のMono FrameworkもC#コンパイラでコンパイルすることが前提となっており、何かしらソースコードからインストールしたいのであれば、かならずRPM版のMono Frameworkをインストールしなければならないとのこと

# 依存関係を持つlibgdiplusのインストール
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/libgdiplus-2.10-1.el6.x86_64.rpm
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/mono-core-2.10.8-4.el6.x86_64.rpm

一般ユーザで.NET Coreバージョン管理ツールのインストール

wget -k https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh
sed -i -e "43s/return/exit/" ./dnvminstall.sh
chmod +x ./dnvminstall.sh
DNX_BRANCH=dev ./dnvminstall.sh
# ↑DNX_BRANCH指定は今のところ意味なさそうだけど、公式で指定しろと書いてあるため指定しておく

[ "$?" = "0" ] && source ~/.dnx/dnvm/dnvm.sh

一般ユーザで.NET Coreのインストール

dnvm upgrade -u

Determining latest version
Latest version is 1.0.0-beta8-15618
Downloading dnx-mono.1.0.0-beta8-15618 from https://www.myget.org/F/aspnetvnext/api/v2
Download: https://www.myget.org/F/aspnetvnext/api/v2/package/dnx-mono/1.0.0-beta8-15618
######################################################################## 100.0%
Installing to /home/user/.dnx/runtimes/dnx-mono.1.0.0-beta8-15618
Adding /home/user/.dnx/runtimes/dnx-mono.1.0.0-beta8-15618/bin to process PATH
Setting alias ‘default’ to ‘dnx-mono.1.0.0-beta8-15618’

dnvm install -r coreclr latest -u

Determining latest version
Latest version is 1.0.0-beta8-15618
Downloading dnx-coreclr-linux-x64.1.0.0-beta8-15618 from https://www.myget.org/F/aspnetvnext/api/v2
Download: https://www.myget.org/F/aspnetvnext/api/v2/package/dnx-coreclr-linux-x64/1.0.0-beta8-15618
######################################################################## 100.0%
Installing to /home/user/.dnx/runtimes/dnx-coreclr-linux-x64.1.0.0-beta8-15618
Adding /home/user/.dnx/runtimes/dnx-coreclr-linux-x64.1.0.0-beta8-15618/bin to process PATH

dnvm list

Active Version Runtime Architecture OperatingSystem Alias
—— ——- ——- ———— ————— —–
1.0.0-beta8-15618 coreclr x64 linux
* 1.0.0-beta8-15618 mono linux/osx default

インストールは成功した様子。

サンプルアプリケーションのビルドと実行

公式にあるようにCSファイルおよびJSONファイルを作成し、実行する。

using System;

public class Program
{
    public static void Main(string[] args)
    {
        Console.WriteLine("Hello World.");
        return;
    }
}

{
    "version" : "1.0.0-*",
    "dependencies" : {
    },
    "frameworks" : {
        "dnx451" : {
        },
        "dnxcore50" : {
            "dependencies" : {
                "System.Console" : "4.0.0-beta-*"
            }
        }
    }
}

一般ユーザで以下を実行してみる。

dnvm use 1.0.0-beta8-15618 -r mono

Adding /home/user/.dnx/runtimes/dnx-mono.1.0.0-beta8-15618/bin to process PATH

dnu restore

Unhandled Exception: System.TypeLoadException: Could not load type ‘System.Runtime.CompilerServices.TaskAwaiter`1’ from assembly ‘mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089’.
at EntryPoint.Main (System.String[] arguments) [0x00000] in :0
[ERROR] FATAL UNHANDLED EXCEPTION: System.TypeLoadException: Could not load type ‘System.Runtime.CompilerServices.TaskAwaiter`1’ from assembly ‘mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089’.
at EntryPoint.Main (System.String[] arguments) [0x00000] in :0

エラー発生。
内容から、TaskAwaiterという型が見つからなかったことによるエラーだと分かる。

TaskAwaiterは.NET Framework 4.5以降に存在する構造体であり、よって.NET Framwork 4.5以降相当のmscorlibが必要、ということになる。
参考:https://msdn.microsoft.com/ja-jp/library/system.runtime.compilerservices.taskawaiter%28v=vs.110%29.aspx

RPMのmonoのバージョンが2.10であり、これは.NET Framerowk 4.0相当までしか対応していない(4.5相当はMono 3.2以上が必要との情報あり)。
参考:http://www.buildinsider.net/small/multitarget/02

よって、この方法では実現できないことが分かった。。。
(TaskAwaiterを使うコードを作成してコンパイルしてみても確かに型が見つからないエラーになる)

ためにし後続の、coreclrに切り替えての”dnx run”を実行してみると別のエラーが発生する。

dnx: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14′ not found (required by dnx)
dnx: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15′ not found (required by dnx)

前段階ができていない状態でのエラーなので信憑性は薄いかもしれないが、libstdc++のバージョンが低く、所定の共有オブジェクトが含まれていないことのエラーの様子。
調べてみると、現状のCentOSでは標準のリポジトリに含まれていないlibstdc++のRPMが必要そうだ。
が、保留としておく。

システムへMonoのインストール:Xamarinのmono-coreを利用

EPELのmono-coreでは対応していないことが分かったので、Xamarinのリポジトリ内のmono-coreをインストールしてみる。
リポジトリ:http://download.mono-project.com/repo/centos/

# EPELで追加したRPMのアンインストール
rpm -e mono-core
rpm -e libgdiplus

# Xamarinパッケージのインストール
rpm -ivh http://download.mono-project.com/repo/centos/libg/libgdiplus0/libgdiplus0-3.8-0.x86_64.rpm
rpm -ivh http://download.mono-project.com/repo/centos/m/mono-core/mono-core-3.8.0-1.x86_64.rpm

Xamarinパッケージのインストール中に依存関係でエラー。

http://download.mono-project.com/repo/centos/libg/libgdiplus0/libgdiplus0-3.8-0.x86_64.rpm を取得中
エラー: 依存性の欠如:
libc.so.6(GLIBC_2.14)(64bit) は libgdiplus0-3.8-0.x86_64 に必要とされています
libpng15.so.15()(64bit) は libgdiplus0-3.8-0.x86_64 に必要とされています
libpng15.so.15(PNG15_0)(64bit) は libgdiplus0-3.8-0.x86_64 に必要とされています
libtiff.so.5()(64bit) は libgdiplus0-3.8-0.x86_64 に必要とされています
libtiff.so.5(LIBTIFF_4.0)(64bit) は libgdiplus0-3.8-0.x86_64 に必要とされています

glibc 2.14に含まれる共有オブジェクトが必要とのこと(他にもpngやtiffを扱うライブラリが足りていない)。
glibc 2.14はCentOS 6系ではRPMで配布されていないため

  • glibc 2.14をSRPMで取得し、ビルドしてインストールする
  • glibc 2.14がリポジトリに含まれているOSに乗り換える

などの対応が必要。
個人のデスクトップでやるのであれば問題はないが、エンタープライズのサーバ運用を見据えたものとなると、いずれの策も難しい。。。

というわけで、CentOS 6系に.NET Coreをインストールすることは失敗に終わった。
まだやれる策はあるので、別の機会に挑戦する。

メモ

dnvminstall.shを読む

#!/usr/bin/env bash

##### 変数や関数が定義されているか確認する関数。
_dnvmsetup_has() {
    type "$1" > /dev/null 2>&1
    return $?
}

##### .bash_profileなど、プロファイルファイル$profileに環境変数を与えるシェルスクリプトdmvm.shが
##### 含まれているか確認し、含まれていなかったら追加する。
##### 環境変数を与えるスクリプトの読み込みは$sourceで指定される。
##### 使い方 _dnvmsetup_update_profile $profile $source
_dnvmsetup_update_profile() {
    local profile="$1"
    local sourceString="$2"
    if ! grep -qc 'dnvm.sh' $profile; then
        echo "Appending source string to $profile"
        echo "" >> "$profile"
        echo $sourceString >> "$profile"
    else
        echo "=> Source string already in $profile"
    fi
}

##### .NET Coreがインストールされるディレクトリ$DNX_USER_HOMEの定義確認。
##### 未定義なら~./dnxを与える。
if [ -z "$DNX_USER_HOME" ]; then
    eval DNX_USER_HOME=~/.dnx
fi

##### curlコマンドの存在確認。
##### curlがインストールされていなかったら異常終了。
##### returnを使っているので、シェルを直接実行する形だと構文エラーがでる。
if ! _dnvmsetup_has "curl"; then
    echo "dnvmsetup requires curl to be installed"
    return 1
fi

##### .NET CoreのソースリポジトリURLであるDNVM_SOURCEの指定。
##### 未定義の場合にデフォルト値を指定している。
if [ -z "$DNVM_SOURCE" ]; then
    DNVM_SOURCE="https://raw.githubusercontent.com/aspnet/Home/dev/dnvm.sh"
fi

##### $DNX_USER_HOME/dnvm/dnvm.shが本体の様子で、これの有無(空ファイルは「無」扱い)で
##### install / updateの使い分けが必要になる。
##### $DNX_USER_HOME/dnvmフォルダが新規に作成される。
# Downloading to $DNVM_DIR
mkdir -p "$DNX_USER_HOME/dnvm"
if [ -s "$DNX_USER_HOME/dnvm/dnvm.sh" ]; then
    echo "dnvm is already installed in $DNX_USER_HOME/dnvm, trying to update"
else
    echo "Downloading dnvm as script to '$DNX_USER_HOME/dnvm'"
fi

##### DNVM_SOURCEのファイルをdnvm.shとして保存。
curl -s "$DNVM_SOURCE" -o "$DNX_USER_HOME/dnvm/dnvm.sh" || {
    echo >&2 "Failed to download '$DNVM_SOURCE'.."
    return 1
}

echo

##### プロファイルファイルを端から調べ上げ、最初にマッチしたものを対象ファイルとみなす。
##### 調べ上げの順番は.bash_profile, .bashrc, .profileの順番。
##### 環境変数$PROFILEが指定されていれば、そのファイルが指定される。
# Detect profile file if not specified as environment variable (eg: PROFILE=~/.myprofile).
if [ -z "$PROFILE" ]; then
    if [ -f "$HOME/.bash_profile" ]; then
        PROFILE="$HOME/.bash_profile"
    elif [ -f "$HOME/.bashrc" ]; then
        PROFILE="$HOME/.bashrc"
    elif [ -f "$HOME/.profile" ]; then
        PROFILE="$HOME/.profile"
    fi
fi

##### zshのための$ZPROFILEを定義。
##### $ZPROFILEが未定義で、.zshrcファイルが存在すればそのファイルが指定される。
if [ -z "$ZPROFILE" ]; then
    if [ -f "$HOME/.zshrc" ]; t##### $DNX_USER_HOME/dnvm/dnvm.shが本体の様子で、これの有無(空ファイルは「無」扱い)で
##### install / updateの使い分けが必要になる。
##### $DNX_USER_HOME/dnvmフォルダが新規に作成される。hen
        ZPROFILE="$HOME/.zshrc"
    fi
fi

##### dnvm.shを読み込むシェルスクリプトコマンド$SOURCE_STRの定義。
SOURCE_STR="[ -s \"$DNX_USER_HOME/dnvm/dnvm.sh\" ] && . \"$DNX_USER_HOME/dnvm/dnvm.sh\" # Load dnvm"

##### プロファイルファイルの存在確認と、dnvm.sh読み込みコマンドの追記。
if [ -z "$PROFILE" -a -z "$ZPROFILE" ] || [ ! -f "$PROFILE" -a ! -f "$ZPROFILE" ] ; then
    if [ -z "$PROFILE" ]; then
      echo "Profile not found. Tried ~/.bash_profile ~/.zshrc and ~/.profile."
      echo "Create one of them and run this script again"
    elif [ ! -f "$PROFILE" ]; then
      echo "Profile $PROFILE not found"
      echo "Create it (touch $PROFILE) and run this script again"
    else
      echo "Profile $ZPROFILE not found"
      echo "Create it (touch $ZPROFILE) and run this script again"
    fi
    echo "  OR"
    echo "Append the following line to the correct file yourself:"
    echo
    echo " $SOURCE_STR"
    echo
else
    [ -n "$PROFILE" ] && _dnvmsetup_update_profile "$PROFILE" "$SOURCE_STR"
    [ -n "$ZPROFILE" ] && _dnvmsetup_update_profile "$ZPROFILE" "$SOURCE_STR"
fi

echo "Type 'source $DNX_USER_HOME/dnvm/dnvm.sh' to start using dnvm"

つまり、インストールスクリプトで作成・変更されるものは以下の2つ。

  • ~/.dnxディレクトリ以下(dnvm.shも含む)
  • .bash_profile or .bashrc or .profile or .zshrc

なお、DNX_USER_HOMEを定義しておけば、そのディレクトリにインストールされる。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です