Das FreeBSD-Handbuch
Zurück | Kapitel 25. FreeBSD aktualisieren | Weiter

# 25.2. FreeBSD-Update

Geschrieben von Tom Rhodes. Basierend auf bereitgestellten Mitschriften von Colin Percival. Übersetzt von Benedict Reuschling.

Das Einspielen von Sicherheitsaktualisierungen ist ein wichtiger Bestandteil bei der Wartung von Computersoftware, besonders wenn es um das Betriebssystem geht. Für lange Zeit war dieser Prozess unter FreeBSD nicht einfach. Fehlerbehebungen mussten auf den Quellcode angewendet werden, danach wurde der Code zu neuen Binärdateien übersetzt und schliesslich mussten diese Dateien neu installiert werden.

Das ist seit längerem nicht mehr der Fall, da FreeBSD jetzt ein Werkzeug namens `freebsd-update` enthält. Dieses Werkzeug bringt zwei getrennte Funktionen mit sich. Die erste Funktion ermöglicht die Anwendung von Sicherheitsaktualisierungen im Binärformat auf das FreeBSD Basissystem, ohne dieses neu zu übersetzen und zu installieren. Die zweite Funktion unterstützt Aktualisierungen zwischen Haupt- und Unterversionen.

> Anmerkung: Binäre Aktualisierungen sind für alle Architekturen und Releases verfügbar, die aktuell vom FreeBSD Security Team betreut werden. Vor der Aktualisierung auf eine neue Release-Version sollten die aktuellen Ankündigungen zu dem Release gelesen werden, da diese wichtige Informationen zu der gewünschten Version enthalten. Diese Ankündigungen finden Sie unter dem folgenden Link: http://www.FreeBSD.org/releases/.

Wenn eine `crontab` existiert, welche die Eigenschaften von `freebsd-update` verwendet, muss diese deaktiviert werden, bevor die folgende Aktion gestartet wird.

## 25.2.1. Die Konfigurationsdatei

Manche Anwender möchten sicherlich Einstellungen in der Standard-Konfigurationsdatei unter `/etc/freebsd-update.conf` vornehmen, um bessere Kontrolle über den gesamten Prozess zu besitzen. Die Optionen sind sehr gut dokumentiert, jedoch benötigen die folgenden ein paar zusätzliche Erklärungen:

    # Components of the base system which should be kept updated.
    Components src world kernel

Dieser Parameter kontrolliert, welche Teile von FreeBSD auf dem aktuellen Stand gehalten werden sollen. Die Voreinstellung ist es, den Quellcode zu aktualisieren, das gesamte Basissystem sowie den Kernel. Die Komponenten sind die gleichen wie während der Installation, also würde beispielsweise das hinzufügen von `world/games` an dieser Stelle es erlauben, Aktualisierungen für Spiele anzuwenden. Die Verwendung von `src/bin` erlaubt es, den Quellcode in `src/bin` aktuell zu halten.

Die beste Einstellung ist, diese Option so zu belassen, da eine Änderung es bedingt, dass man als Benutzer jede Komponente auflisten muss, die aktualisiert werden soll. Dies könnte katastrophale Folgen nach sich ziehen, da der Quellcode und die Binärdateien dadurch nicht mehr synchron wären.

    # Paths which start with anything matching an entry in an IgnorePaths
    # statement will be ignored.
    IgnorePaths

Fügen Sie Pfade wie `/bin` oder `/sbin` hinzu, um diese speziellen Verzeichnisse während des Aktualisierungsprozesses unberührt zu lassen. Diese Option kann verwendet werden, um zu verhindern, dass `freebsd-update` lokale Änderungen überschreibt.

    # Paths which start with anything matching an entry in an UpdateIfUnmodified
    # statement will only be updated if the contents of the file have not been
    # modified by the user (unless changes are merged; see below).
    UpdateIfUnmodified /etc/ /var/ /root/ /.cshrc /.profile

