FreeBSD handboek
Terug | Hoofdstuk 24. FreeBSD updaten en upgraden | Volgende

# 24.2. FreeBSD Update

Geschreven door Tom Rhodes. Gebaseerd op notities aangeleverd door Colin Percival.

Het toepassen van beveiligingspatches is een belangrijk onderdeel van het beheren van computersoftware, met name het besturingssysteem. Dit was voor een lange tijd geen gemakkelijk proces op FreeBSD. Er moesten patches op de broncode worden toegepast, de code moest herbouwd worden tot binairen, en daarna moesten de binairen worden geherinstalleerd.

Dit is niet langer het geval aangezien FreeBSD nu een gereedschap heeft dat eenvoudigweg `freebsd-update` heet. Dit gereedschap biedt twee gescheiden functies. Ten eerste voorziet het in het toepassen van binaire beveiligings- en errata-updates op het basissysteem van FreeBSD zonder de eis om te bouwen en te installeren. Ten tweede ondersteunt het gereedschap kleine en grote uitgave-upgrades.

> Opmerking: Binaire updates zijn beschikbaar voor alle architecturen en uitgaven die momenteel door het beveiligingsteam worden ondersteund; voor sommige eigenschappen, zoals de upgrades van het besturingssysteem FreeBSD, zijn de laatste uitgave van freebsd-update(8) en FreeBSD 6.3 nodig. Voordat naar een nieuwe uitgave wordt ge-updated, dienen de huidige uitgaveaankondigingen gelezen te worden aangezien ze belangrijke informatie over de gewenste uitgave kunnen bevatten. De aankondigingen kunnen op de volgende koppeling bekeken worden: http://www.FreeBSD.org/releases/.

Als er een `crontab` bestaat die de mogelijkheden van `freebsd-update` gebruikt, moet het uitgeschakeld worden voordat aan de volgende operatie wordt begonnen.

## 24.2.1. Het configuratiebestand

Sommige gebruikers willen het standaard configuratiebestand optimaliseren, waardoor het proces beter gecontroleerd kan worden. De opties zijn goed gedocumenteerd, maar voor de volgenden is wat extra uitleg nodig:

    # Componenten van het basissysteem die bijgewerkt moeten blijven
    Components src world kernel

Deze parameter bepaalt welke delen van FreeBSD bijgewerkt blijven. Standaard wordt de broncode bijgewerkt, het hele basissysteem, en de kernel. Dezelfde componenten als tijdens de installatie zijn beschikbaar, het toevoegen van bijvoorbeeld "world/games" zou de spelpatches toepassen. Het gebruik van "src/bin" zou de broncode in `src/bin` bijgewerkt houden.

Het beste kan dit op de standaardwaarde blijven aangezien het veranderen hiervan om specifieke items te bevatten de gebruiker dwingt om alle items die bijgewerkt dienen te worden op te noemen. Dit kan rampzalige gevolgen hebben aangezien de broncode en de binairen asynchroon kunnen raken.

    # Paden die beginnen met iets wat overeenkomt met een regel in een IgnorePaths
    # statement zullen genegeerd worden.
    IgnorePaths

Voeg paden, zoals `/bin` of `/sbin` toe om deze specifieke mappen ongemoeid te laten tijdens het updateproces. Deze optie kan gebruikt worden om te voorkomen dat `freebsd-update` lokale wijzigingen overschrijft.

    # Paden die beginnen met iets wat overeenkomt met een regel in een UpdateIfUnmodified
    # statement zullen alleen worden bijgewerkt als de inhoud van het bestand niet is
    # gewijzigd door de gebruiker (tenzij veranderingen zijn samengevoegd; zie beneden).
    UpdateIfUnmodified /etc/ /var/ /root/ /.cshrc /.profile

