Upgrade auf Ubuntu 22.04 LTS (Jammy)


Am 21 .April 2022 wurde Ubuntu 22.04 (Codename "Jammy Jellyfish") veröffentlicht. Im folgenden Artikel findet man eine kurze Anleitung zur Durchführung des Upgrades vom vorherigen Stable-Release (Ubuntu 20.04 LTS "Focal").

Das Upgrade muss jeder zuständige Administrator selbstständig durchführen. Bei Problemen oder Rückfragen wenden Sie sich bitte an den LRZ-Servicedesk.

Die Release-Notes von Ubuntu 22.04 LTS Jammy sind unter https://discourse.ubuntu.com/t/jammy-jellyfish-release-notes/24668 zu finden, es empfiehlt sich diese vor einem Upgrade durchzulesen.

Upgrade von Ubuntu 18.04 Binoic

Wir raten dringlich von einem direkten Upgrade von Ubuntu 18.04 auf Ubuntu 22.04 ab und unterstützen dies auch nicht. Bitte wählen Sie die zwei Schritt Methode,  führen Sie zuerst ein Upgrade auf Ubuntu 20.04 LTS (Focal) durch, danach auf Ubuntu 22.04 (Jammy).

Durchführen des Upgrades von Ubuntu 20.04 Focal

Vorabaktualisierung

Ein Upgrade sollte nur von einem vollständig aktualisierten System aus erfolgen, da zum Teil Bugs beim Upgrade nur durch die vorherige Installation eines gefixten Pakets in der Vorgängerversion gelöst werden können.

apt clean all
apt update
apt dist-upgrade
reboot
apt autoremove --purge

Datensicherung

Die Daten auf dem Server müssen vor Beginn der Arbeiten selbstverständlich auf geeignete Weise gesichert werden (TSM und/oder VMware-Snapshot). Für einen VMware-Snapshot wenden Sie sich bitte an den LRZ-Servicedesk.

Es ist (unabhängig vom Upgrade) empfehlenswert, Änderungen im Verzeichnis /etc zu dokumentieren. Hierzu bietet sich das Paket "etckeeper" an, welches das /etc-Verzeichnis in einem lokalen git-Repository speichert.

Deaktivieren von Systemmanagementtools (Puppet etc)

Da während des Upgrades eine Mischung von Versionen aus Jessie und Stretch auf der Platte ist und Dienste während des Upgrades gestoppt werden, sollten alle Tools, die regelmäßig den Systemstatus checken und unter Umständen Pakete installieren oder Dienste starten, deaktiviert werden. Ein Beispiel dafür ist Puppet, es kann sich aber auch um Ansible oder Cronjobs handeln. Ein Deaktivieren des cron-Daemons ist in solchen Fällen hilfreich.

puppet agent --disable
service cron stop

Ändern der Paketquellen

In den Konfigurationsdateien für APT muss nun der Codename der Distribution von focal auf jammy geändert werden.
Anschließend folgt die Aktivierung der signed-by Option für das LRZ-Repository, welche die veraltete apt-key Methode ablöst.

sed -i 's/focal/jammy/' /etc/apt/sources.list
sed -i -E -e 's/stretch|buster/bullseye/' /etc/apt/sources.list

mkdir -p /etc/apt/keyrings
wget -O /etc/apt/keyrings/lrz.asc http://debian.mirror.lrz.de/special/lrz-debian.gpg && apt-key del 714B6215
sed -i '/.*debian-lrz.*/ s:\(deb[^ ]*\) \(.*\):\1 [signed-by=/etc/apt/keyrings/lrz.asc] \2:' /etc/apt/sources.list

apt clean all
apt update

Sollten hier Fehler auftreten, sind meistens Third-Party-Repositories eingebunden (z.B. Percona), von denen noch keine neuere Version existiert. Diese sollten vor dem Upgrade zurückgestellt und ein besonderes Augenmerk auf die Ausgabe im nächsten Schritt gelegt werden, da solche Pakete für eine veraltete Distributionsversion gerne aufgrund von Konflikten deinstalliert werden. Im Zweifelsfall sollte das Upgrade abgebrochen und auf eine aktualisierte Version gewartet werden.

NTP durch Chrony ersetzten

Der NTP Daemon wird seit Ubuntu 20 wohl nicht mehr unterstützt, bei unseren Test lief er nach einem Upgrade nicht richtig. Falls noch nicht geschehen, ersetzten Sie bitte diesen durch den Chrony Daemon. Hierzu die NTP Pakete deinstallieren, das Chrony Pakete installieren:  

apt remove --purge ntp ntpdate
apt install chrony