Aktualisieren Sie Konfigurationsdateien in den angegebenen Verzeichnissen nur, wenn diese nicht geändert wurden. Jegliche Änderung, die der Benutzer daran vorgenommen hat, wird die automatische Aktualisierung dieser Dateien ungültig machen. Es gibt eine weitere Option `KeepModifiedMetadata`, die `freebsd-update` instruiert, die Änderungen während der Zusammenführung zu speichern.

    # When upgrading to a new FreeBSD release, files which match MergeChanges
    # will have any local changes merged into the version from the new release.
    MergeChanges /etc/ /var/named/etc/

Eine Liste von Verzeichnissen mit Konfigurationsdateien, in denen `freebsd-update` Zusammenführungen versuchen soll. Dieser Verschmelzungsprozess von Dateien ist eine Serie von diff(1)-Korrekturen, ähnlich wie mergemaster(8) mit weniger Optionen. Die Änderungen werden entweder akzeptiert, öffnen einen Editor oder `freebsd-update` bricht ab. Wenn Sie im Zweifel sind, sichern Sie das `/etc` Verzeichnis und akzeptieren einfach die Änderungen. Lesen Sie Abschnitt 25.7.11.1, um Informationen über das `mergemaster`-Kommando zu erhalten.

    # Directory in which to store downloaded updates and temporary
    # files used by FreeBSD Update.
    # WorkDir /var/db/freebsd-update

In diesem Verzeichnis werden alle Korrekturen und temporären Dateien abgelegt. Für Fälle in denen der Anwender eine Versionsaktualisierung vornimmt, sollte diesem Verzeichnis mindestens ein Gigabyte Festplattenspeicher zur Verfügung stehen.

    # When upgrading between releases, should the list of Components be
    # read strictly (StrictComponents yes) or merely as a list of components
    # which *might* be installed of which FreeBSD Update should figure out
    # which actually are installed and upgrade those (StrictComponents no)?
    # StrictComponents no

Wenn dies auf `yes` gesetzt ist, wird `freebsd-update` annehmen, dass die `Components`-Liste vollständig ist und nicht versuchen, Änderungen ausserhalb dieser Liste zu tätigen. Tatsächlich wird `freebsd-update` versuchen, jede Datei zu aktualisieren, die zu der `Components`-Liste gehört.

## 25.2.2. Sicherheitsaktualisierungen

Sicherheitsaktualisierungen sind auf einer entfernten Maschine abgelegt und können durch das folgende Kommando heruntergeladen und installiert werden:

    # freebsd-update fetch
    # freebsd-update install

Wenn irgendeine Änderung auf den Kernel angewendet wurde benötigt das System einen Neustart. Wenn alles gut verlaufen ist, sollte das System aktualisiert sein und `freebsd-update` kann als nächtlicher cron(8)-Job ablaufen. Ein Eintrag in der Datei `/etc/crontab` ist für diese Aufgabe ausreichend:

    @daily                                  root    freebsd-update cron

Dieser Eintrag besagt, dass einmal am Tag `freebsd-update` ausgeführt wird. Auf diese Weise kann `freebsd-update` nur durch die Verwendung des `cron`-Arguments prüfen, ob Aktualisierungen vorliegen. Wenn Korrekturen existieren, werden diese automatisch auf die lokale Festplatte heruntergeladen, aber nicht eingespielt. Der `root`-Benutzer bekommt eine Nachricht, damit dieser die Korrekturen manuell installiert.

Sollte irgendetwas schief gelaufen sein, kann `freebsd-update` den letzten Satz von Änderungen mit dem folgenden Befehl zurückrollen:

    # freebsd-update rollback

Sobald dieser Vorgang abgeschlossen ist, sollte das System neu gestartet werden, wenn der Kernel oder ein beliebiges Kernelmodul geändert wurde. Dies ermöglicht es FreeBSD, die neuen Binärdateien in den Hauptspeicher zu laden.