Werk configuratiebestanden in de aangegeven mappen alleen bij als ze niet zijn gewijzigd. Alle veranderingen die door de gebruiker zijn gemaakt maken het automatisch bijwerken van deze bestanden ongeldig. Er is een andere optie, `KeepModifiedMetadata`, die `freebsd-update` instrueert om de veranderingen tijdens het samenvoegen te bewaren.

    # Wanneer naar een nieuwe uitgave van FreeBSD wordt ge-upgraded, worden lokale veranderingen van bestanden die overeenkomen met MergeChanges
    # samengevoegd in de versie van de nieuwe uitgave.
    MergeChanges /etc/ /var/named/etc/

Lijst van mappen met instellingenbestanden waar `freebsd-update` moet proberen om in samen te voegen. Het proces van bestanden samenvoegen is een serie van diff(1)-patches die ongeveer gelijk is aan mergemaster(8) met minder opties, de samenvoegingen worden ofwel geaccepteerd, of openen een tekstverwerker, of zorgen ervoor dat `freebsd-update` afbreekt. Maak in geval van twijfel een reservekopie van `/etc` en accepteer de samenvoegingen. In Paragraaf 24.7.11.1 staat meer informatie over het commando `mergemaster`.

    # Map waarin de gedownloade updates en tijdelijke
    bestanden
    # die door een FreeBSD Update worden gebruikt worden worden opgeslagen.
    # WorkDir /var/db/freebsd-update

Dit is de map waarin alle patches en tijdelijke bestanden worden geplaatst. In het geval dat de gebruiker een versie-upgrade uitvoert, dient deze locatie tenminste een gigabyte aan vrije schijfruimte te hebben.

    # Wanneer tussen uitgaven wordt ge-upgraded, dient de lijst van Componenten dan
    # strikt gelezen te worden (StrictComponents yes) of slechts als een lijst van componenten

    # die geïnstalleerd *kunnen* worden en waarvan FreeBSD Update uit dient te zoeken
    # welke daadwerkelijk zijn geïnstalleerd en die te upgraden (StrictComponents no)?
    # StrictComponents no

Wanneer ingesteld op `yes`, zal `freebsd-update` aannemen dat de lijst `Components` compleet is en zal het niet proberen om wijzigingen buiten de lijst te maken. Effectief zal `freebsd-update` proberen om elk bestand bij te werken dat op de lijst `Components` staat.

## 24.2.2. Beveiligingspatches

Beveiligingspatches staan op een verre machine en kunnen met het volgende commando gedownload en geïnstalleerd worden:

    # freebsd-update fetch
    # freebsd-update install

Als er kernelpatches zijn toegepast moet het systeem opnieuw opgestart worden. Als alles goed is gegaan dient het systeem gepatcht te zijn en kan `freebsd-update` als een nachtelijke cron(8)-taak gedraaid worden. Een regel in `/etc/crontab` zou genoeg moeten zijn om deze taak te volbrengen:

    @daily                                  root    freebsd-update cron

Deze regel verklaart dat eenmaal per dag het commando `freebsd-update` gedraaid zal worden. Op deze manier, door het argument `cron` te gebruiken, zal het gereedschap `freebsd-update` alleen kijken of er updates bestaan. Als er patches bestaan, zullen ze automatisch worden gedownload naar de plaatselijke schijf maar niet worden toegepast. Er zal een email aan de gebruiker `root` worden verstuurd zodat ze handmatig geïnstalleerd kunnen worden.

Als er iets misging, heeft `freebsd-update` de mogelijkheid om de laatste verzamelingen veranderingen terug te draaien met het volgende commando:

    # freebsd-update rollback

Eenmaal voltooid, dient het systeem herstart te worden als de kernel of enige kernelmodule is gewijzigd. Dit stelt FreeBSD in staat om de nieuwe binairen in het geheugen te laden.

Het gereedschap `freebsd-update` kan alleen de kernel `GENERIC` automatisch bijwerken. Als een eigen kernel wordt gebruikt, moet het herbouwd en geherinstalleerd worden nadat `freebsd-update` klaar is met het installeren de rest van de updates. `freebsd-update` zal echter de kernel `GENERIC` in `/boot/GENERIC` detecteren en bijwerken (als het bestaat), zelfs als het niet de huidige (draaiende) kernel van het systeem is.

