俺のラズパイ2で.NET Core 2.0が動くまで

俺のラズパイ3で.NET CoreなF#が動かないわけがない | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/8028

の記事が去年の8月末で、あれからほぼ1年が経ちました。経っているうちに、.NET Coreが2.0のプレビュー版になって、.NET Coreが動くようになりましたよ、という話。

core/roadmap.md at master ・ dotnet/core
https://github.com/dotnet/core/blob/master/roadmap.md#technology-roadmaps
Running a .NET Core 2 app on Raspbian Jessie, and deploying to the Pi with Cake | Jeremy Lindsay
https://jeremylindsayni.wordpress.com/2017/07/23/running-a-net-core-2-app-on-raspbian-jessie-and-deploying-to-the-pi-with-cake/
core/RaspberryPiInstructions.md at master ・ dotnet/core
https://github.com/dotnet/core/blob/master/samples/RaspberryPiInstructions.md
<b>C#</b>RaspberryPi 3に.NET Coreを入れてHello World! – Qiita
http://qiita.com/logikuma/items/de8c987dc2308a96256d

.NET Core 1.0 ではいつの間にか消えてしまった Raspberry Pi のサポートですが、.NET 2.0 になって復活していました。

動作環境

  • Raspberry Pi2と3の Rasbian/Ubuntu の環境で動く。
  • Raspberry Pi Zero では動かない。
  • Raspberry Pi 上ではビルドができない。
  • なので、WindowsやLinux上でビルドして、Raspberry Pi へデプロイする。

つまり、実行環境としての.NET Core関連のアセンブリをラズパイへ入れ込めば動作する。ビルドする場合は、別のPC/Linux/Macが必要、という訳。Zeroで動かないのは、.NET Coreの動作対象が armv7とarmv8 となっているためで、zero が使っている arm32 は対象になっていない、ということです。
となると、armv7/8 の cpu を使っている arm 関係の組み込みボードでもいけそうでは?という予想が立つので、おそらく nano pi あたりでも動くはずです。

Rasbian Pi上で動かす

現状では、.NET Coreのランタイムが

  • Rasbian(Raspberry Pi標準のOS)
  • Ubuntu
  • Windows IoT Core

上で動きます。Rasbianで動かすときは、Scratchとの連携とかnode.jsの代わりとか色々できそうです。Ubuntuは低電力の常時Webサーバーというのもありで、ちょっとしたサーバー機として使えます。Windows IoT Coreの場合は、モニタ絡みで先行きはUWP on .NET Standardな環境かなと思ったり。
自前ビルド環境がないのが辛いところですが(Rasbian/Ubuntuという開発環境なのに)、別途、.NET Core対応なコンパイラとかスクリプトを作れば、それはRaspberry Pi上でもするっと動くようになるのかなと思ったり、まあ、そういうときはmonoを使えばいい訳ですが。

さて、.NET Coreのランタイムかつアセンブリ(各種のDLLファイル)は、実行環境に何かのインストールをする必要はありません。すべて、ビルドするときのアセンブリで完結しています。ということは、Raspberry Pi 上でセルフビルドができないのですから、そもそも、何らかの.NET関係のアセンブリをインストールしておく必要はありません。

ということで、手順は簡単で、

  1. Raspberry Pi2/3でRasbianを用意する。
  2. PC上で、.NET Coreのプログラムを作る。
  3. PCからRaspberry Piにデプロイする(アセンブリをコピーする)

だけで十分です。

PC上で hello フォルダーを作成して dotnet new console します。

mkdir hello
cd hello
dotnet new console

あるいは

dotnet new console -n hello

Raspberry Pi のデプロイするために dotnet publish -r linux-arm します。

dotent build
dotnet publish -r linx-arm

ここで一度 build していますが、Raspberry Pi に転送するだけならば、publish だけで十分かもしれません。

hello/bin/Debug/netcoreapp2.0/linux-arm/publish の中身に hello を含む .NET Core 2.0 用のアセンブリがごっそり作られます。

publish フォルダの中身を、WinSCP などで Raspberry Pi に転送します。

