.NET Core telepÃtése RaspberryPi-re & Távoli hibakeresés
Korábbi könyveimben a C# programozási nyelvről direkt nem esett szó, mivel tudtam, hogy a C# egy külön könyvet érdemel. Mivel a külön könyv megtörtént, ideje összehozni a két világot 🙂
Limitációk
MielÅ‘tt belevágnánk a részletekbe, érdemes tisztázni a limitációkat. A .NET Core ARM változata csak olyan ARM processzorokon futtatható, amelyek ARMv7 vagy újabb utasÃtáskészletet támogatnak. Ez azt jelenti, hogy a RaspberryPi 1 és a Pi Zero modellek nem támogatottak, mivel ezek processzorai csak ARMv6-ot támogatnak.
Egy másik limitáció maga a hardver. A Pi-re Ãrhatunk programokat, amelyek gond nélkül fognak futni, viszont a programok Ãrását én elsÅ‘sorban egy asztali gépen végezném el, hacsak nem egy 4GB-os Pi4-en próbálkozunk, ami SSD-rÅ‘l fut.
Előkészületek
Biztonsági okokból sose javasolt az alapértelmezett, vagy root felhasználó jogosultságával futtatni bármilyen távolról elérhetÅ‘ alkalmazást, még akkor sem, ha helyi hálózaton vagyunk. Ezért én azt javaslom, hogy készÃtsünk egy külön felhasználót a .NET Core számára. Debian esetén az adduser interaktÃv programmal ez könnyen megtehetÅ‘.
sudo adduser dotnetpi
A telepÃtés további részében a dotnetpi felhasználó SSH-n való bejelentkezését feltételezzük.
TelepÃtés
A legújabb .NET Core SDK vagy Runtime a Microsoft oldaláról tölthető le: https://dotnet.microsoft.com/download/dotnet-core/
Itt listázva vannak a jelenleg támogatott változatok. A cikk Ãrásának pillanatában a legfrissebb támogatott változat a 3.1, ami 2022-ig támogatott. Egyes Linux disztribúciókra készen csomagolt változatok is rendelkezésre állnak, amelyek nagymértékben megkönnyÃtik a a telepÃtést. EzekrÅ‘l és a telepÃtés menetérÅ‘l a https://docs.microsoft.com/hu-hu/dotnet/core/install/linux cÃmen találunk bÅ‘vebb információt.
Az itt közzétett leÃrás disztribúciótól függetlenül működik. A Pi operációs rendszere 32 bites, ezért a legfrissebb ARM32 SDK-t töltöttem le. Ha csak futtatni akarunk programokat, akkor a Runtime is elég.
Fejlesztéshez, még ha távoli gépen is csináljuk, elsÅ‘sorban érdemes az SDK-t telepÃteni, mivel sosem tudhatjuk, hogy mikor is kell a kódot egy gyors javÃtás miatt újrafordÃtani a tényleges vason (true story).
A kiválasztott SDK után a böngészÅ‘ felkÃnálja a tar.gz csomag letöltését, de megkapjuk a direkt linkeket is, amit curl vagy wget segÃtségével le is tölthetünk egybÅ‘l a futtató vasra, ha az rendelkezik net kapcsolattal.
wget https://download.visualstudio.microsoft.com/download/pr/52fb935e-f2b3-42c3-9695-d53e7c693baa/6c38b8ac3bc97ea2f09a03a60cdacdc5/dotnet-sdk-3.1.108-linux-arm.tar.gz
A letöltés mellé a weblapon kapunk egy SHA512 ellenőrző összeget is, amellyel ellenőrizhetjük, hogy a letöltés épségben megtörtént.
sha512sum dotnet-sdk-3.1.108-linux-arm.tar.gz
Ha fenti parancs kimenete ugyanazt a hexadecimális számsort eredményezi, mint ami a weblapon található, akkor a fájl sérülésmentes. A tar.gz fájlt az alábbi parancsok segÃtségével bonthatjuk ki:
mkdir -p $HOME/dotnet
tar zxf dotnet-sdk-3.1.108-linux-arm.tar.gz -C $HOME/dotnet
A telepÃtés után a keresési útvonalakhoz hozzá kell adni a mappát, hogy a program bárhonnan működjön, illetve be kell állÃtani a DOTNET_ROOT környezeti változó értékét is a telepÃtés útvonalára.
export DOTNET_ROOT=$HOME/dotnet
export PATH=$PATH:$HOME/dotnet
Ezek után működnie kellene a programnak. Ezt letesztelhetjük a dotnet –version parancs kiadásával.
A fordÃtást és futtatást az alábbi parancsokkal tesztelhetjük:
mkdir teszt
cd teszt
dotnet new console
dotnet build
dotnet run
Távoli elérés
Visual Studio-ban csatlakozni a távoli géphez hibakeresés miatt a Debug menü alatt található „Attach to process…” (Ctrl+Alt+P) ablakban tudunk. Itt a kapcsolat tÃpust SSH-ra kell állÃtanunk, majd a „connection target” mezÅ‘be felhasználónév@host formában meg kell adni a használni kÃvánt felhasználónevet és a Pi hálózati cÃmét. HitelesÃtés után a folyamatok listájából ki tudjuk választani, hogy melyiket szeretnénk hibakeresni.
Várakozás a debugger csatlakozásra
A távoli gépen futó programunk folyamatos futását megakadályozandó, néha célszerű egy metódussal várakozást beiktatnunk, amÃg ténylegesen sikerül csatlakoznunk a géphez és a problémás részeket kezelésbe venni. Ehhez segÃtségnek az alábbi segÃtÅ‘ metódust ajánlom. Ezt tipikusan a programom indÃtásakor hÃvom meg, ha egy bizonyos parancssori argumentummal lett elindÃtva a a program.
Megjegyzés: Hasonló várakozásokat NE hagyjunk éles, release konfigurációban, mert visszaélésre adhat lehetőséget (a megfelelő bolygó együttállás esetén persze).
using System;
using System.Diagnostics;
using System.Threading;
static class DebugHelper
{
public static void WaitForDebugger()
{
Console.WriteLine("Waiting for debugger to be attached...");
Console.WriteLine("ESC to cancel & continue execution...");
while (!Debugger.IsAttached)
{
if (Console.KeyAvailable)
{
ConsoleKeyInfo key = Console.ReadKey(true);
if (key.Key == ConsoleKey.Escape)
{
return;
}
}
else
{
Thread.Sleep(100);
}
}
Debugger.Break();
}
}
