Установка .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

На странице Download .NET 5.0. можно узнать текущую актуальную версию .NET. В первой колонке Release information будет указана версия: v5.0.5 Released 2021-04-06. Версия номер: 5.0.5. В случае выхода более новый версии .NET, ниже в скрипте в строке export DOTNET_VERSION=5.0.5, нужно будет заменить номер версии на последний. Выполним скрипт установки, в зависимости от разрядности системы ARM32 или ARM64:

ARM64ARM32
$ cd ~/
$ apt-get update && apt-get install -y curl
$ export DOTNET_VERSION=5.0.5
$ curl -SL --output dotnet.tar.gz https://dotnetcli.azureedge.net/dotnet/Runtime/$DOTNET_VERSION/dotnet-runtime-$DOTNET_VERSION-linux-arm64.tar.gz \
&& 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 -y curl
$ export DOTNET_VERSION=5.0.5
$ curl -SL --output dotnet.tar.gz https://dotnetcli.azureedge.net/dotnet/Runtime/$DOTNET_VERSION/dotnet-runtime-$DOTNET_VERSION-linux-arm.tar.gz \
&& 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.5
  Commit:  2f740adc14
.NET SDKs installed:
  No SDKs were found.
.NET runtimes installed:
  Microsoft.NETCore.App 5.0.5 [/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 -y curl
$ export ASPNET_VERSION=5.0.5
$ curl -SL --output aspnetcore.tar.gz https://dotnetcli.azureedge.net/dotnet/aspnetcore/Runtime/$ASPNET_VERSION/aspnetcore-runtime-$ASPNET_VERSION-linux-arm64.tar.gz \
&& 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 -y curl
$ export ASPNET_VERSION=5.0.5
$ curl -SL --output aspnetcore.tar.gz https://dotnetcli.azureedge.net/dotnet/aspnetcore/Runtime/$ASPNET_VERSION/aspnetcore-runtime-$ASPNET_VERSION-linux-arm.tar.gz \
&& 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.5
  Commit:  2f740adc14
.NET SDKs installed:
  No SDKs were found.
.NET runtimes installed:
  Microsoft.AspNetCore.App 5.0.5 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 5.0.5 [/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 , для сохранения значений после перезагрузки. Актуальную версию SDK можно посмотреть на странице Download .NET 5.0. В случае выхода более новый версии SDK, ниже в скрипте в строке export DOTNET_SDK_VERSION=5.0.202, нужно будет заменить номер версии на последний

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

ARM64ARM32
$ cd ~/
$ export DOTNET_SDK_VERSION=5.0.202
$ 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 \
&& 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.202
$ 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 \
&& 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.3
$ 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 \
&& 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.3
$ 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 \
&& 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.3
Copyright (c) Microsoft Corporation.

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

PS /root> Get-Host

Name             : ConsoleHost
Version          : 7.1.3
InstanceId       : 304abdbf-19c7-4f72-909a-47795d9ac1d0
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@bananapim64:~#

Добавим переменные 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 

ARM64
root@bananapim64:~# dotnet --info
.NET SDK (reflecting any global.json):
Version: 5.0.202
Commit: db7cc87d51

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.202/

Host (useful for support):
Version: 5.0.5
Commit: 2f740adc14

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

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

To install additional .NET runtimes or SDKs:
https://aka.ms/dotnet-download
root@bananapim64:~#

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

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

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

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

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

Обновление

При выходе новых версий .NET необходимо сделать следующее:

  1. Удалить папку /usr/share/dotnet/
  2. Выполнить скрипт установки, указав новую версию .NET в строке export: DOTNET_VERSION=5.0.5, export ASPNET_VERSION=5.0.5, export DOTNET_SDK_VERSION=5.0.202. Номер последней версии .NET можно посмотреть на странице Download .NET 5.0. Строку скрипта создания символической ссылки выполнять не надо: ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet

Обновление: 11/04/2021 Обновлены скрипты установки. Добавлен раздел — Обновление.

Литература

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

About the Author: Anton

Programistik