Mise a jour de votre FreeBSD

De Diablotins.org.


Comment mettre sa machine à jour ?
Image:brush.png
Les divers éléments, ports, le monde et le noyau, qui composent votre système évoluent.


Une mise à jour est souvent nécessaire pour installer un logiciel, obtenir une nouvelle fonction dans un autre ou corriger un trou de sécurité.




Sommaire

Obtenir les sources

Les différentes versions de FreeBSD sont étiquetées par un “Release tag” dont vous pouvez consulter la liste sur le site de FreeBSD. Il existe différentes manières de récupérer les sources de ces versions; nous allons en étudier deux parmi les plus efficaces.

CVS

À l'aide de “CVS” ( Concurent Versionning System ) nous allons récupérer sur la “Repository CVS” de FreeBSD les sources et les ports du système. Un minimum de connaissance du fonctionnement de Serveur CVS est requis pour bien appréhender ce chapitre et les suivants. Pour se connecter sur un serveur CVS, la variable d'environnement “CVSROOT” doit être renseignée:

Sous bash ou sh:
  # export CVSROOT=':pserver:anoncvs@anoncvs.freebsd.org:/home/ncvs'
Sous csh/tcsh:
  # setenv  CVSROOT ':pserver:anoncvs@anoncvs.freebsd.org:/home/ncvs'

Supprimons d'abord les sources présentes sur notre machine avant d'en récupérer de nouvelles:

  # rm -rf /usr/src

Ensuite, connectons nous sur le serveur CVS anonyme de FreeBSD:

  # cvs login    - le mot de passe est anoncvs -
  # cd /usr
  # cvs co -rTag src

N'oubliez pas de créer une première fois un fichier vide pour le mot de passe:

touch ~/.cvspass

CVSUP et CSUP

C'est la solution la plus couramment utilisée pour mettre à jour les sources de FreeBSD.
CVSUP est un client pour CVSUPD. Il repose sur le système CVS, mais vous en simplifie les tâches.

Installer CVSUP

CVSUP n'est pas livré avec le monde de FreeBSD. Vous devez donc avoir installé l'arbre des logiciels portés ( port tree ).Installez net/cvsup-without-gui.
CVSUP dépend du langage modula3 EZM3, qui nécessite quelques outils gnu pour être compilé. L'installation de CVSUP va donc entraîner l'installation d'autres ports.
Attention : Prenez le temps de bien vérifier l'heure et la date de votre système sinon l'installation de CVSUP s'arrêtera sur l'installation de gmake, lors de sa décompression via tar gzip.
Vous pouvez aussi, dans le cas d'une station équipée d'un serveur X, installez la version avec interface graphique ( gtk ): net/cvsup. L'interface graphique n'apporte rien de vraiment confortable. Je n'en traiterais donc pas dans cette documentation.

Csup

Depuis FreeBSD 7, un nouvel outil csup(1) est présent dans le monde. C'est une alternative compatible avec Cvsup, mais écrite en C. Il suffit donc de remplacer «cvsup» par «csup» dans toutes les commandes de ce document.

Utiliser CVSUP

Ce logiciel repose sur quelques fichiers de configuration dont vous trouverez des exemples sous “/usr/share/examples/cvsup/”. Copiez ces exemples dans /usr/local/etc/cvsup pour pouvoir les modifier à loisir:

cp -r /usr/share/examples/cvsup/ /usr/local/etc/cvsup/

Les fichiers supfile contiennent les variables à renseigner pour définir le serveur et l'étiquette de version à utiliser.

# less /usr/local/etc/cvsup/stable-supfile
--
*default host=cvsup.FreeBSD.org
*default base=/usr
*default prefix=/usr
*default release=cvs tag=RELENG_4
*default delete use-rel-suffix
*default compress
src-all

Définissez par exemple, “host” à “cvsup.fr.FreeBSD.org” pour utiliser le miroir français des sources de FreeBSD et “tag” à “RELENG_6” pour ne charger que les versions stables de la branche 6. Nous allons voir deux façons d'exploiter ces fichiers sous FreeBSD.

  • la première, directement lors de la commande cvsup :
  # cvsup -g -L 2 /usr/local/etc/cvsup/stable-supfile

Cette méthode permet, en utilisant un autre fichier supfile, de charger différentes versions selon vos projets.

Miroir CVSUP

Il peut être pratique d'avoir chez soi (sur le réseau local par exemple) un miroir CVSUP de FreeBSD. Ca existe déjà tout fait, installez le port net/cvsup-mirror et répondez aux questions. L'outil est trivial et sympathique.

