Catégorie : Administration réseau     Tags :      0 Commentaire

    Tout d'abord, qu'est qu'un port ? On pourrait le définir ainsi : un " port " est un logiciel " porté " sur FreeBSD. En gros, un port est composé de différents éléments permettant d'installer ledit logiciel sur FreeBSD. Ces différents éléments sont :

    • une liste de sites où récupérer les sources ;
    • des patches à appliquer au code source pour le rendre compatible avec FreeBSD ;
    • des directives de compilation ;
    • les dépendances vis-à-vis d'autres ports

    Tout le système des ports de FreeBSD (et des ports OpenBSD, ainsi que pkgsrc) sont organisés autour des Makefiles. Ce sont les Makefiles qui donnent les directives énumérées ci-dessus. Exemple :

     % cat /usr/ports/graphics/pornview/Makefile
    [...]
    PORTNAME=       pornview
    PORTVERSION=    0.2.0.p.1
    [...]
    CATEGORIES=     graphics
    MASTER_SITES=   ${MASTER_SITE_SOURCEFORGE}
    [...]
    MAINTAINER=     dinoex[at]FreeBSD.org
    COMMENT=        PornView is an image viewer/manager
    
    LIB_DEPENDS=    exif.12:${PORTSDIR}/graphics/libexif
    
    USE_XLIB=       yes
    USE_GNOME=      gdkpixbuf gnomehack gnomeprefix
    GNU_CONFIGURE=  yes
    [...]

    On a ainsi, successivement, le nom du port, sa version, dans quelle(s) catégorie(s) il est classé, le site où aller le télécharger (dans ce cas, Sourceforge), le mainteneur du port (celui qui s'occupe de le mettre à jour quand c'est nécessaire), une description courte d'une ligne, et des dépendances sur des bibliothèques et/ou des outils GNU.
    Cela permet d'utiliser un outil que tout le monde connaît (make) et ainsi de faciliter l'utilisation des ports. En effet, installer un logiciel comme Gnome, qui présente des dizaines de dépendances, qui elles-mêmes possèdent encore des dépendances, est aussi simple que de taper :

    % cd /usr/ports/x11/gnome2 && sudo make install clean

    On port se présente sous la forme de quelques fichiers textes. L'ensemble des ports est en fait une arborescence regroupant les ports en catégories. Par exemple www, mail, java...
    En général, sous FreeBSD, on retrouve l'arborescence de ports dans /usr/ports.
    Dans l'article, on parlera d'arbre, pour désigner cette arborescence.
    Sous FreeBSD, un port peut aussi se présenter sous la forme d'une archive contenant le port compilé ainsi que des directives d'installation. On nomme cette archive un package. Un package est donc, grossièrement, la version compilée d'un port, comme un .rpm ou un .deb l'est d'un .tar.gz (OUI, ce sont des analogies grossières, voire vulgaires). Ici, nous traiterons principalement de la compilation de sources.

    1. Gestion de l'arborescence

    1.1 make.conf

    La toute première chose avant de manipuler les ports est de configurer le fichier de configuration de make : /etc/make.conf. Voici quelques-unes des principales options que vous pouvez utiliser :

    # Habitez-vous aux états-unis?
    # (si vrai, empêchera certains ports de se compiler,
    # notemment ceux relatifs à la crypto.)
    USA_RESIDENT=   false
    
    # Architecture de votre machine.
    # NB le "?=" signifie qu'un port peut outrepasser
    # cette valeur.
    CPU_TYPE?=      i686
    
    # Liste des langues et encodages dans lesquels on
    # installera la documentation
    DOC_LANG=       en_US.ISO8859-1 fr_FR.ISO8859-1
    
    # Ne pas compiler tout ce qui concerne X
    # (utile pour un serveur...)
    NO_X=           true
    WITHOUT_X11=    true
    
    # Version de certains packages à utiliser
    WANT_BDB_VER=44
    WANT_OPENLDAP_VER=23
    WANT_PGSQL_VER=81

    Pour une liste exhaustive des options avec leur explication, consultez le fichier /usr/share/examples/etc/make.conf.

    1.2 Récupérer les ports

    On considère que vous avez déjà un FreeBSD installé, mais que celui-ci est tout vierge. En tant que root, exécutez sysinstall :

    • menu Configure : Do post-install configuration of FreeBSD,
    • puis Distributions : Install additional distribution sets.

    Allez sur la ligne " [ ] ports The FreeBSD Ports collection ", appuyez sur [ESPACE]. Validez. Choisissez votre miroir et c'est parti !
    Maintenant, exécutez un petit ls -l /usr/ports... On va vous présenter trois manières de mettre à jour votre arbre des ports, en fonction de la version de FreeBSD que vous avez :

    • CVSup, qui marche sur tous les Freebsd ;
    • Csup, qui est livré avec FreeBSD 6.2, mais que l'on peut installer à partir de l'arbre des ports ;
    • Portsnap, qui est livré avec FreeBSD 6.0, mais que l'on peut installer à partir de l'arbre des ports (oui, le chat se mord la queue).

    1.2.1 CVSup

    CVSup est l'outil qui va vous permettre de mettre à jour votre arborescence locale, en la comparant à un serveur.
    Installer CVSup
    Allez à la racine de votre arbre et recherchez CVSup :

    # cd /usr/ports
    # make search name=cvsup | grep -A 1 Port
    Port:   cvsup-16.1h_2
    Path:   /usr/ports/net/cvsup
    --
    Port:   cvsup-mirror-1.3_5
    Path:   /usr/ports/net/cvsup-mirror
    --
    Port:   cvsup-without-gui-16.1h_2
    Path:   /usr/ports/net/cvsup-without-gui
    --
    Port:   cvsupchk-19990209
    Path:   /usr/ports/net/cvsupchk
    --
    Port:   fastest_cvsup-0.2.9_3
    Path:   /usr/ports/sysutils/fastest_cvsup

    On va utiliser cvsup-without-gui-16.1h_2. Reste plus qu'à l'installer tout simplement :

    # cd /usr/ports/net/cvsup-without-gui
    # make install clean

    Configuration de CVSup
    Créer un répertoire pour accueillir nos fichiers de configuration de CVSup et récupérer le fichier de configuration par défaut :

    # mkdir /usr/local/etc/cvsup
    # cd /usr/local/etc/cvsup
    # cp /usr/share/example/cvsup/ports-supfile .
    # chmod 644 /usr/local/etc/cvsup/ports-supfile

    Grâce à ce fichier, on va indiquer à CVSup un serveur sur lequel se synchroniser, quelle branche des ports récupérer et quelles catégories de ports.

    • *default host=CHANGE_THIS.FreeBSD.org : Définit le serveur sur lequel se synchroniser. Une liste des serveurs est disponible sur http://www.freebsd.org/doc/handbook/cvsup.html#CVSUP-MIRRORS (Cf. le chapitre " Speedy CVSup " pour choisir le miroir le plus rapide...).
    • *default base=/var/db : Définit l'emplacement où CVSup va stocker les informations sur la collection de ports transférée sur votre machine. L'emplacement sera, dans ce cas, /var/db/sup.
    • *default prefix=/usr : Définit l'emplacement où CVSup va stocker les fichiers demandés. Dans ce cas, CVSup va stocker les fichiers dans /usr/ports.
    • *default release=cvs tag=. : Définit la version de la collection de port à récupérer. Dans ce cas, on prend la toute dernière version. En remplaçant le point final par RELENG_6_1, on va récupérer la collection correspondant à FreeBSD 6.1. (en pratique, je ne connais personne qui utilise autre chose que -HEAD -- mat)
    • *default delete use-rel-suffix : Autorise CVSup à supprimer des fichiers dans la collection de ports locale. En gros, permet de construire en local une arborescence identique à celle du serveur. use-rel-suffix indique à CVSup d'ajouter un suffixe construit à partir de la version et du tag ajoutés au nom de chaque fichier qu'il maintient. (plus efficace)
    • *default compress : Les échanges de fichiers du serveur vers le client CVSup seront compressés.

    ATTENTION
    Utile pour les connexions peu rapides, mais inutile sur un LAN ou si vous avez une grosse connexion internet.

    Maintenant, il ne reste plus qu'à savoir quelle partie de la collection récupérer. Pour aller vite, on peut utiliser ports-all. Ceci permettra de récupérer TOUTE la collection.

    Si vous préférez ne récupérer que les catégories qui vous intéressent, utilisez une liste de la sorte :

    ports-base
    ports-archivers
    ports-audio
    ports-converters
    ports-databases
    ports-devel
    ports-dns
    ports-editors
    ports-french
    ports-ftp
    ...

    Mettre à jour la collection de ports
    Simple, il suffit d'exécuter CVSup en appelant le fichier de configuration :

    # cvsup /usr/local/etc/cvsup/ports-supfile
    [...]
     Checkout ports/audio/amarok/files/patch-configure
     Edit ports/audio/amarok/pkg-descr
     Edit ports/audio/amarok/pkg-message
     Edit ports/audio/amarok/pkg-plist
     Edit ports/audio/anthem/Makefile
     Edit ports/audio/arts/Makefile
    [...]

    1.2.2 Csup

    Csup est un autre outil qui va vous permettre de mettre à jour votre arborescence locale, en la comparant à un serveur. Les deux différences qu'il a avec CVSup à ma connaissance sont qu'il est écrit en C (et pas dans un langage d'extra-terrestre) et surtout qu'il est présent dans le basesystem de FreeBSD depuis FreeBSD 6.2 (donc cela évite l'installation d'un package supplémentaire).
    En revanche, Csup parle le protocole de CVSup. Il se connecte donc à un serveur CVSup, et utilise strictement le même fichier de configuration que CVSup. La description nous dit que " Csup est une réécriture du client de mise à jour CVSup faite dans le langage C ". N'est-ce pas amour, tout cela ?
    Installer Csup

    % ls -l /usr/bin/csup
    -r-xr-xr-x 1 root wheel 86244 Dec 9 03:09 /usr/bin/csup*

    Oh, mais que de magie ! Csup est déjà présent parmi nous mes frères ! (Comme dit ci-dessus). Il n'y a plus qu'à suivre les autres étapes présentes pour CVSup, c'est-à-dire : " Configuration de CVSup " et " Mettre à jour la collection de ports ". Bien entendu, à tous les endroits où il est indiqué " CVSup ", il faut remplacer par " Csup " !

    1.2.3 Portsnap

    Présentation (honteusement repompée du Handbook)
    Portsnap est un système de distribution sécurisée du catalogue des logiciels portés sur FreeBSD. Approximativement chaque heure, un " instantané " (snapshot) du catalogue des logiciels portés est généré, rassemblé et signé de manière chiffrée. Les fichiers résultants sont alors distribués par l'intermédiaire du protocole HTTP.
    Tout comme CVSup, Portsnap utilise un modèle de mise à jour de type pull : le catalogue des logiciels portés packagé et signé est placé sur un serveur Web qui attend les requêtes des clients. Les utilisateurs doivent soit exécuter manuellement portsnap(8) pour télécharger les mises à jour, soit configurer cron(8) pour un téléchargement régulier et automatique des mises à jour.
    Pour des raisons techniques, Portsnap ne met pas à jour le catalogue des logiciels portés directement dans le répertoire /usr/ports ; le logiciel travaille plutôt par défaut sur une version compressée de l'arborescence des logiciels portés dans le répertoire /var/db/portsnap. Cette copie compressée est ensuite utilisée pour mettre à jour le catalogue des logiciels portés.
    Première utilisation de Portsnap
    Au premier lancement de la commande, il va chercher la totalité de l'arbre des ports (sous forme compressée) sur un des serveurs Portsnap le mettant à disposition. Cela est effectué avec la commande portsnap fetch.
    Une fois que l'arbre des ports a été récupéré, vous devez le mettre en place dans /usr/ports. portsnap extract.
    Utilisations suivantes (mise à jour de l'arbre des ports)
    Très simple, portsnap fetch update.

    ATTENTION
    Il ne faut pas exécuter cette commande lorsque des ports sont en train d'être compilés.

    1.2.4 Speedy CVSup

    Dans les ports, il y a ce magnifique petit outil : fastest_cvsup. Il va permettre de trouver les 3 serveurs CVSup les plus rapides vis-à-vis de notre serveur. On l'installe comme suit.
    Si on a déjà installé portupgrade :

    $ sudo portinstall sysutils/fastest_cvsup

    Sinon :

    # cd /usr/ports/sysutils/fastest_cvsup
    # sudo make install clean

    Et maintenant, on l'exécute comme suit :

    $ fastest_cvsup -c fr
    [...]
    >>  Speed Daemons:
        - 1st: cvsup2.fr.freebsd.org
        - 2nd: cvsup4.fr.freebsd.org
        - 3rd: cvsup8.fr.freebsd.org

    Et voilà ! Il ne reste plus qu'à choisir le serveur le plus rapide dans vos fichiers de configuration !

    2. Gestion avancée des ports

    2.1 Installation de portupgrade

    Allez dans /usr/ports/sysutils/portupgrade, puis

    # make install clean

    Gardez les options par défaut. portupgrade va nous installer un ensemble d'outils qui vont nous faciliter la maintenance des ports.

    2.2 Le fichier pkgtools.conf

    Toute la configuration de portupgrade se fait dans le fichier /usr/local/etc/pkgtools.conf.

    2.2.1 Variables d'environnement

    La collection de ports utilise quelques variables, habituellement définies dans make.conf. Les outils fournis par portupgrade n'utiliseront pas ces variables, mais celles définies dans le fichier pkgtools.conf. Voici les variables par défaut :

    # Emplacement de la collection de ports
    ENV['PORTSDIR'] ||= '/usr/ports'
    # Emplacement des packages
    ENV['PACKAGES'] ||= ENV['PORTSDIR'] + '/packages'
    # Répertoire regroupant tous les packages
    ENV['PKG_PATH'] ||= ENV['PACKAGES'] + '/All'
    # Où sauvegarder les packages
    ENV['PKG_BACKUP_DIR'] ||= ENV['PKG_PATH']

    2.2.2 Choix des catégories

    Il est possible de signaler aux outils d'ignorer certaines catégories de ports, grâce à la variable IGNORE_CATEGORIES :

     IGNORE_CATEGORIES = [
       'chinese',
       'german',
       'hebrew',
       'japanese',
       'korean',
       'russian',
       'ukrainian',
       'vietnamese',
       ]

    Si vous utilisez cette variable, vous devrez remettre à jour la base des ports avec la commande portsdb -Ufu.

    ATTENTION
    C'est long à générer. Pour aller plus vite, exécutez simplement (après un cvsup) : portsdb -F. Cela va récupérer la base des ports sur le net plutôt que d'avoir à la regénérer entièrement !

    2.2.3 Ports à ne pas mettre à jour

    portupgrade nous offre la possibilité de ne pas mettre à jour certains ports. Ça peut permettre de gagner du temps, surtout pour les desktops où l'on pourra se passer de recompiler tout Xorg ou OpenOffice...

     HOLD_PKGS = [
       'xorg-*',
       'openoffice*',
       ]

    2.2.4 Packages plutôt que ports

    Il est possible de donner une liste de ports pour lesquels on souhaite (voire on veut uniquement) installer la version packagée :

    # Liste de ports que l'on souhaite gérer via un package,
    # mais si pas possible on accepte de compiler la version
    # des ports.
    USE_PKGS = [
       'firefox*',
       ]
    # Liste de ports que l'on souhaite gérer en mode package
    # exclusivement.
    USE_PKGS_ONLY = [
       'openoffice*',
       'gimp*',
       ]

    2.2.5 Ports alternatifs

    Avec pkgtools.conf, il est possible de redéfinir les dépendances d'un port. Par exemple, si un port dépend d'un autre port A, on peut le forcer à utiliser B à la place de A.

     ALT_PKGDEP = {
      # Utiliser le port OpenLDAP 2.3 à la place du port
      # OpenLDAP 2.2
      'openldap22*' => 'openldap23*',
    
      # La même chose que ci-dessus, mais en utilisant
      # l'emplacement du port
      'net/openldap22-client' => 'net/openldap23-client',
      'net/openldap22-server' => 'net/openldap23-server',
    
      # Si vous avez installé apache directement depuis
      # les sources :
      'apache' => :delete,
    }

    2.2.6 Options des ports

    Lors de l'installation de portupgrade, on a vu que l'on pouvait définir des options à la compilation. C'est très pratique, pour tuner au maximum les applications en place, et n'avoir que ce dont on a besoin. Seul inconvénient, lorsque l'on a 150 ports installés, il faut retenir chacune des options que l'on a décidé d'installer... pkgtools.conf nous permet de nous affranchir de cela grâce à la variable MAKE_ARGS.

     MAKE_ARGS = {
       'mail/p5-Mail-SpamAssassin' => [
           'WITH_AS_ROOT=yes',
           'WITHOUT_DOMAINKEYS=yes',
           'WITHOUT_MYSQL=yes',
           'WITH_PGSQL=yes',
           'WITH_RAZOR=yes',
           'WITHOUT_SPF_QUERY=yes',
           'WITHOUT_RELAY_COUNTRY=yes',
           'WITH_TOOLS=yes',
        ],
    }

    2.2.7 Gestion des services

    Sur un serveur, un port peut installer un service qui tourne sous forme de démon (Apache, ldap, MySQL, etc.). pkgtools.conf va nous permettre de configurer des commandes à exécuter lors d'un upgrade de port.

     # L'upgrade consiste à désinstaller l'ancienne
    # version du port
    # Ici, on demande d'arrêter apache avant de le
    # désinstaller :
    BEFOREDEINSTALL = {
      # Arrêter apache
      # localbase() retourne le répertoire où sont
      # installé les ports.
      'www/apache*' => localbase() + '/sbin/apachectl -k stop',
    
      # Arrêter automatiquement tout les ports
      # qui ont un script rc activé
      '*' => proc { |origin|
        cmd_stop_rc(origin)
      },
    }
    
    # Ensuite, l'upgrade installe la nouvelle version
    # du port
    AFTERINSTALL = {
      # Démarrer apache
      'www/apache*' => localbase() + '/sbin/apachectl -k start',
    
      # Démarrer automatiquement tous les port
      # qui ont un script rc activé
      '*' => proc { |origin|
        cmd_start_rc(origin)
      },
    }

    2.3 Rechercher un port

    Allez dans /usr/ports et utilisez une commande du style make search name=PORT. Exemple :

    # make search name=cvsup
    Port:   cvsup-16.1h_2
    Path:   /usr/ports/net/cvsup
    Info:   General network file distribution system optimized\
            for CVS (GUI version)Maint:  jdp@FreeBSD.org
    B-deps: expat-2.0.0_1 ezm3-1.2 fontconfig-2.3.2_3,1\
            freetype2-2.1.10_3 libdrm-2.0_1 pkgconfig-0.20\
            xorg-libraries-6.9.0
    R-deps: expat-2.0.0_1 fontconfig-2.3.2_3,1\
            freetype2-2.1.10_3 libdrm-2.0_1 pkgconfig-0.20\
            xorg-libraries-6.9.0
    WWW:    http:\/\/www.cvsup.org/
    [...]

    On peut aussi rechercher par mot clé en utilisant make search key=KEYWORD.

    2.4 Installer un port

    Pour installer un port, nous allons utiliser la commande ortinstall. Principales options :

    • -e ou --emit-summaries : génère un rapport après chaque port installé
    • -f ou --force : force la mise à jour, même si le port est en version inférieure ou égale au port déjà installé ou s'il est défini dans la variable HOLD_PKGS.
    • -i ou --interactive : mode interactif.
    • -k ou --keep-going : continue, même si l'installation d'un port échoue.
    • -l FILE ou --result-file FILE : fichier où écrire le résultat des opérations.
    • -m ou --make-args : spécifier des arguments à passer à chaque commande make.
    • -M ou --make-env : spécifier des variables d'environnement.
    • -n ou --noexecute : n'installe ni ne met à jour aucun port. Montre juste ce qui va être fait.
    • -p ou --package : crée le package du port.
    • -P ou --use-packages : utilise un package au lieu d'un port, quand c'est possible.
    • -PP ou --use-packages-only : n'utilise jamais le port, mais uniquement le package.
    • -q ou --noconfig : ne lit pas le fichier de configuration pkgtools.conf.
    • -r ou --recursive : agit sur tous les ports dépendants du port donné.
    • -R ou --upward-recursive : agit sur tous les ports qui requièrent le port donné.
    • -s ou --sudo : exécute sudo sur les commandes le nécessitant.
    • -u ou --uninstall-shlibs : supprime les bibliothèques partagées obsolètes.
    • -v ou --verbose : mode bavard.
    • -y ou --yes : répond yes à toutes les questions.

    Cas d'école : installation de Postfix :

    1. Aller dans le répertoire du port :

    # cd /usr/ports/mail/postfix

    2. Voir quelles sont les options de configuration disponibles :

    # make config

    NOTE
    On peut aussi utiliser un make showconfig, mais y'a pas les couleurs...

    /img-articles/lmhs/29/cc-art-gestportbsd/fig-1.jpg

    3. Compléter la variable MAKE_ARGS du fichier pkgtools.conf avec les options désirées ou non :

    MAKE_ARGS = {
       'mail/postfix' => [
         'WITH_PCRE=yes',
         'WITHOUT_SASL=yes',
         'WITH_SASL2=yes',
    [...]
        ],
    }

    4. Lancer l'installation

    sudo portinstall mail/postfix
    ---> Installing 'postfix-2.3.3,1' from a port (mail/postfix)
    ---> Building '/usr/ports/mail/postfix' with make flags: \
      WITH_PCRE=1 WITHOUT_SASL=1 WITHOUT_SASL2=1 WITH_TLS=1

    Notez la prise en compte des variables positionnées dans le fichier pkgtools.conf.

    2.5 Suivi des mises à jour

    Une fois que vous avez installé vos logiciels et que votre serveur est en production, il faut le maintenir à jour.

    2.5.1 Maintien de l'arbre des ports à jour

    Très simple, placez la commande /usr/local/bin/cvsup /usr/local/etc/cvsup/ports-supfile dans un cron. Après chaque mise à jour, vous devrez mettre à jour le fichier INDEX (base des ports disponibles). C'est possible de le faire grâce à portsdb :

    • portsdb -U : génère le fichier en analysant l'arbre complet. Déconseillé, car long et coûteux en ressources.
    • portsdb -Fu : récupère le fichier INDEX du net, puis met à jour le INDEX.db.

    Ce qui nous donne :

    22 12 * * * /usr/local/bin/cvsup /usr/local/etc/cvsup/\
                ports-supfile 2>&1 >>/dev/null
    22 34 * * * /usr/local/sbin/portsdb -Fu 2>&1 >>/dev/null

    Compter 30 minutes environ pour le CVSup.

    2.5.2 Recherche des ports à mettre à jour

    Pour savoir quels ports ne sont pas up to date sur notre serveur, on va utiliser la commande portversion. Principales options :

    • -l CAR ou --limit CAR : inclut uniquement les packages avec le statut CHARS
    • -v ou --verbose : active le mode bavard
    • -x CHAINE ou --exclude CHAINE : n'effectue pas de comparaison pour les ports dont les noms matchent la CHAINE.

    Utilisation : ne lister que les ports qui ne sont pas à jour :

    portversion -v -l\<
    ezm3-1.2        <  needs updating (port has 1.2_1)
    gmake-3.80_2    <  needs updating (port has 3.81_1)
    postfix-2.3.3,1 <  needs updating (port has 2.3.4,1)

    Il ne reste plus qu'à coller le tout dans une crontab, avec un | mail :

    22 44 * * * /usr/local/sbin/portversion -v -l\< | \
                /usr/bin/mail admin@domaine.tld

    Et voilà. Nous venons de voir comment maintenir à jour la base des ports et configurer un agent qui nous remontera chaque port ou package à mettre à jour.

    2.6 Mise à jour d'un port

    Maintenant que notre arborescence des ports se maintient à jour, nous allons pouvoir mettre à jour les ports. Nous allons utiliser la commande portupgrade. Les options sont les mêmes que pour portinstall.

    REMARQUE
    A la racine de votre arborescence des ports (traditionnellement /usr/ports), il y a un fichier UPDATING, qu'il est de bon ton de consulter avant chaque mise à jour.
    Ce fichier contient les problèmes pouvant survenir suite à une mise à jour, et surtout une méthode pour les régler.

    Fonctionnement : grossièrement, portupgrade va récupérer les sources et compiler. Si tout se passe bien, alors il va désinstaller le port actuellement en production et installer celui fraîchement compilé.

    ATTENTION
    Si le port en question installe un démon, pensez à le signaler dans pkgtools.conf, directives AFTERINSTALL et BEFOREDEINSTALL, afin que portupgrade l'arrête, désinstalle l'ancienne version, installe la nouvelle version et redémarre le service.

    Dans le chapitre précédent, nous avons vu que notre Postfix n'est pas à jour. Nous allons donc le mettre à jour. Premièrement, éditez pkgtools.conf, directive BEFOREDEINSTALL :

    # Stop postfix
    'mail/postfix*' => localbase() + '/etc/rc.d/postfix stop',

    Directive AFTERINSTALL :

    # Start postfix
    'mail/postfix*' => localbase() + '/etc/rc.d/postfix start',

    Puis exécutez portupgrade :

    # portupgrade -r postfix-2.3.3,1
    [...]
    ---> Building '/usr/ports/mail/postfix' with make flags: \
       WITH_PCRE=1 WITHOUT_SASL=1 WITHOUT_SASL2=1 WITH_TLS=1
    [...]
    ---> Executing a command before deinstalling 'mail/postfix':\
       /usr/local/etc/rc.d/postfix stop
    postfix/postfix-script: stopping the Postfix mail system
    [...]
    ---> Executing a post-install command for 'mail/postfix':\
       /usr/local/etc/rc.d/postfix start
    postfix/postfix-script: starting the Postfix mail system

    Et voilà Postfix démarré et fonctionnel. Temps de downtime du service, quelques secondes, et le package a été recompilé avec les mêmes options qu'à l'installation.

    2.7 Désinstallation d'un port

    Pour désinstaller un port, nous allons utiliser pkg_deinstall. Il est capable de gérer les dépendances. Principales options :

    -d ou --rmdir : supprime les répertoires vides.
    -f ou --force : force la suppression d'un port.
    -i ou --interractive : demande confirmation avant chaque suppression.
    -n ou --noexexute : montre ce que la commande ferait sans l'exécuter.
    -r ou --recursive : supprime le package et toutes ses dépendances.
    -R ou --upward-recursive : supprime le package et les packages requis pour installer celui-ci.
    -v ou --verbose : mode bavard.

    Veuillez noter les différences :

     # pkg_deinstall -n ruby
    --->  Deinstalling 'ruby-1.8.5_3,1'
    --->  Listing the results (+:done / -:ignored / *:skipped /\
                              !:failed)
            + ruby-1.8.5_3,1
    --->  Packages processed: 1 done, 0 ignored, 0 skipped and \
                              0 failed
    
    # pkg_deinstall -n -r ruby
    --->  Deinstalling 'libchk-1.9'
    --->  Deinstalling 'portupgrade-2.1.3.3_1,2'
    --->  Deinstalling 'ruby18-bdb-0.5.9_2'
    --->  Deinstalling 'ruby-1.8.5_3,1'
    --->  Listing the results (+:done / -:ignored / *:skipped /\
                              !:failed)
            + libchk-1.9
            + portupgrade-2.1.3.3_1,2
            + ruby18-bdb-0.5.9_2
            + ruby-1.8.5_3,1
    --->  Packages processed: 4 done, 0 ignored, 0 skipped and\
                              0 failed
    
    # pkg_deinstall -n -R ruby
    --->  Deinstalling 'ruby-1.8.5_3,1'
    --->  Listing the results (+:done / -:ignored / *:skipped /\
                              !:failed)
            + ruby-1.8.5_3,1
    --->  Packages processed: 1 done, 0 ignored, 0 skipped and\
                              0 failed

    2.8 Nettoyage de l'arbre des ports

    Avec toutes ces installations, il est possible que certains fichiers obsolètes encombrent notre disque dur. Nous allons utiliser portsclean pour nettoyer tout ça. Principales options :

    • -C : supprime les répertoires de compilation (work dans chaque répertoire d'un port).
    • -D : supprime les archives sources qui ne sont pas référencées dans l'arbre.
    • -DD : supprime les archives sources des ports qui ne sont pas installés.
    • -P : supprime les archives de packages obsolètes.
    • -PP : supprime toutes les archives de packages.

    Nous allons procéder à un petit nettoyage comme suit :

    $ sudo portsclean -C -DD -PP

    3. Sécurité

    3.1 Audit des ports

    Sur des serveurs en production, on ne peut pas tous les jours compiler les ports qui ne sont pas à la dernière version. Par contre, il est très important de savoir si une faille de sécurité a été découverte dans un des ports installés sur la machine.
    On va utiliser security/portaudit pour cela. Principales options de portaudit :

    -a : teste tous les ports installés.
    -d : affiche la date de création de la DB.
    -F : récupère la dernière version de la DB.
    -v : mode bavard.

    Une fois installé, exécutez :

    # /usr/local/sbin/portaudit -Fda

    Cela va récupérer la dernière DB contenant les vulnérabilités et effectuer un test. Par ailleurs, Portaudit s'exécutera une fois par nuit et son rapport sera envoyé avec le mail " security " du système. Voici un exemple de vulnérabilité :

    Affected package: php5-5.1.6
    Type of problem: php -- open_basedir Race Condition
     Vulnerability.
    Reference:
    <http://www.FreeBSD.org/ports/portaudit/\
    edabe438-542f-11db-a5ae-00508d6a62df.html>
    
    1 problem(s) in your installed packages found.

    Si j'essaye de mettre à jour ce port malgré la faille, je vais avoir un message d'erreur :

    sudo portupgrade -r php5-5.1.6
    --->  Upgrading 'php5-5.1.6' to 'php5-5.1.6_1' (lang/php5)
    [...]
    => php -- open_basedir Race Condition Vulnerability.
       Reference:
    <http://www.FreeBSD.org/ports/portaudit/\
    edabe438-542f-11db-a5ae-00508d6a62df.html>
    => Please update your ports tree and try again.
    * Error code 1
    Stop in /usr/ports/lang/php5.

    Vous aurez beau mettre à jour vos ports, si la version disponible est vulnérable, cela ne changera rien et l'installation/mise à jour du port sera bloquée. Pour passer outre cela, il faut utiliser :

    sudo portupgrade -r -m -DDISABLE_VULNERABILITIES php5

    Lien
    http://www.FreeBSD.org/ports

    Posté par (La rédaction) | Signature : bedis (GCU) | Article paru dans Creative Commons License

    Laissez une réponse

    Vous devez avoir ouvert une session pour écrire un commentaire.