在 ec2 linux AMI 2 (c6g) 上安装 dotnet core

Posted

技术标签:

【中文标题】在 ec2 linux AMI 2 (c6g) 上安装 dotnet core【英文标题】:Install dotnet core on ec2 linux AMI 2 (c6g) 【发布时间】:2020-07-16 20:23:18 【问题描述】:

我正在尝试在 linux AMI 2 ec2 实例 (c6g) 上安装 dotnet-sdk-3.0。我是 linux 新手,所以尝试了几个命令,但似乎没有什么对我有用。我在下面试过了。

sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm


sudo yum install dotnet-sdk-3.1
sudo yum install dotnet-sdk-3.0

当我在上面尝试时,我遇到了错误。

[ec2-user@ip-0-0-0-0 console]$ sudo yum install dotnet-sdk-3.0
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                               | 3.7 kB     00:00
amzn2extra-docker                                        | 3.0 kB     00:00
amzn2extra-nginx1.12                                     | 1.3 kB     00:00
packages-microsoft-com-prod                              | 3.0 kB     00:00
packages-microsoft-com-prod/primary_db                     | 288 kB   00:00
No package dotnet-sdk-3.0 available.
Error: Nothing to do

然后我尝试了

mkdir -p "$HOME/dotnet" && tar zxf dotnet-sdk-3.0.100-linux-x64.tar.gz -C                                                                              "$HOME/dotnet"
export DOTNET_ROOT=$HOME/dotnet
export PATH=$PATH:$HOME/dotnet

在此之后尝试了 dotnet 命令但得到了错误。 dotnet:找不到命令

终于在下面尝试了:

mkdir -p $HOME/dotnet && tar zxf dotnet-sdk-3.1.302-linux-arm64.tar.gz -C                                                                                         $HOME/dotnet
export DOTNET_ROOT=$HOME/dotnet
export PATH=$PATH:$HOME/dotnet
dotnet
dotnet --list-sdk

当我运行它时,我得到了以下错误

[ec2-user@ip-0-0-0-0 home]$ dotnet --list-sdk
Process terminated. Couldn't find a valid ICU package installed on the system. Set the configuration flag System.Globalization.Invariant to true if you want to run with no globalization support.
   at System.Environment.FailFast(System.String)
   at System.Globalization.GlobalizationMode.GetGlobalizationInvariantMode()
   at System.Globalization.GlobalizationMode..cctor()
   at System.Globalization.CultureData.CreateCultureWithInvariantData()
   at System.Globalization.CultureData.get_Invariant()
   at System.Globalization.CultureInfo..cctor()
   at System.String.ToLowerInvariant()
   at Microsoft.DotNet.PlatformAbstractions.RuntimeEnvironment.GetArch()
   at Microsoft.DotNet.PlatformAbstractions.RuntimeEnvironment..cctor()
   at Microsoft.DotNet.PlatformAbstractions.RuntimeEnvironment.GetRuntimeIdentifier()
   at Microsoft.DotNet.Cli.MulticoreJitProfilePathCalculator.CalculateProfileRootPath()
   at Microsoft.DotNet.Cli.MulticoreJitActivator.StartCliProfileOptimization()
   at Microsoft.DotNet.Cli.MulticoreJitActivator.TryActivateMulticoreJit()
   at Microsoft.DotNet.Cli.Program.Main(System.String[])
Aborted

还尝试运行 dotnet 并收到此错误。

Failed to load ▒r▒), error: /home/ec2-user/dotnet/shared/Microsoft.NETCore.App/3.0.0/libhostpolicy.so: cannot open shared object file: No such file or directory
An error occurred while loading required library libhostpolicy.so from [/home/ec2-user/dotnet/shared/Microsoft.NETCore.App/3.0.0]
[ec2-user@ip-0-0-0-0 console]$

我也关注了微软的文档。 https://docs.microsoft.com/en-us/dotnet/core/install/linux-centos

似乎没有什么对我有用。有人可以在这里帮助我吗,我从过去 2 天开始就卡住了。

提前致谢。

PS:我是 linux 的新手。

【问题讨论】:

【参考方案1】:

我能够通过以下步骤使其在 Amazon Linux 2 ARM64 上运行:

    下载并构建最新版本的 Unicode 国际组件。 Amazon Linux 2 在包管理器中提供了版本 50,但 dotnet 会查找版本 55 或更高版本。当 Amazon Linux 对此进行更新时,此步骤将不再需要,可以替换为 sudo yum install icu。 安装 gcc 和 python3,因为构建 libicu 需要它们。构建库需要几分钟时间。 Amazon Linux 2 最近将 libicu60 添加到包管理器中,因此您可以简单地使用 yum 安装它:
