Die LTS-Frage

LTS steht für Long Time Support, bezeichnet also eine mehrjährige Update-Garantie für die wichtigsten Pakete von Ubuntu. Ubuntu 16.04 ist eine LTS-Distribution. Aber für welche Distributionen gelten welche Wartungszeiträume? Und für welche Pakete?

Update: Ein Leser (vielen Dank!) hat mich darauf aufmerksam gemacht, dass der Wartungsstatus der Pakete ganz einfach mit ubuntu-support-status ermittelt werden kann. Sorry, dieses Kommando habe ich zehn Jahre übersehen und auch mit diversen Google-Suchen nicht gefunden. Ich habe den Artikel um einen entsprechenden Abschnitt erweitert.

Zweites Update: Die LTS-Frage wird mittlerweile auch in der ubuntu-devel-Diskussionsliste erörtert. Dabei ergeben sich neue Aspekte:

  • Marc Deslauriers von Canonical schreibt, dass die Supported-Tags der Pakete seit Jahren nicht mehr aktualisiert wurden, dass ubuntu-support-status obsolet (deprecated) ist und dass das Paket aus Ubuntu entfernt werden soll. Es hat auch gleich einen entsprechenden Bug-Bericht verfasst.

  • Der Ubuntu-Entwickler Stéphane Graber widerspricht und gibt an, die Supported-Tags seien sehr wohl aktuell. Außerdem schreibt er, das es main-Pakete gibt, die weniger als 5 Jahre unterstützt werden, so wie es universe/multiverse-Pakete gibt, die über die vollen fünf Jahre gewartet werden.

  • Dem widerspricht wiederum der Ubuntu-Entwickler Steve Langasek: Alle Pakete in main werden ohne Ausnahmen fünf Jahre unterstützt. Ob und wie lange universe/multiverse-Pakete gewartet werden, hängt von den jeweiligen Maintainern ab, es gibt aber keinerlei Garantien dafür — daher offiziell unsupported.

Unterschiedliche LTS-Wartungszeiträume je nach Distribution

Die Grundregel lautet: Der LTS-Zeitraum von fünf Jahren gilt nur für Ubuntu, Ubuntu Server, Ubuntu Core und Ubuntu Kylin (also den chinesischen Ubuntu-Ableger). Für alle anderen Ubuntu-Variante gilt ein LTS-Zeitraum von drei Jahren. Die Mythbuntu-Webseite weist allerdings darauf hin, das Mythbuntu 16.04 nur bis kurz nach dem Release von Mythbuntu 18.04 unterstützt wird.

Distribution      Support-Zeitraum
----------------  -----------------
Ubuntu            5 Jahre
Ubuntu Server     5 Jahre
Ubuntu Kylin      5 Jahre
Ubuntu Gnome      3 Jahre
Ubuntu MATE       3 Jahre
Ubuntu Studio     3 Jahre
Kubuntu           3 Jahre
Lubuntu           3 Jahre
Xubuntu           3 Jahre
Mythbuntu         2 Jahre

Was ist mit Edubuntu? Auf der Edubuntu-Webseite ist die Version 16.04 ein Non-Topic. Das liegt daran, dass die bisherigen Maintainer zurückgetreten sind und nur noch die Version 14.04 betreuen. In welcher Form bzw. durch welchen Maintainer Edubuntu weitergeführt wird, muss sich erst zeigen. Das ist auch der Grund, weswegen Edubuntu nicht mehr in der Liste der offiziellen Ubuntu-Varianten aufgeführt wird.

Welche Pakete sind LTS-Pakete? (alias »Die komplizierte Lösung«)

Eigentlich lässt sich diese Frage leicht beantworten: Alle Pakete aus der Ubuntu-main-Paketquelle.

Wenn Sie aber Ubuntu-Installationen (speziell bei Servern) administrieren, fällt die konkrete Antwort viel schwerer: Oft sind nämlich auch Ubuntu-universe- oder Ubuntu-multiverse-Pakete installiert, für die es keine LTS-Garantien gibt. Oft sind außerdem zusätzliche Paketquellen eingerichtet (Chrome, Spotify, MariaDB, PPAs etc.). Für welche der installierten Pakete gilt nun die LTS-Update-Garantie, für welche nicht?

Meines Wissens bieten weder dpkg noch apt-cache noch aptitude geeignete Filtermöglichkeiten, um diese Frage unkompliziert zu beantworten. Ich habe daher das bash-Script packagelist verfasst, das eine Schleife über alle installierten Pakete ausführt und dann für jedes Paket mit apt-cache madison herausfindet, woher dieses Paket stammt. (apt-cache madison kann mehrere Ergebnisse liefern. Das Script wertet nur die erste entsprechende Zeile aus, was für meine Zwecke ausreichend ist.)

#!/bin/bash
# Script packagelist

