在 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 国际组件。
sudo yum install icu
。
安装 gcc 和 python3,因为构建 libicu
需要它们。构建库需要几分钟时间。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_64
或 x64
)不兼容。所以你需要注意这一点。
通过 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 的目录添加到环境变量 PATH
。 PATH
是操作系统用来搜索您输入的命令的位置列表。例如,当您在命令行中键入 dotnet
时,它会在此目录列表中搜索 dotnet
可执行文件(想想 Windows 上的 dotnet.exe
)。
那么我们来一一调试吧:
目录dotnet
是否存在于您的主主目录(又名$HOME
)中?你能cd ~/dotnet
吗?这行得通吗?
解压压缩包后,您是否在$HOME
的dotnet
目录中看到一个名为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