Das `freebsd-update`-Werkzeug kann nur den `GENERIC`-Kernel automatisch aktualisieren. Wenn ein selbstkonfigurierter Kernel verwendet wird, muss dieser neu erstellt und installiert werden, nachdem `freebsd-update` den Rest der Aktualisierungen durchgeführt hat. Allerdings wird `freebsd-update` den `GENERIC`-Kernel in `/boot/GENERIC` erkennen und aktualisieren (falls dieser existiert), sogar dann, wenn dies nicht der aktuell verwendete Kernel des Systems ist.

> Anmerkung: Es ist eine gute Idee, immer eine Kopie des `GENERIC`-Kernels in `/boot/GENERIC` aufzubewahren. Das wird bei der Diagnose von verschiedenen Problemen eine grosse Hilfe sein, sowie bei der Durchführung von Versionsaktualisierungen mit `freebsd-update`, wie in Abschnitt 25.2.3 beschrieben ist.

Solange die Standardkonfiguration in `/etc/freebsd-update.conf` nicht geändert wurde, wird `freebsd-update` die aktualisierten Quellcodedateien des Kernels zusammen mit dem Rest der Neuerungen installieren. Die erneute Übersetzung und Installation ihres neuen, selbstkonfigurierten Kernels kann dann auf die übliche Art und Weise durchgeführt werden.

> Anmerkung: Die Aktualisierungen, die über `freebsd-update` verteilt werden, betreffen nicht immer den Kernel. Es ist nicht notwendig, den selbstkonfigurierten Kernel neu zu erstellen, wenn die Kernelquellen nicht durch die Ausführung von `freebsd-update install` geändert wurden. Allerdings wird `freebsd-update` auf alle Fälle die Datei `/usr/src/sys/conf/newvers.sh` aktualisieren. Der aktuelle Patch-Level (angegeben durch die `-p`-Nummer, die von dem Kommando `uname -r` ausgegeben wird) wird aus dieser Datei ausgelesen. Die Neuinstallation des selbstkonfigurierten Kernels, selbst wenn sich daran nichts geädert hat, erlaubt es uname(1), den aktuellen Patch-Level des Systems korrekt wiederzugeben. Dies ist besonders hilfreich, wenn mehrere Systeme gewartet werden, da es eine schnelle Einschätzung der installierten Aktualisierungen in jedem einzelnen System ermöglicht.

## 25.2.3. Aktualisierungen an Haupt- und Unterversionen

Dieser Prozess entfernt alte Objekt-Dateien und Bibliotheken, was dazu führt, dass die meisten Anwendungen von Drittherstellern nicht mehr funktionieren. Es wird empfohlen, dass alle installierten Ports entweder entfernt und neu installiert oder zu einem späteren Zeitpunkt mittels `ports-mgmt/portupgrade` aktualisiert werden. Die meisten Anwender werden wahrscheinlich einen Testlauf mittels des folgenden Kommandos durchführen wollen:

    # portupgrade -af

Dies sorgt dafür, dass alles korrekt neu installiert wird. Beachten Sie, dass das Setzen der `BATCH`-Umgebungsvariable auf `yes` während dieses Prozesses auf jede Eingabe mit `ja` antwortet, was es nicht mehr notwendig macht, manuell eingreifen zu müssen.

Wenn ein selbstkonfigurierter Kernel verwendet wird, ist der Aktualisierungsprozess ein kleines bisschen aufwändiger. Eine Kopie des `GENERIC`-Kernels wir benötigt und sollte in `/boot/GENERIC` abgelegt sein. Wenn der `GENERIC`-Kernel nicht bereits im System vorhanden ist, kann dieser über eine der folgenden Methoden bezogen werden:

- Wenn ein eigener Kernel genau einmal gebaut wurde, ist der Kernel im Verzeichnis `/boot/kernel.old` in Wirklichkeit der `GENERIC`-Kernel. Benennen Sie einfach dieses Verzeichnis in `/boot/GENERIC` um.