> Opmerking: Het is een goed idee om altijd een kopie van de kernel `GENERIC` in `/boot/GENERIC` te bewaren. Het kan van pas komen bij het vaststellen van een keur aan problemen, en bij het uitvoeren van versie-upgrades met `freebsd-update` zoals beschreven in Paragraaf 24.2.3.

Tenzij de standaardconfiguratie in `/etc/freebsd-update.conf` is gewijzigd, zal `freebsd-update` de bijgewerkte kernelbronnen samen met de rest van de updates installeren. Het herbouwen en herinstalleren van uw nieuwe eigen kernel kan daarna op de gebruikelijke manier gedaan worden.

> Opmerking: De updates die via `freebsd-update` verspreid worden hebben niet altijd betrekking op de kernel. Het is niet nodig om uw eigen kernel te herbouwen als de kernelbronnen niet zijn aangepast door het uitvoeren van `freebsd-update install`. `freebsd-update install` zal echter altijd het bestand `/usr/src/sys/conf/newvers.sh` bijwerken. Het huidige patchniveau (zoals aangegeven door het `-p`-nummer gerapporteerd door `uname -r`) wordt uit dit bestand gehaald. Het herbouwen van uw eigen kernel, zelfs als er niets veranderd is, stelt uname(1) in staat om het huidige patchniveau van het systeem accuraat te rapporteren. Dit is in het bijzonder behulpzaam wanneer meerdere systemen onderhouden worden, aangezien hierdoor snel de geïnstalleerde updates op elk ervan kunnen worden nagegaan.

## 24.2.3. Grote en kleine upgrades

Dit proces ruimt oude objectbestanden en bibliotheken op waardoor de meeste applicaties van derde partijen kapot gaan. Het wordt aangeraden dat alle geïnstalleerde poorten ofwel verwijderd en geherinstalleerd worden of later ge-upgraded worden met het hulpmiddel `ports-mgmt/portupgrade`. De meeste gebruikers zullen willen proefdraaien met het volgende commando:

    # portupgrade -af

Dit zorgt ervoor dat alles juist wordt geherinstalleerd. Merk op dat het instellen van de omgevingsvariabele `BATCH` op `yes` het antwoord `yes` zal geven op alle prompts tijdens dit proces, waardoor het niet nodig is om handmatig in het bouwproces in te grijpen.

Als een eigen kernel wordt gebruikt, is het upgradeproces iets ingewikkelder. Een kopie van de kernel `GENERIC` is nodig en dient in `/boot/GENERIC` geplaatst te worden. Als de kernel `GENERIC` niet reeds op het systeem aanwezig is, moet het met één van de volgende methoden verkregen worden:

- Als er slechts eenmaal een eigen kernel is gebouwd, dan is de kernel in `/boot/kernel.old` eigenlijk de `GENERIC`. Hernoem deze map naar `/boot/GENERIC`.

- Aannemende dat fysieke toegang tot de machine mogelijk is, kan een kopie van de kernel `GENERIC` van het CD-ROM-medium worden geïnstalleerd. Laad de installatieschijf en geef de volgende commando's:

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

  Vervang ``X.Y-RELEASE`` met de versie van de uitgave die u gebruikt. De kernel `GENERIC` zal standaard in `/boot/GENERIC` worden geïnstalleerd.

- Als al het bovenstaande niet lukt, kan de kernel `GENERIC` herbouwd en geherinstalleerd worden vanaf de broncode:

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

  Om deze kernel door `freebsd-update` als `GENERIC` te laten herkennen, mag het configuratiebestand voor `GENERIC` niet op enige wijze veranderd zijn. Het is ook aan te raden dat het zonder andere speciale opties wordt gebouwd (bij voorkeur met een leeg `/etc/make.conf`).

Opnieuw opstarten naar de kernel `GENERIC` is in dit stadium niet nodig.

