В конце прошлого года вышел релиз фреймворка .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 будет производится на следующие устройства:
- Плата Cubietruck установлена версия Armbian_21.02.1_Cubietruck_focal_current_5.10.12.img.xz, основанная на Ubuntu 20.04.1 LTS (Focal Fossa), ядро Linux 5.10.12. uname: Linux cubietruck 5.10.12-sunxi #21.02.1 SMP Wed Feb 3 20:39:30 CET 2021 armv7l armv7l armv7l GNU/Linux.
- Плата Banana Pi BPI-M64 установлена версия Armbian_20.08.2_Bananapim64_bionic_current_5.8.6_minimal.img.xz, основанная на Ubuntu 18.04.5 LTS (Bionic Beaver), ядро Linux 5.8.6. uname: Linux bananapim64 5.8.6-sunxi64 #20.08.2 SMP Fri Sep 4 08:52:31 CEST 2020 aarch64 aarch64 aarch64 GNU/Linux.
Определение архитектуры 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:
$ 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. Выполним скрипт установки:
$ 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, нужно будет заменить номер версии на последний
Выполним скрипт установки:
$ 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:
$ 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
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 необходимо сделать следующее:
- Удалить папку /usr/share/dotnet/
- Выполнить скрипт установки, указав новую версию .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 Обновлены скрипты установки. Добавлен раздел — Обновление.