- Angenommen, direkter Zugriff auf die Maschine ist möglich, so kann eine Kopie des `GENERIC`-Kernels von den CD-ROM-Medien installiert werden. Legen Sie die Installations-CD ein und benutzen Sie die folgenden Befehle:

      # mount /cdrom
      # cd /cdrom/X.Y-RELEASE/kernels
      # ./install.sh GENERIC

  Ersetzen Sie ``X.Y-RELEASE`` mit der richtigen Version der Veröffentlichung, die Sie verwenden. Der `GENERIC`-Kernel wird standardmässig in `/boot/GENERIC` installiert.

- Falls alle obigen Schritte fehlschlagen, kann der `GENERIC`-Kernel folgendermassen aus den Quellen neu gebaut und installiert werden:

      # cd /usr/src
      # env DESTDIR=/boot/GENERIC make kernel
      # mv /boot/GENERIC/boot/kernel/* /boot/GENERIC
      # rm -rf /boot/GENERIC/boot

  Damit dieser Kernel als `GENERIC`-Kernel von `freebsd-update` erkannt wird, darf die `GENERIC`-Konfigurationsdatei in keiner Weise geändert worden sein. Es wird ebenfalls empfohlen, dass dieser ohne irgendwelche speziellen Optionen erstellt wird (bevorzugt mit einer leeren `/etc/make.conf`).

Der Neustart in den `GENERIC`-Kernel ist zu diesem Zeitpunkt nicht notwendig.

Aktualisierungen an Haupt- und Unterversionen können durchgeführt werden, wenn man `freebsd-update` eine Release-Version als Ziel übergibt. Beispielsweise wird das folgende Kommando das System auf FreeBSD 8.1 aktualisieren:

    # freebsd-update -r 8.1-RELEASE upgrade

Nachdem das Kommando empfangen wurde, überprüft `freebsd-update` die Konfigurationsdatei und das aktuelle System, um die nötigen Informationen für die Systemaktualisierung zu sammeln. Eine Bildschirmausgabe wird anzeigen, welche Komponenten erkannt und welche nicht erkannt wurden. Zum Beispiel:

    Looking up update.FreeBSD.org mirrors... 1 mirrors found.
    Fetching metadata signature for 8.0-RELEASE from update1.FreeBSD.org... done.
    Fetching metadata index... done.
    Inspecting system... done.

    The following components of FreeBSD seem to be installed:
    kernel/smp src/base src/bin src/contrib src/crypto src/etc src/games
    src/gnu src/include src/krb5 src/lib src/libexec src/release src/rescue
    src/sbin src/secure src/share src/sys src/tools src/ubin src/usbin
    world/base world/info world/lib32 world/manpages

    The following components of FreeBSD do not seem to be installed:
    kernel/generic world/catpages world/dict world/doc world/games
    world/proflibs

    Does this look reasonable (y/n)? y

An diesem Punkt wird `freebsd-update` versuchen, alle notwendigen Dateien für die Aktualisierung herunter zu laden. In manchen Fällen wird der Benutzer mit Fragen konfrontiert, um festzustellen, was installiert werden soll oder auf welche Art und Weise fortgesetzt werden soll.

Wenn ein selbstkonfigurierter Kernel benutzt wird, produziert der vorherige Schritt eine Warnung ähnlich zu der folgenden:

    WARNING: This system is running a "MYKERNEL" kernel, which is not a
    kernel configuration distributed as part of FreeBSD 8.0-RELEASE.
    This kernel will not be updated: you MUST update the kernel manually
    before running "/usr/sbin/freebsd-update install"

Diese Warnung kann an dieser Stelle problemlos ignoriert werden. Der aktualisierte `GENERIC`-Kernel wird als ein Zwischenschritt im Aktualisierungsprozess verwendet.

