平々毎々(アーカイブ)

はてなダイアリーのアーカイブです。

LinuxでASP.NET vNextを動かしたい…がまだ成功してない(追記)動いた

(2015-01-01追記)matarillo.com: 1 ASP.NET 5をLinuxにインストールする (手動) をご覧ください。libuvのインストールはもっとシンプルになりました。

(追記)MacOS Xのひとはこちらをご覧になるといいと思います。

(追記)何はともあれ最初はMono 3.4.1以降を入れること。ディストロのデフォルトパッケージで配布しているMonoはバージョンが古い可能性があるので(たとえばUbuntu14のMonoは3.2.8だ)、Xamarinのパッケージか、コミュニティパッケージを探すといい。

https://github.com/aspnet/home に書いてあるとおりに進めようとしているのだが、KVM*1を入れた後、kpm restoreでこけた。

Warning: FindPackagesById: Kestrel
  Error: SendFailure (Error writing headers)
  GET https://www.nuget.org/api/v2/FindPackagesById()?Id='Kestrel'.
(他にもいろいろ)

ぐぐってたらStackOverflowの回答が見つかった。理由はnuget経由でアセンブリをダウンロードする際に証明書がないから、とのこと。

$ sudo mozroots --import --machine --sync
$ sudo certmgr -ssl -m https://go.microsoft.com
$ sudo certmgr -ssl -m https://nugetgallery.blob.core.windows.net
$ sudo certmgr -ssl -m https://nuget.org

で通るようになった。

続いて k kestrelを実行したら

$ k kestrel
System.DllNotFoundException: libdl
  at (wrapper managed-to-native) Microsoft.AspNet.Server.Kestrel.Networking.PlatformApis/LinuxApis:dlopen (string,int)
(以下略)

でこけた。

libdlはglibcの一部らしいが、それが見つからないというのはLinux Mint 17 Qiana Xfce (64-bit) 固有の状況かもしれない。

$ ldconfig -p | grep libdl
	libdl.so.2 (libc6,x86-64, OS ABI: Linux 2.6.24) => /lib/x86_64-linux-gnu/libdl.so.2
	libdl.so.2 (libc6, OS ABI: Linux 2.6.24) => /lib/i386-linux-gnu/libdl.so.2

うーむ。まだ解決してない。

(追記)

https://github.com/aspnet/Home/issues/172 を見て、Monoのデバッグ出力を設定。

$ export MONO_LOG_LEVEL=debug
$ export MONO_LOG_MASK="dll"

$ k kestrel

するといろいろ出力された。

(省略)
Mono: DllImport attempting to load: 'api-ms-win-core-file-l1-2-0.dll'.
Mono: DllImport error loading library '/home/kinomata1/.kre/packages/KRE-Mono.1.0.0-beta1/bin/libapi-ms-win-core-file-l1-2-0.dll': '/home/kinomata1/.kre/packages/KRE-Mono.1.0.0-beta1/bin/libapi-ms-win-core-file-l1-2-0.dll: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
(省略)
Mono: DllImport error loading library 'libapi-ms-win-core-file-l1-2-0.dll': 'libapi-ms-win-core-file-l1-2-0.dll: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
Mono: DllImport unable to load library 'libapi-ms-win-core-file-l1-2-0.dll: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
Mono: DllImport attempting to load: '__Internal'.
Mono: DllImport loaded library '(null)'.
Mono: DllImport searching in: '__Internal' ('(null)').
Mono: Searching for 'ReadFile'.
Mono: DllImport attempting to load: 'api-ms-win-core-file-l1-2-0.dll'.
Mono: DllImport error loading library '/home/kinomata1/.kre/packages/KRE-Mono.1.0.0-beta1/bin/libapi-ms-win-core-file-l1-2-0.dll': '/home/kinomata1/.kre/packages/KRE-Mono.1.0.0-beta1/bin/libapi-ms-win-core-file-l1-2-0.dll: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
(省略)
Mono: DllImport error loading library 'libapi-ms-win-core-file-l1-2-0.dll': 'libapi-ms-win-core-file-l1-2-0.dll: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
Mono: DllImport unable to load library 'libapi-ms-win-core-file-l1-2-0.dll: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
Mono: DllImport searching in: '__Internal' ('(null)').
Mono: Searching for 'ReadFile'.
Mono: DllImport attempting to load: 'libc.so.6'.
Mono: DllImport error loading library '/home/kinomata1/.kpm/packages/Microsoft.AspNet.Server.Kestrel/1.0.0-beta1/lib/aspnet50/libc.so.6': '/home/kinomata1/.kpm/packages/Microsoft.AspNet.Server.Kestrel/1.0.0-beta1/lib/aspnet50/libc.so.6: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
Mono: DllImport error loading library '/home/kinomata1/.kpm/packages/Microsoft.AspNet.Server.Kestrel/1.0.0-beta1/lib/aspnet50/libc.so.6.so': '/home/kinomata1/.kpm/packages/Microsoft.AspNet.Server.Kestrel/1.0.0-beta1/lib/aspnet50/libc.so.6.so: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
Mono: DllImport loaded library 'libc.so.6'.
Mono: DllImport searching in: 'libc.so.6' ('libc.so.6').
Mono: Searching for 'uname'.
Mono: Probing 'uname'.
Mono: Found as 'uname'.
Mono: DllImport attempting to load: 'libdl'.
Mono: DllImport error loading library '/home/kinomata1/.kpm/packages/Microsoft.AspNet.Server.Kestrel/1.0.0-beta1/lib/aspnet50/libdl': '/home/kinomata1/.kpm/packages/Microsoft.AspNet.Server.Kestrel/1.0.0-beta1/lib/aspnet50/libdl: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
Mono: DllImport error loading library '/home/kinomata1/.kpm/packages/Microsoft.AspNet.Server.Kestrel/1.0.0-beta1/lib/aspnet50/libdl.so': '/home/kinomata1/.kpm/packages/Microsoft.AspNet.Server.Kestrel/1.0.0-beta1/lib/aspnet50/libdl.so: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
Mono: DllImport error loading library 'libdl': 'libdl: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
Mono: DllImport error loading library 'libdl.so': 'libdl.so: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
Mono: DllImport error loading library 'libdl': 'libdl: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
Mono: DllImport unable to load library 'libdl: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
Mono: DllImport attempting to load: 'libdl'.
(省略)
Mono: DllImport unable to load library 'libdl: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません'.
System.DllNotFoundException: libdl
(省略)