Nota: N'utilisez pas le serveur cvsup proposé par défaut (cvsup-master.freebsd.org), il est réservé aux miroirs officiels et vous aurez une erreur. Utilisez un serveur public (comme cvsup.freebsd.org).

Compilation du système de base

Pour découvrir ce qui a été modifié, parcourez cette interface: http://svn.freebsd.org/viewvc/base/.
Les mises à jour sont accessibles depuis la page d'accueil du site de FreeBSD où vous pouvez vous abonner à un flux RSS.
Vous pouvez également vous abonner aux listes suivantes:

  • FreeBSD-security-notifications@FreeBSD.org
  • FreeBSD-security@FreeBSD.org

Ainsi que cette dernière:

  • FreeBSD-announce@FreeBSD.org

Méthode canonique

C'est la méthode décrite dans le Manuel (Handbook). Cela se fait en plusieurs phases :

Mise à jour des sources dans /usr/src.
Lecture de /usr/src/UPDATING (oui oui faut y penser)
Compilation du monde (cible make : buildworld).
Compilation du noyau (cible make : buildkernel).
Installation du noyau(cible make : installkernel).
Reboot en mode de maintenance.
Pré-mise à jour de la configuration mergemaster(8) avec l'option -p.
Installation du monde (cible make : installworld).
Mise à jour de la configuration (outil mergemaster).
Reboot.

L'ordre est important : la compilation du noyau utilise le compilateur et les outils compilés à l'étape du make buildworld. La mise à jour du Monde doit se faire en mode de maintenance et doit être précédé d'une pré mise à jour de la configuration de la machine : par exemple si des groupes ou des utilisateurs sont ajoutés dans le système, cela doit être fait avant l'installation. Sinon l'installation échouera.

  # cd /usr/src/
  # make buildworld
  # make buildkernel
  # make installkernel
  (reboot en mode de maintenance)
  # mergemaster -p
  make installworld
  (nota : il est fortement conseillé de faire une sauvegarde de /etc avant le mergemaster)
  # mergemaster -i
  (reboot en faisant une prière)

Notez une nouvelle option de mergemaster(8) introduite récemment qui met à jour automatiquement ce que vous n'avez pas modifié par vous-même.

  # mergemaster -U

Méthode sans passage en mode de maintenance

Il n'est parfois pas possible de passer en mode de maintenance, parce que par exemple c'est un serveur qui n'est accessible que par le réseau. Dans ce cas, la méthode est la même mais sans passer par la case mode de maintenance (il faut aussi faire deux prières).

