core icon indicating copy to clipboard operation
core copied to clipboard

Installing .NET 6 on Ubuntu 22.04 (Jammy)

Open richlander opened this issue 1 year ago • 81 comments

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:

  1. Remove all .NET packages

sudo apt remove --purge dotnet* sudo apt remove --purge aspnetcore*

  1. 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

  1. Update APT

sudo apt update

  1. 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:

  1. Remove all .NET packages

sudo apt remove --purge dotnet* sudo apt remove --purge aspnetcore*

  1. Create apt preferences file as specified in the section above
  2. 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.

richlander avatar Aug 10 '22 20:08 richlander

Should we add these to https://docs.microsoft.com/en-us/dotnet/core/install/linux-package-mixup ?

omajid avatar Aug 10 '22 20:08 omajid

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

mirespace avatar Aug 10 '22 22:08 mirespace

https://docs.microsoft.com/en-us/dotnet/core/install/linux-ubuntu#2204 should be updated too.

smitssjors avatar Aug 10 '22 23:08 smitssjors

Can you elaborate @bastare?

richlander avatar Aug 11 '22 18:08 richlander

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 avatar Aug 13 '22 04:08 khteh

This is specific to package version 6.0.8+. Downgrading to 6.0.7 resulted in the SDK showing.

owenholloway avatar Aug 13 '22 05:08 owenholloway

Did folks who are having this problem follow the instructions? If so, did you go with scenario 1 or 2?

richlander avatar Aug 13 '22 15:08 richlander

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.

jub0t avatar Aug 13 '22 18:08 jub0t

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.

richlander avatar Aug 13 '22 18:08 richlander

Why is there this sudden change of installation steps? Is this going to be the one used moving forward?

khteh avatar Aug 14 '22 00:08 khteh

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 avatar Aug 14 '22 01:08 ar0311

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.

alexisatkinson avatar Aug 14 '22 16:08 alexisatkinson

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 ?

mickdelaney avatar Aug 15 '22 10:08 mickdelaney

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...

carstencodes avatar Aug 15 '22 22:08 carstencodes

@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.

richlander avatar Aug 15 '22 22:08 richlander

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.

richlander avatar Aug 15 '22 22:08 richlander

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.

NikolaMilosavljevic avatar Aug 15 '22 22:08 NikolaMilosavljevic

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.

NikolaMilosavljevic avatar Aug 15 '22 22:08 NikolaMilosavljevic

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:

  1. Create apt preferences file (/etc/apt/preferences) with the following contents:
Package: *
Pin: origin "packages.microsoft.com"
Pin-Priority: 400
  1. Follow steps for installing Powershell on Ubuntu from https://docs.microsoft.com/en-us/powershell/scripting/install/install-ubuntu?view=powershell-7.2

  2. Install .NET SDK - it would be obtained from Jammy repos.

NikolaMilosavljevic avatar Aug 16 '22 01:08 NikolaMilosavljevic

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

SalihKARAHAN avatar Aug 17 '22 08:08 SalihKARAHAN

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.

lol768 avatar Aug 17 '22 12:08 lol768

There is a Canonical bug tracking this: https://bugs.launchpad.net/ubuntu/+source/dotnet6/+bug/1984450

richlander avatar Aug 18 '22 11:08 richlander

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.

warriordog avatar Aug 18 '22 15:08 warriordog

.NET SDK version from Jammy package repo is outdated. The current version is 6.0.108 instead of 6.0.400

sakno avatar Aug 22 '22 10:08 sakno

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

mirespace avatar Aug 22 '22 10:08 mirespace

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

sakno avatar Aug 22 '22 10:08 sakno

OMG, switching back to packages.microsoft.com

Could you share more information about what missing features in 6.0.1xx motivate the switch?

omajid avatar Aug 22 '22 14:08 omajid

@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.

sakno avatar Aug 22 '22 14:08 sakno

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 avatar Aug 22 '22 14:08 omajid

@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.

sakno avatar Aug 22 '22 14:08 sakno