Jetzt noch die Konfigurationsdatei /etc/chrony/chrony.conf anpassen, sprich auf die LRZ Timeserver umstellen:

/etc/chrony/chrony.conf
# Welcome to the chrony configuration file. See chrony.conf(5) for more
# information about usuable directives.

# This will use (up to):
# - 4 sources from ntp.ubuntu.com which some are ipv6 enabled
# - 2 sources from 2.ubuntu.pool.ntp.org which is ipv6 enabled as well
# - 1 source from [01].ubuntu.pool.ntp.org each (ipv4 only atm)
# This means by default, up to 6 dual-stack and up to 2 additional IPv4-only
# sources will be used.
# At the same time it retains some protection against one of the entries being
# down (compare to just using one of the lines). See (LP: #1754358) for the
# discussion.
#
# About using servers from the NTP Pool Project in general see (LP: #104525).
# Approved by Ubuntu Technical Board on 2011-02-08.
# See http://www.pool.ntp.org/join.html for more information.
server ntp1.lrz.de iburst
server ntp2.lrz.de iburst
server ntp3.lrz.de iburst

# This directive specify the location of the file containing ID/key pairs for
# NTP authentication.
keyfile /etc/chrony/chrony.keys

# This directive specify the file into which chronyd will store the rate
# information.
driftfile /var/lib/chrony/chrony.drift

# Uncomment the following line to turn logging on.
#log tracking measurements statistics

# Log files location.
logdir /var/log/chrony

# Stop bad estimates upsetting machine clock.
maxupdateskew 100.0

# This directive enables kernel synchronisation (every 11 minutes) of the
# real-time clock. Note that it can’t be used along with the 'rtcfile' directive.
rtcsync

# Step the system clock instead of slewing it if the adjustment is larger than
# one second, but only in the first three clock updates.
makestep 1 3

und den Chrony Daemon neu starten:

systemctl restart chrony.service

root@jammytest:~# chronyc sources
210 Number of sources = 3
MS Name/IP address Stratum Poll Reach LastRx Last sample 
===============================================================================
^* ntp1.lrz.de 1 9 377 196 -138us[ -858us] +/- 992us
^- ntp2.lrz.de 2 7 377 114 -550us[ -550us] +/- 31ms
^- ntp3.lrz.de 1 6 377 47 +3703us[+3703us] +/- 6398us

Durchführen des Upgrades

Das tatsächliche Upgrade wird durch den Befehl "apt dist-upgrade" durchgeführt (bei einer SSH-Session ist die Verwendung von "screen" förderlich, sollte die Verbindung zwischendurch abbrechen). Besser ist es aber das Upgrade auf der VMware Konsole durchzuführen. Die Liste der zu entfernenden Pakete sollte man kurz überfliegen, ob für den Betrieb wichtige Pakete entfernt werden. 

apt update
apt dist-upgrade

Nach Bestätigung werden nun die Pakete heruntergeladen und installiert. Es werden einige Fragen gestellt, die in den meisten Fällen mit dem Standardwert beantwortet werden können. 

Die Rückfragen bei geänderten Konfigurationsdateien sollten auf Plausibilität geprüft werden. In den meisten Fällen kann aber die alte Version übernommen werden. Leichte Änderungen können auch nachträglich noch beim Aufräumen nachgezogen werden.

Vor dem Reboot sollte zur Sicherheit

sync

ausgeführt werden. Dies ist vermutlich ein Workaround, um den gelegentlichen Kernelpanic beim Reboot zu vermeiden.

Nach Abschluss der Installation muss das System neu gebootet werden.

Überprüfen und aufräumen

Nach Abschluss des Reboots sollte das System korrekt aktualisiert sein. Zwei einfache Prüfungen dafür sind die Version des laufenden Kernels sowie die Version von Ubuntu

root@jammytest:~# uname -a
Linux jammytest 5.15.0-60-generic #66-Ubuntu SMP Fri Jan 20 14:29:49 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

root@jammytest:~# cat /etc/os-release 
PRETTY_NAME="Ubuntu 22.04.2 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.2 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
 

Wenn die Systemdienste den Erwartungen entsprechen, sollte das System noch aufgeräumt werden. Wurde Puppet vor dem Upgrade deaktiviert, muss es nach dem Reboot wieder aktiviert werden.

puppet agent --enable

Überprüfen der DNS Auflösung

Es kann sein, dass die DNS Auflüsung nach dem Ugrade nicht mehr funktioniert. Überprüfen Sie dies mit

host lrz.de