Toutefois, avant d'installer le monde il fortement conseillé d'arrêter le maximum de services. Vous pouvez ne conserver que sshd(8). Utilisez un outil comme sysutils/screen lors de l'installation, ceci évite qu'une bête perte de connexion arrête la procédure. Ça m'est arrivé et c'est con (j'ai dû intervenir physiquement).

Cela marche bien en général mais peut-être délicat lors de passage de versions majeurs. Le mieux est d'essayer en local sur une configuration équivalente et de prévoir un accès au cas où (kvm par exemple).

Le Noyau

Les sources mises à jour, compiler et installer un noyau est un jeu d'enfant :

make buildkernel
make installkernel

ou, parce que par nature, un (bon) informaticien est un fainéant:

make kernel

qui fait les deux. va construire le noyau défini dans make.conf soit par défaut, GENERIC.
Précisez votre noyau si nécessaire:

make buildkernel KERNCONF=MonNoyau
make installkernel KERNCONF=MonNoyau


Toutefois, lors de modifications majeures, un changement de branches par exemple, il est nécessaire de construire le monde au préalable, sans l'installer. Ce faisant, de nouveaux outils sont introduits qui vont permettre de compiler le noyau selon les nouvelles règles.



Dans ce cas,ou lors de tout changement majeur, il peut être utile d'installer le nouveau noyau et les modules ailleurs:

make kernel INSTKERNNAME=ailleurs

Et d'amorcer:

OK set module_path=/boot/ailleurs
OK boot

Les ports

Avant de mettre à jour les ports, vous devez mettre à jour l'arbre des ports.

L'arbre des ports

Voyons maintenant comment rapatrier les ports via Serveur CVS. ( Ce n'est pas la méthode que je conseille pour les ports pas plus que pour les sources).
L'arbre des ports existant doit être supprimé, il va être intégralement remplacé. tapez :

  # cd /usr && rm -rf ports

Le processus est relativement long.
Une fois la suppression effectuée, connectez vous sur le serveur CVS anonyme de FreeBSD.org (ou tout autre serveur plus proche de vous tel que anoncvs.fr.freebsd.org). Tapez :

  # cvs login
  password :

Une fois connecté, vous n'avez plus qu'a recuperer le catalogue de ports du CVS anonyme. Aussi, tapez :

  # cvs co ports

Le processus est lui aussi assez long. Une fois celui-ci terminé, vous avez de nouveau un arbre de ports à jour et synchronisé sur la version HEAD du CVS. Remarque : vous pouvez en choisir d'autre, comme pour les sources du dépôt CVS de FreeBSD des ports comprend toutes des versions de l'arbre depuis la racine mère 4.4BSD. Contrôlez la version qui vous convient le mieux; entrez:

  # cvs -R RELEASE_XXX co ports

Pour mettre à jour dès maintenant votre arbre de ports, vous n'avez plus qu'a faire des mise à jours régulières.
Ainsi, placez vous dans “/usr/ports” et tapez:

  # cd /usr/ports && cvs update

Le systeme CVS met alors a jour votre arbre.
Lors d'un contrôle, CVS ajoute des répertoires administratifs nommés CVS dans chaque sous-répertoires.
Si vous n'en voulez pas pour une raison ou une autre faites un export au lieu d'un contrôle:

  # cvs -R RELEASE_XXX export ports

Remarque : la présence de ces répertoires dans un arbre CVS n'est pas du tout gênante. Désormais, à chaque mise à jour, il vous faut tout recommencer car CVS ne peut plus évaluer le niveau de vos versions et l'état de votre système local.

CVSUP et CSUP

La méthode est la même que celle utilisée pour récupérer les sources du système, nous allons utiliser cvsup pour récupérer les modifications sur l'arbre des ports.
Ainsi, nous devons modifier le fichier /usr/local/etc/cvsup/port-supfile copié dans un paragraphe précédent depuis /usr/share/examples/cvsup/.
Indiquons le serveur cvsup.fr.FreeBSD.org pour la variable host; l'étiquette de version n'est pas utile, laissez donc la variable tag à «.». Ensuite, il suffit d'utiliser cvsup:

cvsup -g -L 2 /usr/local/etc/cvsup/port-supfile

L'arbre étant à jour, il faut créer un index à jour:

cd /usr/ports
make index

Vous constaterez que c'est un processus assez long, alors, vous pouvez vous contentez de le récupérer sur le site :

make fetchindex

L'index du site n'est créé qu'une fois pas jour, il n'est donc pas à jour à la minute ni même à l'heure près, mais est-ce si important ? Enfin, si vous utilisez portupgrade, mettez sa base à jour :

portsdb -u

ou

(cd /usr/ports && make fetchindex) ; portsdb -u

Portsnap

Portsnap est une méthode sécurisée qui utilise simplement http (cvsup nécessite une bidouille derrière un NAT ou un pare-feu). Le dernier snapshot de l’arbre des ports s'obtient ainsi:

# portsnap fetch

L'opération d'extraction nécessaire dans /usr/ports est relativement longue :

# portsnap extract

Les mise-à-jours manuelles se font avec :

# portsnap update

Pour une mise-à-jour automagique, ajoutez dans la crontab du système:

# crontab -e                  
0 6 * * * root /usr/local/sbin/portsnap cron
ici: tous les jours à 6h du matin

Les ports

L'arbre étant à jour, il vous faut notez les ports qui ont été modifiés et les recompiler. Attention, n'oubliez pas de consulter le fichier “/usr/ports/UPDATING” qui vous indique les problèmes que vous risquerez de rencontrer et les commandes à utiliser pour les contourner. Oui, c'est fastidieux, n'essayez pas d'écrire un script qui le fasse, il existe déjà : “portupgrade”.

Portupgrade

C'est un ensemble d'outils qui va vous permettre de gérer aisément les ports.
Le fichier /usr/ports/UPDATING y fait souvent référence; mais, si c'est l'outil historique de FreeBSD, il tend à être remplacé par Portmaster.
Installez ces outils:

cd /usr/ports/sysutils/portupgrade && make install distclean

Vous disposez désormais des outils:

  • portupgrade : Mettre à jour et/ou installer des logiciels
  • portinstall : Installer un logiciel.
  • portsdb : manipuler les dépendances entres les différents logiciels et bibliothèques.
  • portsclean : Nettoyer les répertoires et les fichiers téléchargés.

Pour mettre à jour les logiciels installés, une fois l'arbre des ports et la base mis à jour, tapez simplement :

portupgrade -ar

qui va mettre à jour tous les ports qui ont été modifiés ainsi que tous ce qui en dépend. L'option «-a» signifie «all» et désigne tous les ports qui doivent être mis à jour. Si vous désirez choisir ce que portupgrade doit mettre à jour, précisez en plus le nom du port, ou un ensemble de ports, dans la commande:

portupgrade -r deskutil/xfce4\*

La suite «\*» indique à la commande d'interpréter le symbole «*» comme suivant «deskutil/xfce4», donc tout ce qui commence par «xfce4» dans le catalogue «deskutil». Cette commande va tout recompiler, si vous ne désirez n'installer que les ports disposant de fichiers déjà compilés (ou paquets) :

portupgrade -aPP

Si ces paquets n'existent pas pour le logiciel concerné, ce logiciel restera en l'état. Donc, pour compiler et installer les ports qui ne fournissent pas de version déjà compilées et télécharger les autres sous forme de paquet.

portupgrade -aP

Pour nettoyez la base :

portsclean -CDDLPP

Enfin, ces outils utilisent le fichiers /usr/local/etc/pkgtools.conf qui permet d'automatiser certaines tâches pour des paquetages définis, comme d'en ignorer certains, de n'utiliser que les fichiers précompilés pour d'autres, d'affecter des options particulières à la compilation etc. Je vous invite à consulter les manuels de chacune de ces commandes, elles fourmillent d'options utiles. De plus n'oubliez pas que chaque compilation utilise les variables de /etc/make.conf, qui permet de préciser par exemple le type de processeur cible.

Portmaster

Le petit dernier de la série est un ensemble de scripts, plus rapide que ces prédécesseurs pour déterminer les dépendances et les ports à mettre à jour.
Son autre avantage par rapport à son ancêtre est qu'il demande à positionner les options avant de compiler.
Son utilisation est simple:

portmaster -a

Comme ses concurrents il fourmille d'options dont l'une, intéressante:

portmaster --force_config -n -a

Ceci va parcourir tous les ports à mettre à jour et vous afficher le menu de configuration. Ainsi, vous pourrez lancer la procédure complète, avec portupgrade, pourquoi pas, assuré de ne plus rien avoir à lui dire.
Mieux, profitez en pour télécharger les distfiles.

portmaster --force_config -F -n -a


Une fois ceci terminé, lancez un

portupgrade -ra

ou

portmaster -a

...coupez le réseau et allez faire un tour.

Évitez de compiler OpenOffice, vous n'avez pas assez de place de toute façon:

portmaster -x openoffice -a

Ceci est vrai à quelques exceptions près; si un port est marqué “IS_INTERACTIVE_WITH”, portmaster va s'arrêter après l'installation de la mise à jour, pour vous demander si vous voulez garder ou pas le fichier distfile de l'ancienne version.
Pour y remédier ajouter l'option «-d» pour les effacer ou «-D» pour les garder.

portmaster -d -x openoffice -a


Tout à fond, rock'n'roll:

portmaster -d -a -G -m "BATCH=yes" -x openoffice --no-confirm


Ne mettre à jour que les bibliothèques qui le demandent, utile pour éviter les conflits lors de grande manœuvres ( suite à un gel des ports):

portmaster `pkg_version -Ivl\< -s ^lib | cut -f1 -d\<`

Sortir rapidement (pkg_version -I) la liste des ports qui sont à mettre à jour (pkg_version -l\<), ne gardez que ceux dont le nom commencegrep ^») par «lib» (grep ^lib) et en extraire le premier champ (cut -f1), délimité par «>» (cut -d\<). Puis, passer le tout à portmaster.

Des scripts

En consultant les listes de diffusions et le forum, vous trouverez de nombreuses information relatives à la mise à jour, des ports essentiellement.
Notamment, des scripts sont donnés pour automatiser le processus.
Le premier de ces scritps étant portmaster lui même.


Deux exemples:

En fait, il suffit de lancer un

pormaster -d -a

à la fin.

  • pmmenu venu du thread précédent était au départ, je pense, juste une interface autour de portupdater. il présente un script complet avec des morceaux de menu dedans. J'apprécie en particulier le diff(1) entre les UPDATING.

Plus!

Projets :