Les ports FreeBSD. ------------------ Introduction: ------------- - installation d'un logiciel à la main. récupérer les sources, extraire, patcher, construire, installer. - "port" pour automatiser le tout. Fonctionnalités : - gestion des dépendances. Architecture: ------------- Catalogue des ports : - Ensemble de makefile organisés par catégories "logiques" (ex www, editors, security, ...) - Les Makefiles propres à la gestion des ports sont dans ports/Mk INDEX-6 : fichier d''index' utilisé par les outils des ports (pkg_info, pkg_delete, ...). "make index" Suivi des ports installés : - /var/db/pkg/xxxx - /var/db/ports/xxxx (options) Fichiers téléchargés : distfiles 'man ports' : voir les cibles les plus courantes. Différence paquets <> ports. --------------------------- En fait il n'y a pas de différence, le port construit un paquet qui est ensuite installé. make package permet de construire un paquet. FreeBSD étant orienté "sources", il n'y a pas de notion de paquet de 'dével' comme sous Linux. Les paquets sont complets (avec les include, les docs, etc) Exemple d'un port (description succinte). ----------------------------------------- ports/ftp/lftp Fichiers : -rw-r--r-- 1 root wheel 2162 6 jan 02:52 Makefile -rw-r--r-- 1 root wheel 390 3 nov 09:09 distinfo drwxr-xr-x 2 root wheel 512 16 aoû 08:21 files/ -rw-r--r-- 1 root wheel 486 25 oct 1999 pkg-descr -rw-r--r-- 1 root wheel 1066 27 jan 11:43 pkg-plist Important : nommage. Cibles : exemple make config, make fetch, make extract, .... Pour plus d'infos sur les ports voir le guide du "porteur" d'applications : /usr/share/doc/en_US.ISO8859-1/books/porters-handbook/book.html Mise à jour du catalogue. ------------------------- Le catalogue évoluant, il convient de le mettre à jour régulièrement : - récup de l'arbre sur un ftp / extraction. - cvsup / csup - cvs - portsnap Puis mise à jour de l'index (make fetchindex ou make index) / mise à jour de l'index de portupgrade (portsdb). Exemple avec cvsup. *Ceci ne met à jour que le catalogue, aucunement les applications installées.* Mise en oeuvre. --------------- Options globales pour les ports. /etc/make.conf étant inclu il est possible de définir d'y spécifier des options pour l'ensemble des ports. - options de compilation des ports. - options de chemins (note : il faut aussi configurer les chemins dans pkgtools.conf (portupgrade)) Commandes de bases. ------------------- - pkg_add : installation d'un paquet binaire, possibilité de télécharger le paquet y compris les dépendances avec l'option -r (remote). - pkg_delete : désinstallation d'un port - pkg_info : information sur les ports installés. (exemple) pkg_info -v '*' - pkg_create : creation d'un paquet à partir d'un port. (exemple) pkg_create -b 'nom-du-port' Outils de mise à jour et d'installation des ports. ------------------------------------------------- Les commandes de bases de gestions des ports sont peu pratiques pour les mises à jours, en particulier pour les mises à jours massives comme sur un destkop. portupgrade (ports/sysutils) ---------------------------- C'est le plus connu des outils, il permet de mettre à jour un port et ses dépendances (ou à l'inverse les ports qui dépendent d'un port), ceci par des paquets ou par les ports. Portupgrade utilise une base de donnée pour l'index et une base de donnée pour les ports installés (pour gagner du temps). Il n'y a pas d'incompatibilité entre les ports et portupgrade, on peut très bien faire un "make install" et mettre à jour avec portupgrade. commandes. portsdb : construction de la base de donnée des ports (équivalent à INDEX). pkgdb : construction / mise à jour de la base de données des ports installées (équivalent à la structure de fichiers /var/db/pkg). portversion : équivalent à pkg_info. pkg_deinstall : équivalent à pkg_delete. Exemples : portupgrade -R 'kde*' portupgrade -NPP 'cvsup-without-gui' pkg_deinstall portupgrade Base de données : pkgdb -F pour résoudre les conflits éventuels (suivre les instructions). Configuration. Les outils "pkgtools" utilisent un fichier de configuration "pkgtools.conf" Bug récurrent de portupgrade : il arrive que ruby ou portupgrade casse la base de donnée des ports installés, il suffit (souvent) de l'effacer (/var/db/pkg/pkgdb.db) puis de la reconstruire avec pkgdb. portmaster (ports/sysutils) --------------------------- Portmaster est aussi un outil de mise à jour, mais sans gestion des paquets binaires. Il a comme avantage de savoir faire des "make config-recursive", et des fetch en parallèles des fichiers. Comme les outils sont compatibles entre eux, il ne faut pas hésiter à en changer suivant la situation. (exemple). Outils de nettoyage. -------------------- pkg_cutleaves (ports/sysutils). ------------------------------ Il permet de lister les ports dont aucun port ne dépend (ie les applications finales). Et aussi de les désinstaller récursivement. Pratique pour faire du ménage. portsclean (vient avec portupgrade). ----------------------------------- Permet de supprimer les vieux distfiles, les vieux paquets et les vieilles bibliothèques inutilisées (à utiliser avec prudence). Voir aussi les différents outils dans ports/sysutils Audit des ports : ---------------- Portaudit (ports/security). ------------------------- Vérifie les ports installé par rapport à la liste des vulnérabilités ( http://www.vuxml.org/freebsd/ ). À faire tourner dans un cron. libchk (ports/sysutils). ------------------------ Contrôle les liens dynamiques entre les exécutables et les bibliothèques. Utile en cas de pépin et de mauvais lien (ça peut arriver). Astuces en vracs ---------------- + Utilisation d'un arbre des ports montée en read-only (via NFS par exemple). /etc/make.conf: WRKDIRPREFIX= /usr/pkg : chemin de travail (où la compilation a lieu) DISTDIR= /usr/pkg/distfiles : chemin de stockage des distfiles PACKAGES= /usr/pkg/packages : chemin de stockage des paquets. Et de faire la même chose dans pkgtools.conf pour portupgrade. /usr/local/etc/pkgtools.conf: ENV['PORTSDIR'] ||= '/usr/ports' ENV['PACKAGES'] ||= '/usr/pkg/packages' ENV['PKG_PATH'] ||= ENV['PACKAGES'] + '/All' ENV['PKG_BACKUP_DIR'] ||= ENV['PKG_PATH'] + Empêcher la mise à jour d'un paquet par portupgrade. Il faut marquer les paquets 'held' dans pkgtools.conf HOLD_PKGS = [ 'bsdpan-*', 'fr-openoffice*', 'jdk-*', ] Note : les paquets 'held' sont reconstruits s'il y a forçage (portupgrade -f) + Empêcher la mise à jour par portmaster. touch /var/db/pkg/nom-du-port/+IGNOREME + créer un paquet à partir d'un port installé : pkg_create -b nom-du-port + Sauvegarder tous ses ports (-v : verbeux): pkg_info | cut -d ' ' -f 1 | xargs -L 1 pkg_create -vb + rechercher de quel port installé provient un fichier. find /var/db/pkg/ -name '+CONTENTS' -exec fgrep -H fichier-a-chercher {} \; + rechercher dans quel port se situe un fichier (installé ou non). find /usr/ports -name 'pkg-plist' -exec fgrep -H fichier-a-chercher {} \; Note : cette méthode n'est pas fiable à 100%, la pkg-plist peut être générée dynamiquement par le Makefile. + spécifier une option dans /etc/make.conf pour un port particulier. L'astuce est de tester le répertoire courant et donc le port, par exemple pour MySQL : .if ${.CURDIR:M*/databases/mysql*} WITH_TOTO= yes .endif voir aussi http://www.mtdev.com/2005/02/saving-freebsd-ports-make-flags/ qui suggère un fichier à part pour les ports (c'est pas con). ---------------------------------------------------------------------- Pour finir, toujours lire ports/UPDATING !