sudo yum -y install libicu60
    按照 Microsoft 的说明安装 dotnet sdk。从 Microsoft 网站下载 dotnet sdk。您可能需要从 this link 下载以获取最新版本,但下面的链接对我有用。
cd ~
wget https://download.visualstudio.microsoft.com/download/pr/5ee48114-19bf-4a28-89b6-37cab15ec3f2/f5d1f54ca93ceb8be7d8e37029c8e0f2/dotnet-sdk-3.1.302-linux-arm64.tar.gz
mkdir -p $HOME/dotnet && tar zxf ~/dotnet-sdk-3.1.302-linux-arm64.tar.gz -C $HOME/dotnet
export DOTNET_ROOT=$HOME/dotnet
export PATH=$PATH:$HOME/dotnet
    测试它是否正常工作
[ec2-user@ip-172-31-69-243 ~]$ dotnet --list-sdks
3.1.302 [/home/ec2-user/dotnet/sdk]

【讨论】:

【参考方案2】:

您正在 arm64/aarch64 上运行它。这是一个相对较新的架构。它也与 Intel 64 位架构(x86_64x64)不兼容。所以你需要注意这一点。

通过 RPM 安装

编辑:所以,如果您想使用 RPM 包,这将不起作用。

引用https://docs.microsoft.com/en-us/dotnet/core/install/linux-centos:

包管理器安装仅在 x64 架构上受支持。其他架构(例如 ARM)必须手动安装 .NET Core SDK 或 .NET Core Runtime。有关详细信息,请参阅下面的手动安装部分。

您正在使用aarch64/arm64。你没有使用x64,所以这是行不通的。

需要使用tarball安装方式。

过时的建议:

我正在尝试在 linux AMI 2 ec2 实例 (c6g) 上安装 dotnet-sdk-3.0。

sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm

您正在运行 Amazon Linux 2,对吧?正如这里的 URL 所说,这是针对 CentOS 7 的。它可能(也可能不会)在您的 Linux 发行版上工作。不管怎样,试试看吧。

$ sudo yum install dotnet-sdk-3.0
No package dotnet-sdk-3.0 available.
Error: Nothing to do

错误说它找不到这个包。也许不存在具有此名称的包?也许您使用了错误的名称?尝试使用yum list 找到正确的名称:

sudo yum list 'dotnet-sdk*'

它应该显示一个包列表,包括像dotnet-sdk-3.0.103 这样的名称。您可以按名称安装该软件包,然后:

sudo yum install dotnet-sdk-3.0.103

如果这不起作用,请尝试使用 yum list 中的另一个包名称并尝试安装它。

手动安装

然后我尝试了

mkdir -p "$HOME/dotnet" && tar zxf dotnet-sdk-3.0.100-linux-x64.tar.gz -C "$HOME/dotnet"
export DOTNET_ROOT=$HOME/dotnet
export PATH=$PATH:$HOME/dotnet

在此之后尝试了dotnet 命令但得到了错误。 dotnet:找不到命令

您正在运行aarch64 机器。您需要使用 arm64 压缩包,而不是 x64 压缩包。 x64 压缩包适用于英特尔处理器。它不适用于 ARM 处理器。

这太令人惊讶了。让我分解一下这组步骤的作用:

    mkdir -p "$HOME/dotnet" 在您的主目录中创建一个名为 dotnet 的目录 tar xf ... 提取您在步骤 1 中创建的 dotnet 目录中的 dotnet SDK tarball export DOTNET_ROOT=$HOME/dotnet 定义了一个环境变量 DOTNET_ROOT。 .NET 运行时需要它;我自己对为什么有点模糊 export PATH=$PATH:$HOME/dotnet 将您安装 .NET SDK 的目录添加到环境变量 PATHPATH 是操作系统用来搜索您输入的命令的位置列表。例如,当您在命令行中键入 dotnet 时,它会在此目录列表中搜索 dotnet 可执行文件(想想 Windows 上的 dotnet.exe)。

那么我们来一一调试吧:

目录dotnet 是否存在于您的主主目录​​(又名$HOME)中?你能cd ~/dotnet吗?这行得通吗? 解压压缩包后,您是否在$HOMEdotnet 目录中看到一个名为dotnet 的文件? ls $HOME/dotnet/dotnet 有效吗?它向您展示了什么? echo $PATH 向您展示了什么?它是否在值中包含该 dotnet 目录? 如果您运行which dotnet,它会在您的主$HOME 目录中找到dotnet 可执行文件吗?

运行 SDK

当我运行它时,我得到了以下错误

[ec2-user@ip-0-0-0-0 home]$ dotnet --list-sdk
Process terminated. Couldn't find a valid ICU package installed on the system. Set the configuration flag System.Globalization.Invariant to true if you want to run with no globalization support

错误包括以下短语:找不到系统上安装的有效 ICU 软件包。

确实是这个意思。您需要为您的 Linux 发行版安装 ICU 软件包:

sudo yum install libicu

然后尝试再次运行dotnet --list-sdk

错误运行dll

Failed to load ▒r▒), error: /home/ec2-user/dotnet/shared/Microsoft.NETCore.App/3.0.0/libhostpolicy.so: cannot open shared object file: No such file or directory
An error occurred while loading required library libhostpolicy.so from [/home/ec2-user/dotnet/shared/Microsoft.NETCore.App/3.0.0]

这很奇怪。它说它找不到应该是 .NET Core 安装一部分的文件。

dotnet --list-runtimes 说什么?它是否显示安装的 3.0.0 运行时?如果没有,那意味着你的安装搞砸了。您可能应该再次安装 .NET Core 3.0。 (或者更好的是,安装 3.1,因为 3.0 已经报废)。

文件/home/ec2-user/dotnet/shared/Microsoft.NETCore.App/3.0.0/libhostpolicy.so 是否存在?如果不是,那就是和上面一样的问题:你的安装搞砸了。

file /home/ec2-user/dotnet/shared/Microsoft.NETCore.App/3.0.0/libhostpolicy.so 说什么?是ELF 64-bit LSB shared object吗?

输出为:ELF 64-bit LSB shared object, x86-64

这是一个x86-64 文件!换句话说,您已经(不知何故)安装了linux-x64(英特尔 64 位架构)运行时。毫不奇怪,它不适用于 ARM 64 位架构。您需要删除它并重新安装 SDK。我建议您删除当前的安装 (rm -rf $HOME/dotnet) 并重新安装 linux-arm64 SDK。

【讨论】:

sudo yum list 'dotnet-sdk*' 这给了我[ec2-user@ip-0-0-0-0 ~]$ sudo yum list 'dotnet-sdk*' Loaded plugins: extras_suggestions, langpacks, priorities, update-motd Error: No matching Packages to list Does the directory dotnet exist in your main home directory (aka $HOME)? Can you cd ~/dotnet? Does that work?After you extract the tarball, do you see a file named dotnet in the dotnet directory in your $HOME? Does ls $HOME/dotnet/dotnet work? What does it show you?[ec2-user@ip-0-0-0-0 ~]$ ls $HOME/dotnet/dotnet /home/ec2-user/dotnet/dotnet $ echo $PATH /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ec2-user/.local/bin:/home/ec2-user/bin:/home/ec2-user/dotnet:/home/ec2-user/dotnet $ which dotnet ~/dotnet/dotnet 当我运行命令sudo yum install libicu时,我收到了一条消息Package libicu-50.2-4.amzn2.aarch64 already installed and latest version Nothing to do 哦,这是aarch64 机器吗?我错过了问题中的arm64。现在一切都变得更有意义了。将再次编辑我的答案。 What does file /home/ec2-user/dotnet/shared/Microsoft.NETCore.App/3.0.0/libhostpolicy.so say? Is it an ELF 64-bit LSB shared object? - 它说 _ ELF 64 位 LSB 共享对象,x86-64,版本 1 (SYSV),动态链接,BuildID[sha1]=36c3a75b75401675fa55296e845b5330e9041b05,剥离_

以上是关于在 ec2 linux AMI 2 (c6g) 上安装 dotnet core的主要内容,如果未能解决你的问题,请参考以下文章

在 Linux AMI EC2 实例上为 phpMyAdmin 5.0.2 安装启用 mysqli

phpmyadmin 无法在亚马逊 ec2 实例上的 linux ami 中的 nginx Web 服务器上工作

Amazon linux:创建 ami 映像时更改默认 ec2-user

AWS EC2 - 我从 AMI 映像克隆的实例上的 EBS 卷在哪里?

Docker和AMI之间的区别

是否可以用不同的 AMI 替换 EC2 实例上的 AMI?