Nachdem alle Korrekturen auf das lokale System heruntergeladen wurden, werden diese nun eingespielt. Dieser Prozess kann eine gewisse Zeit in Anspruch nehmen, abhängig von der Geschwindigkeit und Auslastung der Maschine. Konfigurationsdateien werden ebenfalls zusammengefügt - dieser Teil der Prozedur benötigt einige Benutzereingaben, da eine Datei möglicherweise von Hand zusammengefasst werden muss oder ein Editor erscheint auf dem Bildschirm zum manuellen bearbeiten. Die Ergebnisse von jeder erfolgreichen Zusammenfassung werden dem Benutzer angezeigt, während der Prozess weiterläuft. Eine fehlgeschlagene oder ignorierte Zusammenfassung wird den Prozess sofort beenden. Benutzer sollten eine Sicherung von `/etc` anlegen und wichtige Dateien später manuell vereinen, beispielsweise `master.passwd` oder `group`.

> Anmerkung: Das System ist noch nicht verändert worden, alle Korrekturen und Vereinigungen sind in einem anderen Verzeichnis vorgenommen worden. Wenn alle Korrekturen erfolgreich eingespielt, alle Konfigurationsdateien zusammengefügt wurden und es den Anschein hat, dass der Prozess problemlos verlaufen wird, müssen die Änderungen vom Anwender noch angewendet werden.

Sobald dieser Prozess abgeschlossen ist, können die Aktualisierungen über das folgende Kommando auf die Platte geschrieben werden:

    # freebsd-update install

Der Kernel und die Module werden zuerst aktualisiert. Zu diesem Zeitpunkt muss die Maschine neu gestartet werden. Wenn das System einen selbstkonfigurierten Kernel verwendet, benutzen Sie das nextboot(8)-Kommando, um den Kernel für den nächsten Neustart auf `/boot/GENERIC` zu setzen (welcher aktualisiert wurde):

    # nextboot -k GENERIC

> Warnung: Bevor mit dem `GENERIC`-Kernel das System neu gestartet wird, vergewissern Sie sich, dass alle notwendigen Treiber für ihr System enthalten sind, um korrekt zu starten (und schliessen Sie ihn ans Netzwerk an, falls auf die Maschine, die aktualisiert wird, von der Ferne aus zugegriffen wird). Achten Sie besonders darauf, dass wenn der vorherige selbstkonfigurierte Kernel Funktionalität beinhaltet, die von Kernelmodulen zur Verfügung gestellt wurde, dass diese temporär in den `GENERIC`-Kernel über die Datei `/boot/loader.conf` übernommen werden. Sie sollten ebenfalls nicht benötigte Dienste, eingehängte Platten, verbundene Netzlaufwerke, usw. deaktivieren, bis der Aktualisierungsprozess abgeschlossen ist.

Die Maschine sollte nun mit dem aktualisierten Kernel neu gestartet werden:

    # shutdown -r now

Sobald das System wieder hochgefahren wurde, muss `freebsd-update` erneut gestartet werden. Der Zustand des Prozesses wurde zuvor gesichert und deshalb wird `freebsd-update` nicht von vorne beginnen, jedoch alle alten Shared-Libraries und Objektdateien löschen. Um zu diesem Zustand zu gelangen, setzen Sie das folgende Kommando ab:

    # freebsd-update install

> Anmerkung: Abhängig davon, ob irgendwelche Bibliotheksversionen erhöht wurden, kann es sein, dass nur zwei Installationsphasen anstatt drei durchlaufen werden.

Nun muss alle Drittanbieter-Software neu erstellt und neu installiert werden. Dies ist notwendig, da die installierte Software möglicherweise Abhängigkeiten zu Bibliotheken enthält, die während der Aktualisierung entfernt wurden. Der `ports-mgmt/portupgrade`-Befehl kann verwendet werden, um diesen Vorgang zu automatisieren. Die folgenden Kommandos können verwendet werden, um diesen Prozess zu starten:

    # portupgrade -f ruby
    # rm /var/db/pkg/pkgdb.db
    # portupgrade -f ruby18-bdb
    # rm /var/db/pkg/pkgdb.db /usr/ports/INDEX-*.db
    # portupgrade -af