Sollte  dieser Aufruf fehlschlagen, führen Sie bitte folgende Kommandos aus:

systemctl is-enabled systemd-resolved.service
Kommt hier ein disabled als Antwort, dann
systemctl enable systemd-resolved.service
systemctl start systemd-resolved.service
aufrufen. Anschießend muss die Konfiguration noch angepasst werden:  
mount /ldist
/ldist/install/configure-systemd-resolved
umount /ldist

Nun sollte es gehen und  host lrz.de ein Ergebnis liefern. 

Löschen nicht mehr benötigter Pakete

Beim Aufruf von aptitude sollten schon einige Dutzend Pakete zur Löschung vorgeschlagen sein. Es handelt sich zum größten Teil um veraltete Library-Versionen. Die Auswahl sollte überprüft und mit zweimal "g" bestätigt werden.

Als nächstes sollte man die Pakete in der Liste "Obsolete and Locally Created Packages" ansehen und nicht mehr benötigte Pakete zur Löschung vorgesehen werden (mit "-"). Abschließend sollten die gelöschten Pakete nicht nur gelöscht, sondern auch deren Konfigurationsdateien entfernt werden (purge). Dazu markiert man die Sektion "Not Installed Packages" und drückt "_". 

Es kann sich dabei auch um Pakete handeln, die für den Betrieb notwendig sind und nicht mehr (mit diesem Paketnamen) ausgeliefert werden.

Eine nicht vollständige Liste von betroffenen Paketen ist in den Release-Notes zu finden.

Übersprungene Änderungen an Konfigurationsdateien

Hat man während der Installation das Ersetzen von veränderten Konfigurationsdateien verneint ("keep your currently-installed version", das Default), werden die geänderten Versionen mit der Endung ".dpkg-dist" im Dateisystem abgelegt. Diese können nun bei Bedarf noch überprüft werden.

ping:/etc# find . -name "*.dpkg-dist"
./systemd/system.conf.dpkg-dist
 
ping:/etc# diff -u systemd/system.conf systemd/system.conf.dpkg-dist 
--- systemd/system.conf 2014-10-29 16:57:53.724353272 +0100
+++ systemd/system.conf.dpkg-dist       2015-04-16 17:52:48.000000000 +0200
@@ -17,14 +17,24 @@
 #ShowStatus=yes
 #CrashChVT=1
 #CPUAffinity=1 2
-DefaultControllers=cpu memory
-#DefaultStandardOutput=journal
-#DefaultStandardError=inherit
-#JoinControllers=cpu,cpuacct,cpuset net_cls,net_prio
+#JoinControllers=cpu,cpuacct net_cls,net_prio
 #RuntimeWatchdogSec=0
 #ShutdownWatchdogSec=10min
 #CapabilityBoundingSet=
+#SystemCallArchitectures=
 #TimerSlackNSec=
+#DefaultTimerAccuracySec=1min
+#DefaultStandardOutput=journal
+#DefaultStandardError=inherit
+#DefaultTimeoutStartSec=90s
+#DefaultTimeoutStopSec=90s
+#DefaultRestartSec=100ms
+#DefaultStartLimitInterval=10s
+#DefaultStartLimitBurst=5
+#DefaultEnvironment=
+#DefaultCPUAccounting=no
+#DefaultBlockIOAccounting=no
+#DefaultMemoryAccounting=no
 #DefaultLimitCPU=
 #DefaultLimitFSIZE=
 #DefaultLimitDATA=

Will man die Änderungen mergen, hat sich die Nutzung des Tools sdiff für einen side-by-side merge bewährt.

ping:/etc# sdiff -o systemd/system.conf.new systemd/system.conf systemd/system.conf.dpkg-dist
#  This file is part of systemd.                                #  This file is part of systemd.
[...]
#CPUAffinity=1 2                                                #CPUAffinity=1 2
DefaultControllers=cpu memory                                 | #JoinControllers=cpu,cpuacct net_cls,net_prio
#DefaultStandardOutput=journal                                <
#DefaultStandardError=inherit                                 <
#JoinControllers=cpu,cpuacct,cpuset net_cls,net_prio          <
%?
ed:     Edit then use both versions, each decorated with a header.
eb:     Edit then use both versions.
el or e1:       Edit then use the left version.
er or e2:       Edit then use the right version.
e:      Discard both versions then edit a new one.
l or 1: Use the left version.
r or 2: Use the right version.
s:      Silently include common lines.
v:      Verbosely include common lines.
q:      Quit.
[...]
ping:/etc# mv systemd/system.conf.new systemd/system.conf
ping:/etc# rm systemd/system.conf.dpkg-dist