Updates van grote en kleine versies kunnen worden uitgevoerd door een uitgaveversie als doel aan `freebsd-update` op te geven, het volgende commando zal bijvoorbeeld updaten naar FreeBSD 6.4:

    # freebsd-update -r 6.4-RELEASE upgrade

Nadat het commando is ontvangen, zal `freebsd-update` het instellingenbestand en het huidige systeem evalueren in een poging om de benodigde informatie te verzamelen om het systeem te updaten. Een lijst op het scherm zal aangeven welke componenten zijn gedetecteerd en welke niet. Bijvoorbeeld:

    Looking up update.FreeBSD.org mirrors... 1 mirrors found.
    Fetching metadata signature for 6.3-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

Nu zal `freebsd-update` proberen om alle bestanden die nodig zijn voor de upgrade te downloaden. In sommige gevallen kan de gebruiker worden gevraagd wat te installeren of hoe verder te gaan.

Wanneer een eigen kernel wordt gebruikt, zal de bovenstaande stap een waarschuwing geven die lijkt op de volgende:

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

Deze waarschuwing kan op dit moment veilig worden genegeerd. De bijgewerkte kernel `GENERIC` zal als tussenliggende stap in het upgradeproces worden gebruikt.

Nadat alle patches zijn gedownload naar het plaatselijke systeem zullen ze worden toegepast. Dit proces kan afhankelijk van de snelheid en werklast van de machine even duren. Hierna zullen instellingenbestanden worden samengevoegd -- voor dit gedeelte van het proces is enige tussenkomst van de gebruiker nodig aangezien een bestand kan worden samengevoegd of omdat er een tekstverwerker op het scherm kan verschijnen om het bestand handmatig samen te voegen. Het resultaat van elke succesvolle samenvoeging zal aan de gebruiker worden getoond naarmate het proces verder gaat. Een mislukte of genegeerde samenvoegpoging zal het proces afbreken. Het is mogelijk voor gebruikers om een reservekopie van `/etc` te maken en belangrijke bestanden, zoals `master.passwd` of `group`, later samen te voegen.

> Opmerking: Het systeem is nog niet veranderd, al het patchen en samenvoegen gebeurt in een andere map. Wanneer alle patches succesvol zijn toegepast, alle instellingenbestanden zijn samengevoegd en het erop lijkt dat het proces soepel verloopt, dienen de veranderingen verzegeld te worden door de gebruiker.

Als dit proces eenmaal voltooid is, kan de upgrade aan de schijf toevertrouwd worden met het volgende commando.

    # freebsd-update install

De kernel en kernelmodules zullen als eerste gepatcht worden. Nu moet de machine opnieuw opgestart worden. Als het systeem een eigen kernel draaide, gebruik dan het commando nextboot(8) om de kernel voor de volgende keer dat opgestart wordt in te stellen op `/boot/GENERIC` (welke is bijgewerkt):

    # nextboot -k GENERIC

> WaarschuwingVoordat er met de kernel `GENERIC` wordt opgestart, dient te worden gecontroleerd dat het alle stuurprogramma's bevat om uw systeem juist te laten opstarten (en met het netwerk te verbinden, als de machine die bijgewerkt wordt van afstand wordt benaderd). In het bijzonder, als de vorige kernel die draaide ingebouwde functionaliteit bevatte die normaalgesproken door kernelmodules wordt geleverd, zorg er dan voor dat deze modules tijdelijk in de kernel `GENERIC` worden geladen door de faciliteit `/boot/loader.conf` te gebruiken. U kunt er ook voor kiezen om niet-essentiële diensten, schijf- en netwerkkoppelingen, enzovoorts uit te zetten totdat het upgradeproces voltooid is.

De machine dient nu te worden herstart met de bijgewerkte kernel:

    # shutdown -r now

Als het systeem weer actief is, moet `freebsd-update` nogmaals gestart worden. De toestand van het proces is opgeslagen en dus zal `freebsd-update` niet vooraan beginnen, maar zal het alle oude gedeelde bibliotheken en objectbestanden verwijderen. Geef het volgende commando om verder te gaan op dit punt:

    # freebsd-update install

