Установка .NET 5.0 для ARM на примере Banana Pi BPI-M64 и Cubietruck (Armbian, Linux)

В конце прошлого года вышел релиз фреймворка .NET 5.0 прекрасно работающий на Linux, для 32-х и 64-х разрядных процессоров архитектуры ARM. Нужно воплощать эру прихода пост-ПК и «Вендекапец». Будем производить установку .NET 5.0 на плату Cubietruck (ARM32), и Banana Pi BPI-M64(ARM64) в ОС Armbian основанной на Linux, дистрибутив Ubuntu. Никакой эмуляции платформ, только реальное железо.

Одно из лучших нововведений в .NET 5.0 стало увеличение производительности для архитектуры ARM64. Поэтому переход на новую версию не только увеличит производительность решения на базе ARM64, но и увеличит время автономной работы в случае  использования аккумуляторной батареи. Поэтому платформы построенные на ARM64 в приоритете использования, но и о поддержки 32-разрядных платформ не нужно забывать. Установка .NET 5.0 будет производится на следующие устройства:

Определение архитектуры ARM32 и ARM64 для SoC

Сейчас на рынке SoC существую три наиболее популярные архитектуры: ARM32, ARM64 и RISC-V.

  • RISC-V — открытая и свободная система команд и процессорная архитектура на основе концепции RISC для микропроцессоров и микроконтроллеров. Под эту архитектуру .NET 5.0 пока еще не представлен.
  • ARM32, ARMv7, aarch32, armhf — 32-разрядная архитектура ARM. Первые процессоры ARM для встраиваемых систем разрабатывались именно на этой архитектуре. По заявлению компании ARM Holding, в 2022 поддержка 32-битных платформ прекратится, и будет поддерживаться только 64-битная архитектура. Это означает, что компания не будет поддерживать разработку ПО для 32-битных систем. Если конечный производитель устройства пожелает установить 32-битную ОС, то ему придется самостоятельно заняться портированием драйверов с 64-битной архитектуры на 32-битную.
  • ARM64, ARMv8, aarch64 — 64-разрядная архитектура ARM. Ядра Cortex-A53 и Cortex-A57, поддерживающие ARMv8, были представлены компанией ARM Holding 30 октября 2012 года.

Плата Banana Pi BPI-M64 построена на основе процессора Allwinner A64 содержит в себе 64-битные ядра Cortex-A53, поэтому поддерживает как 32-разрядные, так и 64-разрядные приложения. Если на Banana Pi BPI-M64 установлена 64-разрядная ОС, то доступны для запуска 32 и 64-разрядные приложения. Если ОС 32-разрядная, то можно запускать только 32-разрядные приложения. Для платы Banana Pi BPI-M64 используется 64-разрядный образ ОС Armbian, поэтому на плату будем устанавливать .NET для 64-разрядных систем ARM.

Плата Cubietruck построена на основе процессора Allwinner A20 содержит в себе 32-битные ядра Cortex-A7, поэтому поддерживает только 32-разрядные приложения. Соответственно на плату будем устанавливать .NET для 32-разрядных систем.

Но что делать, если у Вас плата не Banana Pi BPI-M64 или Cubietruck? И хочется побыстрее запустить .NET на своей железке.

Все просто! С помощью команд  lscpu ,  uname –a  и  lsb_release -a , можно узнать какую версию .NET устанавливать:

  •  lscpu  — выводит информацию о архитектуре процессора, количестве ядер.
  •  uname -a  — выводит информацию о операционной системе, поддерживаемые инструкции.
  •  lsb_release -a  — выводит информацию о дистрибутиве на основе которого построена ОС.

Проверка платы Cubietruck

Выполним команду  lscpu 

root@cubietruck:~# lscpu
Architecture: armv7l
Byte Order: Little Endian
CPU(s): 2
On-line CPU(s) list: 0,1
Thread(s) per core: 1
Core(s) per socket: 2
Socket(s): 1
Vendor ID: ARM
Model: 4
Model name: Cortex-A7
Stepping: r0p4
CPU max MHz: 960.0000
CPU min MHz: 144.0000
BogoMIPS: 50.52
Flags: half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm

Строка Architecture: armv7l говорит о 32-разрядной архитектуре ARM32, ARMv7, aarch32, armhf, поэтому установка .NET для 32-разрядных систем.

Выполним команду  uname -a :

root@cubietruck:~# uname -a
Linux cubietruck 5.10.12-sunxi #21.02.1 SMP Wed Feb 3 20:39:30 CET 2021 armv7l armv7l armv7l GNU/Linux

В выводе информация о ядре Linux версии 5.10.12-sunxi и архитектуре armv7l.

Выполним команду  lsb_release -a :

root@cubietruck:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.2 LTS
Release: 20.04
Codename: focal

Операционная система основана на дистрибутиве Ubuntu 20.04.2 LTS, поэтому подойдет вариант установки .NET для 32-разрядных систем на Ubuntu 20.04

Проверка платы Banana Pi BPI-M64

Выполним команду  lscpu 

root@bananapim64:~# lscpu
Architecture: aarch64
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
NUMA node(s): 1
Vendor ID: ARM
Model: 4
Model name: Cortex-A53
Stepping: r0p4
CPU max MHz: 1152.0000
CPU min MHz: 648.0000
BogoMIPS: 48.00
L1d cache: unknown size
L1i cache: unknown size
L2 cache: unknown size
NUMA node0 CPU(s): 0-3
Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid

Строка Architecture: aarch64 говорит о 64-разрядной архитектуре ARM64, ARMv8, aarch64, поэтому возможна установка .NET для 32-х и 64-х разрядных систем.

Выполним команду  uname -a :

root@bananapim64:~# uname -a
Linux bananapim64 5.8.6-sunxi64 #20.08.2 SMP Fri Sep 4 08:52:31 CEST 2020 aarch64 aarch64 aarch64 GNU/Linux

В выводе информация о ядре Linux версии 5.8.6-sunxi64 и архитектуре aarch64. Ядро Linux — 64-разрядное, устанавливать будем .NET для 64-разрядных систем

Выполним команду  lsb_release -a :

root@bananapim64:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.5 LTS
Release: 18.04
Codename: bionic

Операционная система основана на дистрибутиве Ubuntu 18.04.5 LTS, поэтому подойдет вариант установки .NET для 64-разрядных систем на Ubuntu 18.04

Установка .NET 5.0 на ARM

.NET 5.0 можно устанавливать в трех редакциях:

  • .NET Runtime — содержит только компоненты, необходимые для запуска консольного приложения.
  • ASP.NET Core Runtime — предназначен для запуска ASP.NET Core приложений, так же включает в себя .NET Runtime для запуска консольных приложений.
  • SDK — включает в себя .NET Runtime, ASP.NET Core Runtime и .NET Desktop Runtime. Позволяет кроме запуска приложений, компилировать исходный код на языках C# 9.0, F# 5.0, Visual Basic 15.9.

Занимаемое пространство на диске редакциями:

Компонент (ARM64) Размер, Мбайт
.NET Runtime 5.0.3 78 
ASP.NET Core Runtime 5.0.3 98,3
SDK 5.0.103 393

Загрузить .NET с сайта Microsoft можно по ссылке Download .NET 5.0.

Скрипты установки основаны на коде шаблонных Docker-образов .NET. ветки focal так же на ресурсе опубликованы скрипты для следующих ОС: alpine3.12, alpine3.13 buster-slim, с поддержкой аппаратных платформ AMD64, ARM32v7, ARM64v8.

Установка .NET Runtime

Выполним скрипт установки, в зависимости от разрядности системы ARM32 или ARM64:

ARM64ARM32
$ cd ~/
$ apt-get update && apt-get install curl
$ export DOTNET_VERSION=5.0.3
$ curl -SL --output dotnet.tar.gz https://dotnetcli.azureedge.net/dotnet/Runtime/$DOTNET_VERSION/dotnet-runtime-$DOTNET_VERSION-linux-arm64.tar.gz \
&& dotnet_sha512='f4d176b48714121040470a25f76a1b3554edb358953c1bfb39bd111cf0dcc85cb8a5ebcd617efd207b3cfaef0a2d242f94e9f018a186828a750c5c0dc9bd7da5' \
&& echo "$dotnet_sha512 dotnet.tar.gz" | sha512sum -c - \
&& mkdir -p /usr/share/dotnet \
&& tar -ozxf dotnet.tar.gz -C /usr/share/dotnet \
&& rm dotnet.tar.gz
$ ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet
$ cd ~/
$ apt-get update && apt-get install curl
$ export DOTNET_VERSION=5.0.3
$ curl -SL --output dotnet.tar.gz https://dotnetcli.azureedge.net/dotnet/Runtime/$DOTNET_VERSION/dotnet-runtime-$DOTNET_VERSION-linux-arm.tar.gz \
&& dotnet_sha512='d89c1769dfdfe30092825a94aa0037ca99ef83a0935ba24755377813db9e4a2e49e41611d02cf24aa4a423fb44bc566cdd935f62db61fe04a5257932bed4abf4' \
&& echo "$dotnet_sha512 dotnet.tar.gz" | sha512sum -c - \
&& mkdir -p /usr/share/dotnet \
&& tar -ozxf dotnet.tar.gz -C /usr/share/dotnet \
&& rm dotnet.tar.gz
$ ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet

Проверим запуск .NET, командой (результат одинаков для Banana Pi BPI-M64 и Cubietruck):  dotnet —info 

root@bananapim64:~# dotnet --info
Host (useful for support):
Version: 5.0.3
Commit: c636bbdc8a

.NET SDKs installed:
No SDKs were found.

.NET runtimes installed:
Microsoft.NETCore.App 5.0.3 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

To install additional .NET runtimes or SDKs:
https://aka.ms/dotnet-download

.NET установлен в системе, для запуска приложений в Linux необходимо воспользоваться командой:   dotnet ConsoleApp1.dll 

Установка ASP.NET Core Runtime

Поддержка ASP.NET Core приложений реализуется в контексте .NET Runtime, поэтому ASP.NET Core Runtime включает в себя .NET Runtime. Выполним скрипт установки:

ARM64ARM32
$ cd ~/
$ apt-get update && apt-get install curl
$ export ASPNET_VERSION=5.0.3
$ curl -SL --output aspnetcore.tar.gz https://dotnetcli.azureedge.net/dotnet/aspnetcore/Runtime/$ASPNET_VERSION/aspnetcore-runtime-$ASPNET_VERSION-linux-arm64.tar.gz \
&& aspnetcore_sha512='4eaf1b0120479102b342f1f3a8ad8f40b7326e3657d2b7359c09fd1951c5169ca02d1ead4d4d01f6e594adbe0cb21f135f4c61ff90613219596f6cc222161717' \
&& echo "$aspnetcore_sha512 aspnetcore.tar.gz" | sha512sum -c - \
&& mkdir -p /usr/share/dotnet \
&& tar -ozxf aspnetcore.tar.gz -C /usr/share/dotnet \
&& rm aspnetcore.tar.gz
$ ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet
$ cd ~/
$ apt-get update && apt-get install curl
$ export ASPNET_VERSION=5.0.3
$ curl -SL --output aspnetcore.tar.gz https://dotnetcli.azureedge.net/dotnet/aspnetcore/Runtime/$ASPNET_VERSION/aspnetcore-runtime-$ASPNET_VERSION-linux-arm.tar.gz \
&& aspnetcore_sha512='2e9ea5fdb15b8fe56890cfb635216b3c68afb12a48d40e2c1e58838baffb1a80aa75e6da363d878c3caaf9880c506ec12e316b93baae1e307ef04eb90d7d327c' \
&& echo "$aspnetcore_sha512 aspnetcore.tar.gz" | sha512sum -c - \
&& mkdir -p /usr/share/dotnet \
&& tar -ozxf aspnetcore.tar.gz -C /usr/share/dotnet \
&& rm aspnetcore.tar.gz
$ ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet

Проверим запуск .NET, командой (результат одинаков для Banana Pi BPI-M64 и Cubietruck):  dotnet —info 

root@bananapim64:~# dotnet --info

Host (useful for support):
Version: 5.0.3
Commit: c636bbdc8a

.NET SDKs installed:
No SDKs were found.

.NET runtimes installed:
Microsoft.AspNetCore.App 5.0.3 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 5.0.3 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

To install additional .NET runtimes or SDKs:
https://aka.ms/dotnet-download