Tera Term などで Raspberry Pi に繋ぎ、転送した publish フォルダにある hello だけに実行権限を付けます。

mv publish hello
chmod +x hello/hello

アセンブリに実行権限を付ける訳です。

後は、普通に hello を動かせば動作できます。

./hello

※ラズパイ上の dotnet コマンドはバージョンしか出さないので、おそらく dotnet-runtime-latest-linux-arm.tar.gz をダウンロード&展開する必要はないハズです。
※実行権限を chmode 775 -R すると全てのアセンブリに設定してしまうので、ピンポイントで chmod +x しています。

追記 2017/07/31

arm 上の dotnet コマンドですが、pc/linux にあるような dotnet run コマンドがありません…が、アセンブリを実行するために、dotnet ./hello.dll ってのができますね。なるほど。以下な感じで最新版を取ってきて、展開して使えます。

wget https://dotnetcli.blob.core.windows.net/dotnet/Runtime/release/2.0.0/dotnet-runtime-latest-linux-arm.tar.gz
mkdir /opt/dotnet
tar -xvf dotnet-runtime-latest-linux-arm.tar.gz -C /opt/dotnet
ln -s /opt/dotnet/dotnet /usr/local/bin/dotnet

のように /usr/local/bin/dotnet で動作できるようにしておいて

dotnet ./hello.dll

で実行します。PC/linux のほうにもこの機能はある。

このあたり、英語のブログ記事も錯綜している感じがするので、元ネタの

core/RaspberryPiInstructions.md at master ・ dotnet/core
https://github.com/dotnet/core/blob/master/samples/RaspberryPiInstructions.md

を参照するとよいでしょう。

Ubuntu上で動かす

Ubuntu 上で動かすときも基本は Rasbian と変わりません。
ただし、素の Ubuntu の場合、開発的なライブラリが少し足りないので apt-get で追加しておきます。

core/prereqs.md at master ・ dotnet/core
https://github.com/dotnet/core/blob/master/Documentation/prereqs.md

にあるライブラリを以下で追加します。

sudo apt-get install libunwind8 libunwind8-dev gettext libicu-dev liblttng-ust-dev libcurl4-openssl-dev libssl-dev uuid-dev unzip

これで、さっき dotnet publish -r linux-arm で作ったアセンブリを ubuntu のほうにコピーすると同じように動作します。

IoTのテンプレートを使う。

ここでは console のテンプレートを使った訳ですが、実は dotnet new –list すると、console 以外のテンプレートも使えることが分かります。

aps.net mvc の場合は dotnet new mvc とかのアレのやつですね。
ここに coreiot というテンプレートがあって、

dotnet new -i RaspberryPi.Template::*

とするとインストールができます(既に .net core 2.0 の dotnet コマンドに付いるかもしれません)。
このテンプレートを使って、

dotnet new coreiot -n helloiot

とした後で、vscode を開くと build.cake にビルドからデプロイまでを含めたCake(C# の makefile)を作ってくれます。

ビルド用の ps スクリプトを,

Invoke-WebRequest http://cakebuild.net/download/bootstrapper/windows -OutFile build.ps1

でダウンロードして動かすと、pscp まで使ったデプロイまで一気にやってくれるはずなんですけどね…どうも PscpSettings の設定がうまくできていないらしく、うまく動いていません。

Cake – Home
http://cakebuild.net/

後でここは調べておきましょう。

そんな訳で

セルフビルドはできませんが、これで Rasberry Pi 2/3 上で .NET Core 2.0 が動作することが確認できました。これで何がやりたいかというと、F#でWeb APIが作りたいわけで、mono で作ってもよいのですが、どうせならば .net core + asp.net mvc core の組み合わせでやりたいのです。なんせ、PCよりも断然低電力なので常時立ち上げておいてもよいし、AzureやAWSよりもネットワーク的に近い位置に作れるから、これはこれで使い勝手がいいかなと。
と言う訳で、F#でのお試しは引き続き。

カテゴリー: 開発, RaspberryPi パーマリンク