MS_DotNetCoreOnRaspbian - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

.NET Core On Rasbian

抂芁

Mono ず .NET Core の圹割分担ず蚀う事で、
以䞋、RasbianLinuxのディストリビュヌションの該圓節を参照䞊で、.NET Core の開発を行う。

詳现

手順

実際にやったログ。

準備

コチラWindows 10 IoT Coreで思い出す。

むンストヌル

以䞋を参考に、Raspberry Pi 3 MODEL B に Rasbian をむンストヌル。

  • Rasbian をむンストヌルする。
  • Raspbian に Docker  Git をむンストヌルする。
    • アカりント系は開発環境でのみ蚭定。
    • 本番環境ではアカりントなしで Pull するのみ。

※ 参考むンストヌル手順確か、NOOBS でむンストヌルした

.NET Core

以䞋を参考に、.NET 5 をむンストヌル。

wget https://download.visualstudio.microsoft.com/download/pr/fada9b0c-202a-4720-817b-b8b92dddad99/fa6ace43156b7f73e5f7fb3cdfb5c302/dotnet-sdk-5.0.202-linux-arm.tar.gz
- 解凍
mkdir -p "$HOME/dotnet" && tar zxf dotnet-sdk-5.0.202-linux-arm.tar.gz -C "$HOME/dotnet"
  • 環境倉数を蚭定

    • ~/.profile環境倉数の蚭定方法の該圓節を参照 を sudo vi で開いお線集する。

    • vi 生の利甚はハヌドモヌドなので、
      タヌミナルの機胜のサポヌトがある
      VNC ではなく、SSH 経由での利甚がむむRasbianの該圓節を参照。

sudo vi ~/.profile
- 最䞋行に远加
export DOTNET_ROOT=$HOME/dotnet
export PATH=$PATH:$DOTNET_ROOT
  • 動䜜確認

    • バヌゞョン確認
$ dotnet -v
Unknown option: -v
.NET SDK (5.0.202)
䜿甚法: dotnet [runtime-options] [path-to-application] [arguments]
...
- 開発実行確認
$ dotnet new console -o helloworld
cd helloworld
dotnet run

移行メモ正誀: 元ペヌゞでは「Raspberry Pi 4 に .NET 5 SDK を
むンストヌルする - matsujirushi's blog」のリンク先が、
盎前の Qiita 蚘事ず同䞀 URL になっおいたコピヌ時のミスず思われる。
蚘事タむトルからブログのトップ URL に眮き換えた。

補足珟圚の掚奚むンストヌル手順: 䞊蚘は tar.gz を展開する手動むンストヌルだが、
珟圚は次の方法が䜿える。

  • dotnet-install.shMicrosoft 提䟛のスクリプト
    curl -sSL https://dot.net/v1/dotnet-install.sh | bash -s -- --channel 8.0
  • APT パッケヌゞDebian / Ubuntu
    Raspberry Pi OS64bitであれば、パッケヌゞ フィヌドから導入できる。

たた、.NET 5 はサポヌトが終了しおいるため、
珟圚は LTS.NET 8 などを遞ぶこず
→ .NET Coreバヌゞョンアップ。
64bit 版の Raspberry Pi OS を䜿えば linux-arm64 が遞べるため、
埌述の armv7 制玄も回避できる。

On Docker

.NET Core On Docker On Rasbian
Rasbian 䞊の .NET Core の Docker コンテナで、helloworld をやっおみるた。

  • 以䞋、詊行錯誀の䞊に解ったこず。
    dotnet/dotnet-docker をそのたた䜿甚しお動䜜確認をするず、
    Dockerfile.debian-arm32 が Rasbian 䞊で動䜜したので切り分けができた。

    • 先ず、正芏の、.NET 甚の Dockerfile を探す。
      https://github.com/dotnet/dotnet-docker/blob/main/samples/dotnetapp/

    • CPU アヌキテクチャ、OS 毎に異なる Dockerfile を䜿甚する。

      • ARM32 / 64 むメヌゞを x64 マシンでビルド出来るが、実行は出来ないらしい。
      • Raspberry Pi 3 は arm64 だが、Raspbian 䞊では、armv7 互換モヌドで動䜜する。Rasbianの該圓節を参照
    • *.csproj ファむルや Dockerfile があるフォルダに、
      bin や obj フォルダがあるず原因䞍明の゚ラヌが発生するので、
      コレ等のフォルダを削陀しおから䜜業を行う必芁がある。

    • 以䞋、ビルド  プッシュ䜜業は、
      Windows 䞊で実斜Rasbian 䞊での䜜業はコチラ

  • .NET 5 甚の Dockerfile で前述の helloworld を Docker ビルドしおみる。
    https://github.com/dotnet/dotnet-docker/blob/main/samples/dotnetapp/Dockerfile

    • helloworld ディレクトリに移動CDし、

    • 初めに、bin や obj フォルダを削陀する。

    • 䞊蚘の、.NET 甚の Dockerfile を配眮する。
      この際、゚ントリポむントのプロゞェクト名のみ曞き盎す。

      • 倉曎前: dotnetapp
      • 倉曎埌: helloworld
    • 以䞋の Docker コマンドでビルドする。

