Upgrade RHEL7 auf RHEL8

RHEL7.8 kann ohne Neuinstallation auf RHEL8.2 aktualisiert werden. Das funktioniert grundsätzlich für ein RHEL-Basissystem; ob es für ein System mit herstellerfremder Anwendungssoftware funktioniert, ist unbedingt zu testen. Ein Test empfiehlt sich in jedem Fall, wir übernehmen keine Garantie, dass ein System nach dem Ugrade seine Funktion einwandfrei erfüllt.

Auszug aus https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/upgrading_to_rhel_8/

Zugriff auf Knowledge-Base und notwendiges Archiv mit Migrationsdaten: https://cd-portal.sp.ethz.ch/linux/Wiki/RH_kbaccess.aspx

Voraussetzungen

  • RHEL7 Server
  • x86-64 Architektur
  • 100 MB frei auf /boot
  • registriert am Satellite 6

Einschränkungen

  • Disk-Verschlüsselung nicht aktiv
  • System-Partition nicht auf Multipath- oder Netzwerk-Storage
  • Systeme mit Root-Dateisystem formatiert mit XFS und Parameter ftype=0 (testbar mit xfs_info) können bei vielen installierten Paketen in einen Fehler laufen. Auf Systemen mit einem solchen Dateisystem wird für das Upgrade eine temporäre ext4-Partition erstellt, die ev. zu klein ist. Ihre Grösse kann mit der Variable LEAPP_OVL_SIZE=<SIZE_IN_MB> auf eine Grösse mit mehr als 2048 MB gesetzt werden.
  • Von den Systempartitionen dürfen nur /home und /boot auf einem separaten Dateisystem liegen, /var und /usr müssen zwingend in der Root-Partition sein.
  • UEFI ist nicht unterstützt
  • btrfs ist für RHEL8 nicht mehr verfügbar

Vorbereitungen

  1. Btrfs-Tools deinstallieren:
    yum remove btrfs-progs
  2. Versions-Locking deaktivieren, falls genutzt:
    yum versionlock clear
  3. RHEL-Version fixieren auf 7.8:
    subscription-manager release --set 7.8
  4. EUS-Repository aktivieren:
    subscription-manager repos --disable rhel-7-server-optional-rpms --enable rhel-7-server-eus-optional-rpms

  5. Alles aktualisieren
    yum update

  6. und allenfalls neu booten
  7. Es werden Pakete aus dem Extras-Repository benötigt:
    subscription-manager repos --enable rhel-7-server-extras-rpms
  8. Migrations-Tool installieren
    yum install leapp
  9. Dieses Archiv herunterladen und wie folgt installieren (Login-Info siehe am Anfang dieses Textes. Annahme: Archiv ins Homeverzeichnis von root kopiert):
    cd /etc/leapp/files/ && tar -xzf /root/leapp-data8.tar.gz
  10. Sicherstellen, dass keine Scripts oder Konfigurations-Managements während des Upgrades Einstellungen verändern
  11. Sicherstellen, dass nur eine Netzwerkkarte mit Präfix eth existiert (andernfalls siehe https://access.redhat.com/solutions/4067471)

Upgrade

  1. leapp ugrade
  2. Reboot
  3. SElinux reaktivieren:
    setenforce 1
  4. Firewall reaktivieren (war bei Test nicht deaktiviert, aber sicher ist sicher):
    systemctl start firewalld
    systemctl enable firewalld
  5. Konfigurierte RHEL-Version wieder freigeben:
    subscription-manager release --unset

Prüfen

  1. cat /etc/redhat-release
    Sollte Red Hat Enterprise Linux release 8.0 (Ootpa) ausgeben
  2. uname -r
    zeigt einen 4er-Kernel an mit .el8. im Versionsnamen wie z. B. 4.18.0-80.el8.x86_64
  3. subscription-manager list --installed
    gibt etwas in der Art aus:
    +-----------------------------------------+
        	  Installed Product Status
    +-----------------------------------------+
    Product Name: Red Hat Enterprise Linux for x86_64
    Product ID:   479
    Version:      8.2
    Arch:         x86_64
    Status:       Subscribed

Troubleshooting

Ist das System aus irgend einem Grund nicht mehr registriert, kann eine Registration am Satellite nach dem Upgrade fehlschlagen:

# subscription-manager register --org="MYORG" --activationkey="key"
object has no attribute 'has_key'

In diesem Fall ist die Datei /usr/share/rhsm-plugins/fqdn.py so anzupassen:

import socket
from subscription_manager.base_plugin import SubManPlugin

requires_api_version = "1.0"

class FactsPlugin(SubManPlugin):

    name = 'fqdn fact'
    def post_facts_collection_hook(self, conduit):

      try:
        if not conduit.facts.has_key('network.fqdn'):
            conduit.facts['network.fqdn'] = socket.getfqdn()
      except AttributeError as e:
        conduit.facts['network.fqdn'] = socket.getfqdn()

Nach dem Upgrade sind noch Pakete von RHEL7 übrig, die nicht aktualisiert werden konnten, zu finden mit

rpm -qa | grep el7

Sie müssen manuell deinstalliert werden.