В сравнение с предыдущей установкой .NET Runtime, список .NET runtimes пополнился средой исполнения: Microsoft.AspNetCore.App 5.0.3

Установка .NET SDK

Microsoft в .NET SDK и PowerShell интегрировала телеметрию, которая по умолчанию включена. Для отключения телеметрии используются переменные окружения: DOTNET_CLI_TELEMETRY_OPTOUT, POWERSHELL_TELEMETRY_OPTOUT. Если выставлено значение «true» или «1», то данные телеметрии на сервера Microsoft не будут отправляться. Помимо использования переменных в сеансе установки, укажем их в глобальном окружение Linux в файле  /etc/environment , для сохранения значений после перезагрузки.

Выполним скрипт установки:

ARM64ARM32
$ cd ~/
$ export DOTNET_SDK_VERSION=5.0.103
$ export DOTNET_CLI_TELEMETRY_OPTOUT=true
$ apt-get update
$ apt-get install -y --no-install-recommends curl git procps wget
$ curl -SL --output dotnet.tar.gz https://dotnetcli.azureedge.net/dotnet/Sdk/$DOTNET_SDK_VERSION/dotnet-sdk-$DOTNET_SDK_VERSION-linux-arm64.tar.gz \
&& dotnet_sha512='179bcc4d280011a0d23f8f0d78349a372fe495e9c5aff106882c08025367ce49afe897f65c033c3f046bae2b1e49f7f6526edce273ab21e77812bbb8317d08a8' \
&& echo "$dotnet_sha512 dotnet.tar.gz" | sha512sum -c - \
&& mkdir -p /usr/share/dotnet \
&& tar -ozxf dotnet.tar.gz -C /usr/share/dotnet \
&& rm dotnet.tar.gz
$ ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet
$ cd ~/
$ export DOTNET_SDK_VERSION=5.0.103
$ export DOTNET_CLI_TELEMETRY_OPTOUT=true
$ apt-get update
$ apt-get install -y --no-install-recommends curl git procps wget
$ curl -SL --output dotnet.tar.gz https://dotnetcli.azureedge.net/dotnet/Sdk/$DOTNET_SDK_VERSION/dotnet-sdk-$DOTNET_SDK_VERSION-linux-arm.tar.gz \
&& dotnet_sha512='ad07c5921b79d3ea3fdd7af2d26f118dcf74aa8ab6e147e0cdfeef94e656606777df8832135d52d24f22b5f1ebe75f51ee78462aeaa262b675e89ad04d55c0bf' \
&& echo "$dotnet_sha512 dotnet.tar.gz" | sha512sum -c - \
&& mkdir -p /usr/share/dotnet \
&& tar -ozxf dotnet.tar.gz -C /usr/share/dotnet \
&& rm dotnet.tar.gz
$ ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet

Установка PowerShell:

ARM64ARM32
$ cd ~/
$ export powershell_version=7.1.1
$ export POWERSHELL_TELEMETRY_OPTOUT=true
$ apt-get update
$ curl -SL --output PowerShell.Linux.arm64.$powershell_version.nupkg https://pwshtool.blob.core.windows.net/tool/$powershell_version/PowerShell.Linux.arm64.$powershell_version.nupkg \
&& powershell_sha512='27a9b8f139a9f6a38ad447b9ddac21bbb7501a1347525676f5dc0dc9bc69b7eeac84c2d3c2e23e732a76760284a08b0cc9b0866ada59a41ec8cf090d8d160cf6' \
&& echo "$powershell_sha512 PowerShell.Linux.arm64.$powershell_version.nupkg" | sha512sum -c - \
&& mkdir -p /usr/share/powershell \
&& dotnet tool install --add-source / --tool-path /usr/share/powershell --version $powershell_version PowerShell.Linux.arm64 \
&& dotnet nuget locals all --clear \
&& rm PowerShell.Linux.arm64.$powershell_version.nupkg \
&& ln -s /usr/share/powershell/pwsh /usr/bin/pwsh \
&& chmod 755 /usr/share/powershell/pwsh \
&& find /usr/share/powershell -print | grep -i '.*[.]nupkg$' | xargs rm
$ cd ~/
$ export powershell_version=7.1.1
$ export POWERSHELL_TELEMETRY_OPTOUT=true
$ apt-get update
$ curl -SL --output PowerShell.Linux.arm32.$powershell_version.nupkg https://pwshtool.blob.core.windows.net/tool/$powershell_version/PowerShell.Linux.arm32.$powershell_version.nupkg \
&& powershell_sha512='95dd1e28c86856ffa96f6e4b6a1f9e4f1b1703e9ad29216f6b12c4a780b919422afc6233e3879c15b868c4feef018630cc14c604af6c75d13fa91807beaa4d20' \
&& echo "$powershell_sha512  PowerShell.Linux.arm32.$powershell_version.nupkg" | sha512sum -c - \
&& mkdir -p /usr/share/powershell \
&& dotnet tool install --add-source / --tool-path /usr/share/powershell --version $powershell_version PowerShell.Linux.arm32 \
&& dotnet nuget locals all --clear \
&& rm PowerShell.Linux.arm32.$powershell_version.nupkg \
&& ln -s /usr/share/powershell/pwsh /usr/bin/pwsh \
&& chmod 755 /usr/share/powershell/pwsh \
&& find /usr/share/powershell -print | grep -i '.*[.]nupkg$' | xargs rm