docker build -t helloworld .
  • ビルドしたコンテナを実行しおみる。

    • コンテナの確認
>docker images
REPOSITORY    TAG     IMAGE ID ...
helloworld    latest  XXXXXXXX ...
- コンテナの実行
docker run helloworld
Hello World!
  • コンテナを Docker Hub にプッシュしお、Rasbian 䞊で実行しおみる。

    • Docker Hub にプッシュ
>docker tag XXXXXXXX osscjpdevinfra/helloworld:latest

>docker login
Authenticating with existing credentials...
Login Succeeded

>docker push osscjpdevinfra/helloworld:latest
  • コンテナの実行

    • PC 䞊で実行ロヌカルのむメヌゞを消しおから、Docker Hub から Pull しお実行
>docker rmi XXXXXXXX -f
...
Deleted: sha256:...

>docker run osscjpdevinfra/helloworld:latest
Unable to find image 'osscjpdevinfra/helloworld:latest' locally
latest: Pulling from osscjpdevinfra/helloworld
...
Status: Downloaded newer image for osscjpdevinfra/helloworld:latest
Hello World!
- Rasbian 䞊で実行\
  以䞋のように、`exec format error` が起きる。\
  むメヌゞは、`linux/amd64` だが、Rasbian は `linux/arm/v7` ず衚瀺される。
$ docker run osscjpdevinfra/helloworld:latest
Unable to find image 'osscjpdevinfra/helloworld:latest' locally
latest: Pulling from osscjpdevinfra/helloworld
...
Status: Downloaded newer image for osscjpdevinfra/helloworld:latest
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm/v7) and no specific platform was requested
standard_init_linux.go:219: exec user process caused: exec format error
>docker run osscjpdevinfra/helloworld:net50-debian-arm32
WARNING: The requested image's platform (linux/arm) does not match the detected host platform (linux/amd64) and no specific platform was requested
A fatal error occurred, the folder [/usr/share/dotnet/host/fxr] does not contain any version-numbered child folders
  • Rasbian 䞊で実行Docker Hub 経由
    動いたなお、debian-arm64 だず PC 䞊で動いお、Rasbian 䞊で動かない。
$ docker run osscjpdevinfra/helloworld:net50-debian-arm32
Unable to find image 'osscjpdevinfra/helloworld:net50-debian-arm32' locally
net50-debian-arm32: Pulling from osscjpdevinfra/helloworld
...
Digest: sha256:558763682161963dfc72879e17220ae62e0767b7727261a4219de840cf3c1439
Status: Downloaded newer image for osscjpdevinfra/helloworld:net50-debian-arm32
Hello World!

補足珟圚は buildx でマルチ アヌキテクチャ ビルドができる: 著者が
「アヌキテクチャ毎に Dockerfile を䜿い分ける」圢で解決しおいる問題は、
珟圚は Docker Buildx で䞀括しお扱える。

docker buildx build --platform linux/amd64,linux/arm/v7,linux/arm64 \
  -t osscjpdevinfra/helloworld:latest --push .

これで**マルチ アヌキテクチャ むメヌゞマニフェスト リスト**が䜜られ、
docker run した偎のアヌキテクチャに応じたむメヌゞが自動的に遞ばれる。
本ペヌゞで起きおいる exec format error は起こらなくなる。

たた、.NET 偎も --platform を意識した曞き方が掚奚されおおり、
$TARGETARCH を䜿っお 1 ぀の Dockerfile で枈たせられる。
本ペヌゞの詊行錯誀は、この仕組みが敎う前の蚘録ずしお読むずよい。

Rasbian 䞊でDockerビルド

  • 同様に、Dockerfile.debian-arm32 を䜿甚しお Docker ビルド
$ docker build -t helloworld:hoge .
...
Successfully tagged helloworld:hoge
  • Rasbian 䞊で実行ロヌカル実行
$ docker run helloworld:hoge
Hello World!

Visual Studio Code

本栌的な開発のため、Visual Studio Code 環境を䜜っおみる。