> Opmerking: Afhankelijk van het feit of er versienummers van bibliotheken zijn opgehoogd, kunnen er slechts twee in plaats van drie installatiefasen zijn.

Alle software van derde partijen dient nu opnieuw gebouwd en geïnstalleerd te worden. Dit is nodig omdat geïnstalleerde software van bibliotheken afhankelijk kan zijn die tijdens het upgradeproces zijn verwijderd. Het commando `ports-mgmt/portupgrade` kan gebruikt worden om dit proces te automatiseren. Dit proces kan met de volgende commando's gestart worden:

    # 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

Voltooi, nadat dit voltooid is, het upgradeproces met een laatste aanroep naar `freebsd-update`. Geef het volgende commando om alle losse eindjes in het upgradeproces samen te knopen:

    # freebsd-update install

Als de kernel `GENERIC` tijdelijk werd gebruikt, is dit het moment om een nieuwe eigen kernel op de gebruikelijke manier te bouwen en installeren.

Start de machine opnieuw op in de nieuwe FreeBSD-versie. Het proces is voltooid.

## 24.2.4. Het vergelijken van systeemtoestanden

Het gereedschap `freebsd-update` kan gebruikt worden om de toestand van de geïnstalleerde versie van FreeBSD met een bekende goede kopie te vergelijken. Deze optie evalueert de huidige versie van systeemgereedschappen, bibliotheken, en instellingenbestanden. Geef het volgende commando om met de vergelijking te beginnen:

    # freebsd-update IDS >> uitvoerbestand.ids

> WaarschuwingHoewel de commandonaam IDS is, is het in geen geval een vervanging voor een indringdetectiesysteem zoals `security/snort`. Aangezien `freebsd-update` gegevens op schijf opslaat, is de mogelijkheid om te knoeien duidelijk. Hoewel deze mogelijkheid verminderd kan worden door de instelling `kern.securelevel` te gebruiken en de gegevens van `freebsd-update` op een bestandssysteem dat alleen gelezen kan worden op te slaan wanneer deze niet gebruikt worden, zou een betere oplossing zijn om het systeem met een veilige schijf te vergelijken, zoals een DVD of een veilig opgeslagen externe USB-schijf.

Het systeem zal nu geïnspecteerd worden, en er zal een lijst van hun sha256(1)-hashwaarden, zowel de bekende waarde in de uitgave en de huidige geïnstalleerde waarde, afgebeeld worden. Hierom wordt de uitvoer naar het bestand `uitvoerbestand.ids` gezonden. Het scrollt te snel voorbij om het met het oog te vergelijken, en het vult al snel de gehele consolebuffer op.

Deze regels zijn ook extreem lang, maar het uitvoerformaat kan vrij eenvoudig geparsed worden. Geef, om bijvoorbeeld een lijst van alle bestanden te krijgen die verschillen van die in de uitgave, het volgende commando:

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

Deze uitvoer is afgekapt, er bestaan veel meer bestanden. Sommige van deze bestanden hebben natuurlijke veranderingen, het `/etc/passwd` is gewijzigd omdat er gebruikers aan het systeem zijn toegevoegd. In sommige gevallen kunnen er andere bestanden zijn, zoals kernelmodules, die verschillen aangezien `freebsd-update` ze ge-updated kan hebben. Voeg, om bepaalde bestanden of mappen uit te sluiten, deze toe aan de optie `IDSIgnorePaths` in `/etc/freebsd-update.conf`.

Dit systeem kan gebruikt worden als deel van een uitgebreide upgrademethode, afgezien van de eerder besproken versie.

Terug | Begin | Volgende
FreeBSD updaten en upgraden | Omhoog | Portsnap: een updategereedschap voor de Portscollectie

Deze en andere documenten kunnen worden gedownload van ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Lees voor vragen over FreeBSD de documentatie alvorens contact te zoeken <questions@FreeBSD.org>.
Vragen over deze documentatie kunnen per e-mail naar <doc@FreeBSD.org>.