ふむ、/lib の方を見に行ってないようだ。ldconfigでは見つかるのに。LD_LIBRARY_PATHが必要なのか?と思って試しにexportしてみたが、やはりlibdlでこけた。うむー。

いやまて、上のデバッグ出力をよく見てみると、libcの方はKestrelの下を2回見に行ったあとで成功しているが、libdlは同じタイミングで「共有オブジェクトファイルを開けません」になってるな。/lib を見に行ってるけどうまく拾えていないとか?

(追記)issue 172にlibtoolとlibuvを入れたら通ったって言うのが出てるな。あとでやってみる。

(追記)issue 172のコメントを見て、libtoolを入れ、libuvのv1.0.0-rc2をビルドしてインストールし、libuv.dylibからlibuv.soにシンボリックリンクを貼ってみたが、やはりだめ。

$ k kestrel
System.NullReferenceException: Object reference not set to an instance of an object
  at Microsoft.AspNet.Server.Kestrel.Networking.Libuv.loop_size () [0x00000] in <filename unknown>:0 
  at Microsoft.AspNet.Server.Kestrel.Networking.UvLoopHandle.Init (Microsoft.AspNet.Server.Kestrel.Networking.Libuv uv) [0x00000] in <filename unknown>:0 
  at Microsoft.AspNet.Server.Kestrel.KestrelThread.ThreadStart (System.Object parameter) [0x00000] in <filename unknown>:0 

コメントにあるように、Kestrelは1.0.0-alpha4じゃないとだめなのだろうか。違いはそこぐらいしかないのだが(自分の環境は1.0.0-beta1だ)。

(追記)1.0.0-alpha4にしてみた。

$ cd ~/aspnet/Home
$ git checkout v1.0.0-alpha4
$ cd samples/HelloWeb
$ kpm restore

ってやって、

$ cd ~/.kpm/packages/Microsoft.AspNet.Server.Kestrel/1.0.0-alpha4/native/darwin/universal/
$ mv libuv.dylib libuv.dylib.org
$ ln -sf /usr/local/lib/libuv.so libuv.dylib

ってシンボリックリンクを貼って、

$ cd ~/aspnet/Home/samples/HelloWeb
$ k kestrel

ってやったら、動いた動いた。

(しかし、Ctrl-Cではkestrelを停止できずに、最後にはkill -9した→追記:libuvの1.0.0正式版だったら大丈夫になった)

(12/26追記)libuv.dylibからlibuv.soにシンボリックリンクを貼る以外の方法があるようだ。後で試して、記事自体を書きなおすか……→書いた。

*1:これホントに名前がよくない。KVMといえばふつうはKernel-based Virtual Machineだ