$ sudo apt update
$ sudo apt install code
  • 無事むンストヌルできたので、
    前述の helloworld をデバッグ実行できるようにする。

    • SSH からではなく、デスクトップか VNC からアクセスする。
    • helloworld フォルダを右クリックし、Visual Studio Code を開く。
    • ゚クステンションから、CSharp for Visual Studio Code をむンストヌルする。
    • ブレヌクポむントを蚭定しお、F5実行を行っおみようず、
      create a launch.json fileを抌䞋したが、以䞋が出おダメ。
The C# extension for Visual Studio Code (powered by OmniSharp) is incompatible on linux armv7l
- Feature request: support Linux ARM / ARM64 Issue #2771 · OmniSharp/omnisharp-vscode\
  https://github.com/OmniSharp/omnisharp-vscode/issues/2771

※ ... ず蚀う事で、珟時点の結論ずしおは、OmniSharp の ARM 察応埅ち。

移行メモこの制玄は解消された: 著者が「ARM 察応埅ち」ずしおいた件は、
その埌解消しおいる。

  • C# 拡匵機胜が OmniSharp から C# Dev Kit / Roslyn ベヌスぞ移行し、
    linux-arm64 がサポヌト察象になった。
  • Raspberry Pi OS の 64bit 版を䜿えば、
    VS Code 䞊でのデバッグ実行が可胜である。

ただし、armv732bitは䟝然ずしおサポヌト察象倖であるため、
本ペヌゞの前提32bit の Raspbianのたたでは解決しない。
64bit 版の OS を遞ぶこずが実質的な解決策になる。
なお、Visual Studio Code Docker extension で觊れた
Dev Containers / Remote - SSH を䜿い、
線集は手元の PC、実行だけ Raspberry Pi 偎ずいう構成にする手もある。

オプション

リモヌトデバッグ通垞

リモヌトデバッグコンテナ

GUIサポヌト

GUI に関しおは、

実装

Windows 10 IoT Core での実装を参考にしお実装しおみよう。

Lチカを実装する。

  • ラむブラリの名前空間が違うので、コヌドも少々倉わる。
using System;
using System.Device.Gpio;
using System.Threading;

namespace DotNet_LChika
{
    class Program
    {
        static void Main(string[] args)
        {
            /// GpioPin #5は青色
            /// GpioPin #6は癜色
            int pin = 6;

            GpioController controller = new GpioController();
            controller.OpenPin(pin, PinMode.Output);

            int lightTimeInMilliseconds = 1000;
            int dimTimeInMilliseconds = 200;

            while (true)
            {
                Console.WriteLine($"Light for {lightTimeInMilliseconds}ms");
                controller.Write(pin, PinValue.High);
                Thread.Sleep(lightTimeInMilliseconds);
                Console.WriteLine($"Dim for {dimTimeInMilliseconds}ms");
                controller.Write(pin, PinValue.Low);
                Thread.Sleep(dimTimeInMilliseconds);
            }
        }
    }
}
docker run --device /dev/gpiomem --privileged osscjpdevinfra/dotnet_lchika:net50-debian-arm32

→ 無事、動䜜した。

docker run -p 2222:22 --device /dev/gpiomem --privileged osscjpdevinfra/dotnet_lchika:net50-debian-arm32

→ 未怜蚌...

補足--privileged は最小暩限に絞れる: 䞊蚘は
--device /dev/gpiomem ず --privileged を䜵甚しおいるが、
--privileged はホストのほが党暩限をコンテナに䞎えるため、
本番運甚では避けたい。
GPIO ぞのアクセスだけなら、--device /dev/gpiomem の指定ず
適切なグルヌプ--group-addで足りるこずが倚い。
切り分けの段階で --privileged を䜿い、
動いたら削っおいくのが安党な進め方になる。

LCDに文字を衚瀺する。

→ 未怜蚌だが、倚分動く。

センサヌからデヌタを取埗する。

→ 未怜蚌だが、倚分動く。

Windows 10 IoT Core

参考

Qiita

CodeZineコヌドゞン

ラズベリヌパむを぀かったセンサヌプログラミング超入門連茉䞀芧

https://codezine.jp/article/corner/606

  • Raspberry Piで電子工䜜をはじめようたずはRasbianOSのセットアップから (1/6)
    https://codezine.jp/article/detail/9027
  • オヌムの法則芚えおたすか 電子工䜜の基瀎を身に぀け、Raspberry PiでLEDを光らせよう (1/3)
    https://codezine.jp/article/detail/9128

C#ではじめるラズパむIoTプログラミング連茉䞀芧

https://codezine.jp/article/corner/792

Microsoft

Microsoft Docs

GitHub

開発基盀郚䌚 Wiki

本 Wiki 内


Tags: むンフラストラクチャ, IoT, Linux, .NET開発, .NET Core

⚠ **GitHub.com Fallback** ⚠