# Schleife über alle installierten Pakete
for pkg in $(dpkg --get-selections | grep -v deinstall | cut -f1); do 
  # erste Zeile von apt-cache madison, die nicht Sources beschreibt
  data=$(apt-cache madison $pkg | grep -v Sources | head -1)

  # pkgsrc (enthält package URL plus z.B. xenial/main)
  pkgsrc=$(echo $data | cut -d'|' -f3)
  url=$(echo $pkgsrc  | cut -d' ' -f1)
  repo=$(echo $pkgsrc | cut -d' ' -f2)

  # Daten für Ausgabe sammeln
  pkgs="$pkgs\n$pkg $repo $url"
  repos="$repos\n$repo $url"
done

# Liste aller Pakete samt Quelle in Spalten ausgeben
echo -e $pkgs | column -t
echo
# Liste aller Repos mit Paketanzahl
echo -e $repos | tail -n +2 | sort | uniq -c | sort -n

Das vielfache Ausführen von apt-cache madison kostet recht viel Zeit, bei einer Desktop-Installation je nach Hardware ca. eine Minute. Deswegen ist es sinnvoll, die Ausgabe gleich in eine Textdatei umzuleiten, damit diese dann bei Bedarf weiter analysiert werden kann, z.B. mit grep.

Wenn Sie das Script auf einer frischen Ubuntu-Desktop-Installation ausführen, sieht das Ergebnis z.B. so aus:

./packagelist > pkg.txt
cat pkg.txt

a11y-profile-manager-indicator  xenial/main  http://at.archive.ubuntu.com/ubuntu
account-plugin-facebook         xenial/main  http://at.archive.ubuntu.com/ubuntu
account-plugin-flickr           xenial/main  http://at.archive.ubuntu.com/ubuntu
...
zenity-common                   xenial/main  http://at.archive.ubuntu.com/ubuntu
zip                             xenial/main  http://at.archive.ubuntu.com/ubuntu
zlib1g:amd64                    xenial/main  http://at.archive.ubuntu.com/ubuntu

      3 xenial/multiverse http://at.archive.ubuntu.com/ubuntu
   1727 xenial/main http://at.archive.ubuntu.com/ubuntu

Es gibt also nur drei multiverse-Pakete:

grep multiverse pkg.txt 

virtualbox-guest-dkms      xenial/multiverse  http://at.archive.ubuntu.com/ubuntu
virtualbox-guest-utils     xenial/multiverse  http://at.archive.ubuntu.com/ubuntu
virtualbox-guest-x11       xenial/multiverse  http://at.archive.ubuntu.com/ubuntu

Hier ist das Ergebnis einer weiteren Desktop-Installation, diesmal mit zusätzlichen Paketquellen:

cat pkg.txt

...
      1 stable/non-free http://repository.spotify.com
      5 xenial/multiverse http://at.archive.ubuntu.com/ubuntu
      1 xenial/main http://ppa.launchpad.net/webupd8team/java/ubuntu
    134 xenial/universe http://at.archive.ubuntu.com/ubuntu
   1820 xenial/main http://at.archive.ubuntu.com/ubuntu

Hier ist das Ergebnis einer Server-Installation:

cat pkg.txt

...
     46 xenial/universe http://de.archive.ubuntu.com/ubuntu
    641 xenial/main http://de.archive.ubuntu.com/ubuntu

Die eingangs gestellte Frage, welche Pakete (nicht) LTS-Status haben, beantwortet auch mein Script nicht direkt. Die mit packagelist erstellte Liste bietet aber eine gute Möglichkeit, gezielt nach den Paketen zu suchen, die nicht aus der Ubuntu-main-Quelle stammen. Dabei müssen Sie aber unbedingt auch die Package-URL mitberücksichtigen. Es gibt Paketquellen, die xenial/main verwenden, obwohl sie nicht von Ubuntu/Canonical stammen.

Das folgende Listing ist auf einem simplen LAMP-Server entstanden. Es zeigt sich, dass durchaus wichtige Pakete wie fail2ban keinen LTS-Status haben.

grep universe pkg.txt 

dialog             xenial/universe  http://de.archive.ubuntu.com/ubuntu
fail2ban           xenial/universe  http://de.archive.ubuntu.com/ubuntu
joe                xenial/universe  http://de.archive.ubuntu.com/ubuntu
letsencrypt        xenial/universe  http://de.archive.ubuntu.com/ubuntu
mailutils          xenial/universe  http://de.archive.ubuntu.com/ubuntu
mailutils-common   xenial/universe  http://de.archive.ubuntu.com/ubuntu
php7.0-zip         xenial/universe  http://de.archive.ubuntu.com/ubuntu
...

Zuletzt noch die Ergebnisse eines anderen Servers, der noch unter Ubuntu 14.04 läuft:

cat pkg.txt
      1 trusty-backports/main   http://mirror.hetzner.de/ubuntu/packages/
      8 trusty-updates/universe http://mirror.hetzner.de/ubuntu/packages/
      9 trusty/main             http://mirror.netcologne.de/mariadb/repo/5.5/ubuntu/
     16 trusty/universe         http://mirror.hetzner.de/ubuntu/packages/
    270 trusty-updates/main     http://mirror.hetzner.de/ubuntu/packages/
    276 trusty/main             http://mirror.hetzner.de/ubuntu/packages/

Die Liste aller Nicht-LTS-Pakete kann in diesem Fall so ermittelt werden:

egrep "universe|backports|mariadb/repo/5.5" pkg.txt

cpufrequtils              trusty/universe          ...hetzner.de/ubuntu/packages/
fail2ban                  trusty/universe          ...hetzner.de/ubuntu/packages/
htop                      trusty/universe          ...hetzner.de/ubuntu/packages/
joe                       trusty/universe          ...hetzner.de/ubuntu/packages/
libcgmanager0:amd64       trusty-backports/main    ...hetzner.de/ubuntu/packages/
libcpufreq0               trusty/universe          ...hetzner.de/ubuntu/packages/
libgsasl7                 trusty/universe          ...hetzner.de/ubuntu/packages/
libkyotocabinet16:amd64   trusty/universe          ...hetzner.de/ubuntu/packages/
libmailutils4             trusty/universe          ...hetzner.de/ubuntu/packages/
libmariadbclient18        trusty/main              ...netcologne.de/mariadb/repo/5.5/ubuntu/
libmysqlclient18          trusty/main              ...netcologne.de/mariadb/repo/5.5/ubuntu/
libntlm0:amd64            trusty/universe          ...hetzner.de/ubuntu/packages/
libphp-phpmailer          trusty-updates/universe  ...hetzner.de/ubuntu/packages/
libphp-snoopy             trusty/universe          ...hetzner.de/ubuntu/packages/
libzend-framework-php     trusty/universe          ...hetzner.de/ubuntu/packages/
mailutils                 trusty/universe          ...hetzner.de/ubuntu/packages/
mailutils-common          trusty/universe          ...hetzner.de/ubuntu/packages/
makepasswd                trusty/universe          ...hetzner.de/ubuntu/packages/
mariadb-client-5.5        trusty/main              ...netcologne.de/mariadb/repo/5.5/ubuntu/
mariadb-client-core-5.5   trusty/main              ...netcologne.de/mariadb/repo/5.5/ubuntu/
mariadb-common            trusty/main              ...netcologne.de/mariadb/repo/5.5/ubuntu/
mariadb-server            trusty/main              ...netcologne.de/mariadb/repo/5.5/ubuntu/
mariadb-server-5.5        trusty/main              ...netcologne.de/mariadb/repo/5.5/ubuntu/
mariadb-server-core-5.5   trusty/main              ...netcologne.de/mariadb/repo/5.5/ubuntu/
mysql-common              trusty/main              ...netcologne.de/mariadb/repo/5.5/ubuntu/
php5-imagick              trusty/universe          ...hetzner.de/ubuntu/packages/
python-chardet-whl        trusty-updates/universe  ...hetzner.de/ubuntu/packages/
python-colorama           trusty-updates/universe  ...hetzner.de/ubuntu/packages/
python-colorama-whl       trusty-updates/universe  ...hetzner.de/ubuntu/packages/
python-distlib            trusty-updates/universe  ...hetzner.de/ubuntu/packages/
python-distlib-whl        trusty-updates/universe  ...hetzner.de/ubuntu/packages/
python-pip                trusty-updates/universe  ...hetzner.de/ubuntu/packages/
python-pip-whl            trusty-updates/universe  ...hetzner.de/ubuntu/packages/
smem                      trusty/universe          ...hetzner.de/ubuntu/packages/

Welche Pakete sind LTS-Pakete? (Update alias »Die einfache Lösung«)

Das Kommando, das ich 10 Jahre übersehen habe, lautet ubuntu-support-status. Wird es ohne weitere Parameter ausgeführt, liefert es eine wunderbare Statistik, wie viel Prozent der Pakete wie lange gewartet werden. (Alle folgenden Ergebnisse gelten für einen Ubuntu-16.04-Server des Autors.)

ubuntu-support-status

  Sie haben 636 Pakete (91.6%), die bis April 2021 (5y) unterstützt werden
  Sie haben 9 Pakete (1.3%), die bis April 2019 (3y) unterstützt werden
  Sie haben 11 Pakete (1.6%), die bis Januar 2017 (9m) unterstützt werden
  Sie haben 7 Pakete (1.0%), die nicht/nicht mehr heruntergeladen werden können
  Sie haben 31 nicht unterstützte Pakete (4.5%)

