core
core copied to clipboard
Installing .NET 6 on Ubuntu 22.04 (Jammy)
Installing .NET 6 on Ubuntu 22.04 (Jammy)
We announced support for .NET 6 on Ubuntu 22.04 with our May 2022 Updates. At that time, the supported installation methods were manual installation via a tarball or a .deb
package via packages.microsoft.com (PMC). .NET 6 is now available natively via Jammy feeds, which can cause conflicts with PMC feeds. You need to apply the following guidance to install .NET 6 reliably and correctly on Ubuntu 22.04+.
More information will be shared shortly on .NET 6 being available natively in the jammy-updates
feed. In general, we recommend that you use the native packages from this feed since it is much easier and simpler.
You can use one of the following scenarios:
- The first two scenarios assume a clean machine. You want .NET 6 packages and haven't installed them before.
- The second two scenarios assume you're machine is in a mixed-state, that you've installed .NET 6 packages before and don't have the ones you want or are in a bad state.
Related:
- https://github.com/dotnet/core/issues/7713
Clean machine scenario 1: Use .NET 6 Package via Jammy feed
The easiest approach is to use the .NET 6 package available in Jammy feeds. In this scenario, just install dotnet6
and don't register the PMC feed.
You can do that via the following commands:
sudo apt update && sudo apt -y install dotnet6
You can see this demonstrated with Docker:
$ docker run --rm -it ubuntu:jammy
root@4c9d58f507a3:/# apt update && apt install -y dotnet6
root@444999ffd672:/# dotnet --version
6.0.108
Note: This build of .NET 6 is for the 6.0.1xx
band. 6.0.4xx
builds are available via PMC. That difference matters most to Windows users. Both builds are supported.
Clean machine scenario 2: Use .NET 6 Package via PMC
You can install .NET 6 on Ubuntu 22.04 from packages.microsoft.com
using the following steps:
wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
Configure apt preferences, to prioritize PMC repository, by creating the following file: /etc/apt/preferences
To create the file:
sudo touch /etc/apt/preferences
with contents:
Package: *
Pin: origin "packages.microsoft.com"
Pin-Priority: 1001
Update your APT information:
sudo apt update
Install .NET SDK 6.0:
sudo apt install dotnet-sdk-6.0
Mixed state scenario 1: Use native Jammy packages after installing a previous .NET release from PMC
You may want to switch to using the .NET 6 package available in Jammy after installing .NET 6 from PMC.
Do the following:
- Remove all .NET packages
sudo apt remove --purge dotnet*
sudo apt remove --purge aspnetcore*
- Delete PMC repository from APT, using any of the typical methods, for instance by deleting the repo .list file
sudo rm /etc/apt/sources.list.d/microsoft-prod.list
- Update APT
sudo apt update
- Install .NET SDK 6.0
sudo apt install dotnet-sdk-6.0
Mixed state scenario 2: Use PMC packages after installing native Jammy packages
You may want to switch to using packages.microsoft.com
packages after installing native packages, potentially because you want to use 6.0.4xx
builds.
Do the following:
- Remove all .NET packages
sudo apt remove --purge dotnet*
sudo apt remove --purge aspnetcore*
- Create apt preferences file as specified in the section above
- Install .NET SDK 6.0
sudo apt install dotnet-sdk-6.0
How to identify which packages you'd installed
We'll install .NET 6 with both feeds, from a clean state, and then point the various ways you can identify which feed you installed the package from.
First, let's install the native Jammy packages using the "Clean machine scenario 1" guidance.
rich@kamloops:~$ docker run --rm -it ubuntu:jammy
root@db7fd8ec177e:/# apt update && apt install -y dotnet6
Get:18 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 dotnet6 amd64 6.0.108-0ubuntu1~22.04.1 [20.5 kB]
root@db7fd8ec177e:/# dotnet --info
.NET SDK (reflecting any global.json):
Version: 6.0.108
Commit: 4e3a463d2b
Runtime Environment:
OS Name: ubuntu
OS Version: 22.04
OS Platform: Linux
RID: ubuntu.22.04-x64
Base Path: /usr/lib/dotnet/dotnet6-6.0.108/sdk/6.0.108/
global.json file:
Not found
Host:
Version: 6.0.8
Architecture: x64
Commit: 55fb7ef977
.NET SDKs installed:
6.0.108 [/usr/lib/dotnet/dotnet6-6.0.108/sdk]
.NET runtimes installed:
Microsoft.AspNetCore.App 6.0.8 [/usr/lib/dotnet/dotnet6-6.0.108/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 6.0.8 [/usr/lib/dotnet/dotnet6-6.0.108/shared/Microsoft.NETCore.App]
Download .NET:
https://aka.ms/dotnet-download
Learn about .NET Runtimes and SDKs:
https://aka.ms/dotnet/runtimes-sdk-info
Notice that we've installed .NET SDK 6.0.108
, installed to /usr/lib/dotnet/
, and that the dotnet6
package is being installed from http://archive.ubuntu.com/ubuntu jammy-updates/universe
. That's expected for the native packages.
Let's try the same thing with PMC, but with the "Clean machine scenario 2" guidance.
rich@kamloops:~$ docker run --rm -it ubuntu:jammy
root@626dcadc888b:/# apt update && apt install -y wget
root@626dcadc888b:/# wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
root@626dcadc888b:/# dpkg -i packages-microsoft-prod.deb
root@626dcadc888b:/# rm packages-microsoft-prod.deb
root@626dcadc888b:/# touch /etc/apt/preferences
root@626dcadc888b:/# echo "Package: *" >> /etc/apt/preferences
root@626dcadc888b:/# echo "Pin: origin \"packages.microsoft.com\"" >> /etc/apt/preferences
root@626dcadc888b:/# echo Pin-Priority: 1001 >> /etc/apt/preferences
root@626dcadc888b:/# cat /etc/apt/preferences
Package: *
Pin: origin "packages.microsoft.com"
Pin-Priority: 1001
root@626dcadc888b:/# apt update && apt -y install dotnet-sdk-6.0
Get:11 https://packages.microsoft.com/ubuntu/22.04/prod jammy/main amd64 dotnet-sdk-6.0 amd64 6.0.400-1 [86.4 MB]
root@626dcadc888b:/# dotnet --info
.NET SDK (reflecting any global.json):
Version: 6.0.400
Commit: 7771abd614
Runtime Environment:
OS Name: ubuntu
OS Version: 22.04
OS Platform: Linux
RID: ubuntu.22.04-x64
Base Path: /usr/share/dotnet/sdk/6.0.400/
global.json file:
Not found
Host:
Version: 6.0.8
Architecture: x64
Commit: 55fb7ef977
.NET SDKs installed:
6.0.400 [/usr/share/dotnet/sdk]
.NET runtimes installed:
Microsoft.AspNetCore.App 6.0.8 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 6.0.8 [/usr/share/dotnet/shared/Microsoft.NETCore.App]
Download .NET:
https://aka.ms/dotnet-download
Learn about .NET Runtimes and SDKs:
https://aka.ms/dotnet/runtimes-sdk-info
Notice that we've installed .NET SDK 6.0.400
, installed to /usr/share/dotnet/
, and that the dotnet6
package is being installed from https://packages.microsoft.com/ubuntu/22.04/prod jammy/main
. That's expected for PMC packages.
We can also tell if the Microsoft PMC feed is registered:
root@626dcadc888b:/# ls /etc/apt/sources.list.d/
microsoft-prod.list
root@626dcadc888b:/# cat /etc/apt/sources.list.d/microsoft-prod.list
deb [arch=amd64,arm64,armhf] https://packages.microsoft.com/ubuntu/22.04/prod jammy main
If you are using native packages, that file won't and shouldn't be present.
Should we add these to https://docs.microsoft.com/en-us/dotnet/core/install/linux-package-mixup ?
Should we add these to https://docs.microsoft.com/en-us/dotnet/core/install/linux-package-mixup ?
A set of modifications for the page was here too: https://github.com/dotnet/docs/issues/30457#issuecomment-1209280875
https://docs.microsoft.com/en-us/dotnet/core/install/linux-ubuntu#2204 should be updated too.
Can you elaborate @bastare?
Tried the steps but to no avail. Ubuntu 22.04
$ dn --info
global.json file:
Not found
Host:
Version: 6.0.8
Architecture: x64
Commit: 55fb7ef977
.NET SDKs installed:
No SDKs were found.
.NET runtimes installed:
Microsoft.AspNetCore.App 6.0.8 [/usr/lib/dotnet/dotnet6-6.0.108/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 6.0.8 [/usr/lib/dotnet/dotnet6-6.0.108/shared/Microsoft.NETCore.App]
Download .NET:
https://aka.ms/dotnet-download
Learn about .NET Runtimes and SDKs:
https://aka.ms/dotnet/runtimes-sdk-info
This is specific to package version 6.0.8+. Downgrading to 6.0.7 resulted in the SDK showing.
Did folks who are having this problem follow the instructions? If so, did you go with scenario 1 or 2?
Thanks so much, I've been trying to fix the error for hours, Scenario 1 did it for me.
Edit: I was using Ubuntu Jammy.
I updated the scenarios to make them clearer. We now have two "Clean machine" scenarios and two "Mixed-state" scenarios. I've kept the numbering the same.
BTW: We are very sorry that this situation occurred. We should have predicted that it would but sadly did not. That's on us. We've learned that mix-and-matching package feeds with the same package names that install to different locations is a recipe for what we're seeing here. Again, we're sorry about that and won't repeat it.
Why is there this sudden change of installation steps? Is this going to be the one used moving forward?
What do we do if we want powershell installed from PMC but to install SDK from jammy repo?
Also removing and re-installing dotnet* and aspnetcore* did not fix the issue for me either.
Did folks who are having this problem follow the instructions? If so, did you go with scenario 1 or 2?
After some trial and error, found this github issue and went with "Clean machine scenario 2: Use .NET 6 Package via PMC" as this allows using the latest dotnet 6 sdk version. These instructions worked well.
How can I get dotnet 5 SDK installed on 22.04 ? Its not supported using packages. does this mean i cant use the native packages if i want to use SDK 5 & 6 ?
In our company we're using a mirror with the same starting url for both feeds - PMC and Ubuntu sources.
Hence pinning won't work by setting
Pin: release mirror.company.com
Instead the following configuration works for me:
Package: *
Pin: release o=microsoft-ubuntu-jammy-prod jammy, n=jammy, a=jammy, c=main
Pin-Priority: 1001
Just in case anybody has a similar issue...
@mickdelaney Only .NET 6+ is supported on Ubuntu 22.04. That's unrelated to this discussion. See: https://github.com/dotnet/core/issues/7038#issuecomment-1110377345
.NET 6 is our first release to support OpenSSL v3. Ubuntu 22.04 only includes OpenSSL v3. As a result .NET 5 cannot function. You can install OpenSSL v1.x yourself if needed. We don't support that. Same thing with .NET Core 3.1. Also, .NET 5 is EOL.
Why is there this sudden change of installation steps? Is this going to be the one used moving forward?
We've been working with Canonical to make .NET available in the official feeds. That landed last week. We're making an official announcement tomorrow to better describe the change. This is a case where technical and marketing dates didn't match, sadly. We tried our best to resolve this situation by posting this issue with these instructions within a couple hours of realizing what had happened. We've updated the instructions a few times based on feedback and better understanding the mechanics to help users adapt to the new packages.
Tried the steps but to no avail. Ubuntu 22.04
$ dn --info global.json file: Not found Host: Version: 6.0.8 Architecture: x64 Commit: 55fb7ef977 .NET SDKs installed: No SDKs were found. .NET runtimes installed: Microsoft.AspNetCore.App 6.0.8 [/usr/lib/dotnet/dotnet6-6.0.108/shared/Microsoft.AspNetCore.App] Microsoft.NETCore.App 6.0.8 [/usr/lib/dotnet/dotnet6-6.0.108/shared/Microsoft.NETCore.App] Download .NET: https://aka.ms/dotnet-download Learn about .NET Runtimes and SDKs: https://aka.ms/dotnet/runtimes-sdk-info
@khteh which exact scenario steps were attempted? We have steps for 2 clean
and 2 mixed
scenarios.
What do we do if we want powershell installed from PMC but to install SDK from jammy repo?
Also removing and re-installing dotnet* and aspnetcore* did not fix the issue for me either.
@ar0311 which exact scenario steps were attempted? We have steps for 2 clean
and 2 mixed
scenarios.
What do we do if we want powershell installed from PMC but to install SDK from jammy repo?
For this scenario, the following would work:
- Create apt preferences file (
/etc/apt/preferences
) with the following contents:
Package: *
Pin: origin "packages.microsoft.com"
Pin-Priority: 400
-
Follow steps for installing Powershell on Ubuntu from https://docs.microsoft.com/en-us/powershell/scripting/install/install-ubuntu?view=powershell-7.2
-
Install .NET SDK - it would be obtained from Jammy repos.
Tried the steps but to no avail. Ubuntu 22.04
$ dn --info global.json file: Not found Host: Version: 6.0.8 Architecture: x64 Commit: 55fb7ef977 .NET SDKs installed: No SDKs were found. .NET runtimes installed: Microsoft.AspNetCore.App 6.0.8 [/usr/lib/dotnet/dotnet6-6.0.108/shared/Microsoft.AspNetCore.App] Microsoft.NETCore.App 6.0.8 [/usr/lib/dotnet/dotnet6-6.0.108/shared/Microsoft.NETCore.App] Download .NET: https://aka.ms/dotnet-download Learn about .NET Runtimes and SDKs: https://aka.ms/dotnet/runtimes-sdk-info
I had the same issue and I tried the Mixed state scenario 2 and it works
The official Jammy .NET package is not fit for purpose and conflicts with software like Discord.
This used to work absolutely fine with the PMC packages. Whilst I'm supportive of making .NET more widely available like this, and easier to install, this seems like a step backwards.
I'm now having to work-around this by messing with /etc/apt/preferences
- not a great developer experience.
There is a Canonical bug tracking this: https://bugs.launchpad.net/ubuntu/+source/dotnet6/+bug/1984450
In case this helps anyone, I had to add a step to mixed-state scenario 2. I was not able to install the PMC packages until I purged and reinstalled the PMC repository like this:
sudo dpkg --purge packages-microsoft-prod
sudo dpkg -i packages-microsoft-prod.deb
sudo apt update
You can verify that the repository is working by running apt-cache policy dotnet-sdk-6.0
. You should see a whole bunch of entries from packages.microsoft.com
. If you only see entries from archive.ubuntu.com
, then the repository is broken and dotnet will be installed from canonical repositories even if you pinned the packages in apt preferences file.
.NET SDK version from Jammy package repo is outdated. The current version is 6.0.108 instead of 6.0.400
Hi @sakno,
unfortunately, 6.0.4xx cannot be built from source for Ubuntu (nor for Linux distros in general) because it's not supported:
- https://github.com/dotnet/source-build#support
- https://bugs.launchpad.net/ubuntu/+source/dotnet6/+bug/1984451/comments/4
Hi @sakno,
unfortunately, 6.0.4xx cannot be built from source for Ubuntu (nor for Linux distros in general) because it's not supported:
* https://github.com/dotnet/source-build#support * https://bugs.launchpad.net/ubuntu/+source/dotnet6/+bug/1984451/comments/4
OMG, switching back to packages.microsoft.com
OMG, switching back to packages.microsoft.com
Could you share more information about what missing features in 6.0.1xx motivate the switch?
@omajid , sure. The latest version of SDK has some updates on Roslyn compiler. I found that my code can be compiled on the earlier versions but not on the latest. For instance,
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
public struct C {
private int value;
private Span<byte> Span => MemoryMarshal.AsBytes(MemoryMarshal.CreateSpan(ref value, 1));
}
Thus, the latest Roslyn update introduces incompatible changes at the source level.
Oh. I thought you meant the opposite...
Ubuntu has the older 6.0.1xx SDK (with older Roslyn), compared to packages.microsoft.com. If I am reading your concerns correctly, you want to avoid packages.microsoft.com?
@omajid , no, I can't use it because as a maintainer of OSS project I need to be sure that everyone who cloned the repo is able to build the project locally (and remotely on Azure DevOps). So, everything that can be compiled on 6.0.4x can be compiled on 6.0.1x but not vice versa.