Sobald dies abgeschlossen ist, beenden Sie den Aktualisierungsprozess mit einem letzten Aufruf von `freebsd-update`. Geben Sie den folgenden Befehl ein, um alle losen Enden des Aktualisierungsprozesses miteinander zu verknüpfen:

    # freebsd-update install

Wenn der `GENERIC`-Kernel temporär Verwendung fand, ist dies der richtige Zeitpunkt, einen neuen, selbstkonfigurierten Kernel zu bauen und über die übliche Methode zu installieren.

Booten Sie anschliessend die Maschine in die neue FreeBSD-Version. Der Prozess ist damit abgeschlossen.

## 25.2.4. Vergleich des Systemzustands

Das `freebsd-update`-Werkzeug kann verwendet werden, um den Zustand der installierten FreeBSD-Version gegenüber einer bekannten und funktionierenden Kopie zu vergleichen. Diese Option vergleicht die aktuelle Version von Systemwerkzeugen, Bibliotheken und Konfigurationsdateien. Um diesen Vergleich zu starten, geben Sie den folgenden Befehl ein:

    # freebsd-update IDS >> outfile.ids

> Warnung: Obwohl der Befehlsname IDS lautet, sollte er in keiner Weise als Ersatz für ein Intrusion Detection System wie `security/snort` angesehen werden. Da `freebsd-update` seine Daten auf Platte ablegt, ist die Möglichkeit von Verfälschungen offensichtlich. Obwohl diese Möglichkeit durch die Verwendung von `kern.securelevel` oder die Ablage von `freebsd-update` auf einem Nur-Lese Dateisystem, wenn es gerade nicht gebraucht wird, eingedämmt werden kann, besteht eine bessere Lösung darin, das System gegen ein gesichertes Medium, wie eine DVD oder einen externen, separat aufbewahrten USB-Plattenspeicher, zu vergleichen.

Das System wird jetzt untersucht und eine Liste von Dateien ausgegeben, zusammen mit deren sha256(1)-Hashwerten, sowohl der von der Release-Version bekannte Wert als auch der des aktuell installierten Systems. Das ist der Grund dafür, warum die Ausgabe an die Datei `outfile.ids` geschickt wurde. Es scrollt zu schnell vorbei, um diese mit den Augen zu vergleichen und bald wird auch der Konsolenpuffer damit überfüllt.

Diese Zeilen sind dazu noch extrem lang, aber das Ausgabeformat kann sehr einfach verarbeitet werden. Um beispielsweise eine Liste von allen Dateien zu erhalten, die sich vom aktuellen Release unterscheiden, geben Sie das folgende Kommando ein:

    # cat outfile.ids | awk '{ print $1 }' | more
    /etc/master.passwd
    /etc/motd
    /etc/passwd
    /etc/pf.conf

Diese Ausgabe wurde abgeschnitten, es existieren noch viel mehr Dateien dazu. Manche dieser Dateien besitzen ganz selbstverständliche Veränderungen, `/etc/passwd` wurde beispielsweise geändert, um Benutzer zum System hinzuzufügen. In manchen Fällen kann es anderen Dateien wie Kernelmodule geben, welche sich geändert haben, weil `freebsd-update` diese aktualisiert hat. Um bestimmte Dateien oder Verzeichnisse auszuschliessen, hängen Sie diese an die `IDSIgnorePaths`-Option in `/etc/freebsd-update.conf` an.

Diese Vorgehensweise kann als Teil einer ausgeklügelten Aktualisierungsmethode benutzt werden, unabhängig von der zuvor angesprochenen Variante.

Zurück | Zum Anfang | Weiter
FreeBSD aktualisieren | Nach oben | Portsnap: Ein Werkzeug zur Aktualisierung der Ports-Sammlung

Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an <de-bsd-questions@de.FreeBSD.org>.
Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an <de-bsd-translators@de.FreeBSD.org>.