Вызов PowerShell осуществляется с помощью команды:  pwsh . Затем в PoweShell выполнить команды: Get-Host и exit

Проверка версии PowerShell (результат одинаков для Banana Pi BPI-M64 и Cubietruck):

root@bananapim64:~# pwsh
PowerShell 7.1.1
Copyright (c) Microsoft Corporation.

https://aka.ms/powershell
Type 'help' to get help.

Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
PS /root> Get-Host

Name : ConsoleHost
Version : 7.1.1
InstanceId : d6e0c174-780c-4342-9533-d68f9b9f2a97
UI : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture : en-US
CurrentUICulture : en-US
PrivateData : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
DebuggerEnabled : True
IsRunspacePushed : False
Runspace : System.Management.Automation.Runspaces.LocalRunspace

PS /root> exit
root@cubietruck:~#

Добавим переменные DOTNET_CLI_TELEMETRY_OPTOUT, POWERSHELL_TELEMETRY_OPTOUT в файле  /etc/environment :

$ echo "DOTNET_CLI_TELEMETRY_OPTOUT=true" >> /etc/environment
$ echo "POWERSHELL_TELEMETRY_OPTOUT=true" >> /etc/environment

Проверим запуск .NET командой:  dotnet —info 

ARM64ARM32
root@bananapim64:~# dotnet --info
.NET SDK (reflecting any global.json):
 Version:   5.0.103
 Commit:    72dec52dbd

Runtime Environment:
 OS Name:     ubuntu
 OS Version:  18.04
 OS Platform: Linux
 RID:         ubuntu.18.04-arm64
 Base Path:   /usr/share/dotnet/sdk/5.0.103/

Host (useful for support):
  Version: 5.0.3
  Commit:  c636bbdc8a

.NET SDKs installed:
  5.0.103 [/usr/share/dotnet/sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 5.0.3 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 5.0.3 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

To install additional .NET runtimes or SDKs:
  https://aka.ms/dotnet-download
root@cubietruck:~# dotnet --info
.NET SDK (reflecting any global.json):
 Version:   5.0.103
 Commit:    72dec52dbd

Runtime Environment:
 OS Name:     ubuntu
 OS Version:  20.04
 OS Platform: Linux
 RID:         ubuntu.20.04-arm
 Base Path:   /usr/share/dotnet/sdk/5.0.103/

Host (useful for support):
  Version: 5.0.3
  Commit:  c636bbdc8a

.NET SDKs installed:
  5.0.103 [/usr/share/dotnet/sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 5.0.3 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 5.0.3 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

To install additional .NET runtimes or SDKs:
  https://aka.ms/dotnet-download

Создадим новое консольное приложение myApp и запустим его:

$ cd ~/
$ dotnet new console -o myApp
$ cd myApp
$ dotnet build
$ dotnet run

Результат работы приложения:

root@bananapim64:~/myApp# dotnet run
Hello World!

.NET SDK работает!

Ссылки

Вам также может понравиться

About the Author: Anton

Programistik