
В конце прошлого года вышел релиз фреймворка .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
Выполним скрипт установки, в зависимости от разрядности системы ARM32 или ARM64:
$ 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. Выполним скрипт установки:
$ 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 , для сохранения значений после перезагрузки.
Выполним скрипт установки:
$ 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:
$ 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
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 работает!