Wenn Sie wissen wollen, welche Pakete noch wie lange gewartet werden, führen Sie ubuntu-supported-status --show-supported aus:

ubuntu-support-status --show-supported

  Unterstützt bis April 2019 (3y):
  dialog hddtemp libdbd-mysql-perl libterm-readkey-perl libzip4 
  lm-sensors python3-numpy python3-psutil watershed 

  Unterstützt bis April 2021 (5y):
  accountsservice acl acpid adduser apache2 apache2-bin apache2-data 
  apache2-utils apparmor apport apport-symptoms apt apt-transport-https 
  ...
  xml-core xz-utils zerofree zlib1g 

  Unterstützt bis Januar 2017 (9m):
  fonts-lyx libjs-jquery-ui liblsan0 libtsan0 php-xml 
  python-matplotlib-data python3-cycler python3-dateutil 
  python3-matplotlib python3-pyinotify ttf-bitstream-vera 

Umgekehrt liefert ubuntu-support-status --show-unsupported eine Liste aller Pakete, für die der Wartungszeitraum unbekannt ist oder die gar nicht mehr zur Verfügung stehen:

ubuntu-support-status --show-unsupported
  Nicht mehr herunterzuladen:
  libmysqlclient18 linux-headers-4.4.0-18 
  linux-headers-4.4.0-18-generic linux-image-4.4.0-18-generic 
  linux-image-extra-4.4.0-18-generic php5-common php5-gd 

  Nicht unterstützt: 
  fail2ban glances joe letsencrypt libgsasl7 libkyotocabinet16v5 
  libmailutils4 libmilter1.0.1 libntlm0 mailutils mailutils-common 
  ...
  spamass-milter 

Wie viele Pakete befinden sich in welcher Paketquelle?

In diesem Zusammenhang ist manchmal auch interessant, wie viele Pakete eine bestimmte Paketquelle zur Verfügung stellt. Diese Informationen liefert das folgende Kommando (Quelle: askubuntu). Im folgenden Listing mit den Ergebnissen einer Ubuntu-16.04-Testinstallation mit einigen zusätzlichen Paketquellen habe ich alle 0-Ergebnisse entfernt.

for f in /var/lib/apt/lists/*Packages; do 
  printf '%5d %s\n' $(grep '^Package: ' "$f" | wc -l) ${f##*/}
done | sort -n

      3 dl.google.com_linux_chrome_deb_dists_stable_main_binary-amd64_Packages
      3 repository.spotify.com_dists_stable_non-free_binary-i386_Packages
      4 repository.spotify.com_dists_stable_non-free_binary-amd64_Packages
      9 archive.canonical.com_ubuntu_dists_xenial_partner_binary-amd64_Packages
     10 archive.canonical.com_ubuntu_dists_xenial_partner_binary-i386_Packages
     12 ppa.launchpad.net_webupd8team_java_ubuntu_dists_xenial_main_binary-amd64_Packages
     12 ppa.launchpad.net_webupd8team_java_ubuntu_dists_xenial_main_binary-i386_Packages
     23 ppa.launchpad.net_atareao_atareao_ubuntu_dists_xenial_main_binary-amd64_Packages
     23 ppa.launchpad.net_atareao_atareao_ubuntu_dists_xenial_main_binary-i386_Packages
     45 at.archive.ubuntu.com_ubuntu_dists_xenial_restricted_binary-amd64_Packages
     46 at.archive.ubuntu.com_ubuntu_dists_xenial_restricted_binary-i386_Packages
    758 at.archive.ubuntu.com_ubuntu_dists_xenial_multiverse_binary-i386_Packages
    782 at.archive.ubuntu.com_ubuntu_dists_xenial_multiverse_binary-amd64_Packages
   7284 at.archive.ubuntu.com_ubuntu_dists_xenial_main_binary-i386_Packages
   7322 at.archive.ubuntu.com_ubuntu_dists_xenial_main_binary-amd64_Packages
  45574 at.archive.ubuntu.com_ubuntu_dists_xenial_universe_binary-i386_Packages
  45688 at.archive.ubuntu.com_ubuntu_dists_xenial_universe_binary-amd64_Packages

Die LTS-Frage bei heise.de

heise.de hat sich auch mit der LTS-Frage beschäftigt und weist ebenfalls auf die Problematik hin, dass es längerfristig nur Updates für main-Pakete gibt. Die Empfehlung, nur main-Pakete zu installieren, ist in der Praxis freilich schwer zu befolgen. Viele wichtige Pakete sind nicht in main. (Bei RHEL/CentOS ist es übrigens ähnlich, wenn auch nicht ganz so eklatant: Auch dort aktivieren viele die EPEL-Paketquelle für Zusatzpakete …)

heise.de — Lauter Sicherheitslücken trotz Langzeitpflege