La stratégie adoptée par les systèmes xBSD consiste à installer une base minimale (différente pour chacune des flavors xBSD et suffisante pour que le système puisse tourner. Rappelons du reste que chaque flavor xBSD est un système d'exploitation [Operating System] complet (i.e. comprenant un noyau, un interprète de commande, des utilitaires, des applications). Cette approche permet de ne pas avoir d'éléments superflus (installés, mais jamais utilisés) et s'oppose aux approches traditionnelles des systèmes win* ou de certaines distributions Gnu/Linux.
Il est néanmoins nécessaire d'installer des programmes tiers (applications) n'appartenant pas au système de base et puisque l'accès au code source est possible, un moyen de le faire est le suivant :
Télécharger le code source (archive) wget -NSc ...archive.tgz.
Vérifier que cette archive n'a pas été corrompue, au cours du télé-chargement. Comparaison des hashages reçu et calculé (md5 archive.tgz).
Décompresser l'archive (tar xzvf archive.tgz).
Appliquer les patchs spécifiques à l'OS cible (patch ...).
Compiler le programme en activant les options nécessaires (gcc -O2 ...).
L'installer (cp ... ).
Nettoyer l'arborescence (find . -name ``*o'' -exec rm -f {} \;).
Effacer (éventuellement) l'arborescence (rm -rf ...).
Aujourd'hui tous les administrateurs ne sont (hélas) pas forcément des programmeurs en mesure de comprendre, maintenir et/ou débugger ces programmes (activité très consommatrice de temps, désormais dévolue aux développeurs), c'est pourquoi la communauté FreeBSD a conçu (dès 1995) un système de gestion/portage des logiciels tiers, destiné à faciliter le travail de l'administrateur dans le cycle : installation ↠ configuration ↠ re/de-installation.
Ce système adopté avec succès par les autres flavors xBSD considèrent ces logiciels tiers de deux points de vue :
les ports, i.e. ensemble d'instructions qui permet de porter le logiciel tiers dans l'arborescence BSD à partir du code source.
les packages. Un package (paquetage en français) est un port pré-compilé pour une architecture donné[1].
A ce jour, la collection des ports [ports collection, ou encore ports tree] est plutôt vaste : 15379 entrées (c.f. « FreeBSD ports [2006-07-31] »).
Avantages :
Un paquetage est souvent plus petit que l'archive source qui lui donne naissance.
Un paquetage ne requiert aucune compilation ce qui peut être crucial dans le cas de grosses applications telles que xorg, Mozilla, OpenOffice, Gnome... Surtout sur un système lent !
Installer un paquetage ne requiert pas de compréhension quant à la compilation sous FreeBSD.
Les paquetages sont gérés par le quadruplet de primitives suivant :
Tableau 2. Primitives de gestion des packages
| primitive | rôle |
|---|---|
| pkg_add | pour installer un paquetage. |
| pkg_info | pour interroger la base des paquetages installés (/var/db/pkg). Selon les options activées, permet d'obtenir des informations sur le contenu du paquetage, ses dépendances ... |
| pkg_version | permet d'établir un résumé des versions des paquetages installés relativement à la version courante de l'arborescence des ports, ce qui permet de connaître les paquetages à jour. |
| pkg_delete | Enlever un paquetage (avec respect des dépendances). |
![]() | Note |
|---|---|
L'installation du paquetage (ou du port) |
Un exemple de ce qu'installe un paquetage (wmitime) :
$ more /var/db/pkg/wmitime-0.3/+CONTENTS @comment PKG_FORMAT_REVISION:1.1@name wmitime-0.3
@comment ORIGIN:x11-clocks/wmitime
@cwd /usr/X11R6
@pkgdep xpm-3.4k
@comment DEPORIGIN:graphics/xpm bin/wmitime
@comment MD5:27323c1aba7936209161aa9e0e16cd0a
Ces lignes nous donnent respectivement :
Il existe plusieurs méthodes pour installer un paquetage, de même qu'il existe plusieurs sources (CDs, serveurs FTP/HTTP). Toutes les méthodes d'installation requièrent des droits étendus (root).
La première consiste à utiliser le frontal sysinstall [/usr/sbin/sysinstall], puis à se rendre dans la section Configure/Packages pour ensuite choisir le média (source des paquetages), les sélectionner et les installer. Cette méthode ne pose aucun problème.
La seconde necéssite à un accès à l'Internet et consiste à se connecter manuellement à un serveur FTP disposant des paquetages, pour les télécharger sur sa machine avant de les installer. Il existe une autre variante (plus simple) qui consiste à utiliser l'option -r de la commande pkg_add :
# setenv PACKAGEROOT ftp://ftp.fr.freebsd.org # pkg_add -r wmitime
![]() | Note |
|---|---|
Dans ce dernier cas, il est inutile de préciser la version du paquetage, le système se débrouille pour trouver la dernière. De plus il cherchera le paquetage sur le miroir précisé par la variable d'environnement |
Si vous êtes derrière un firewall, il faudra positionner un certain nombre de variables d'environnement (c.f. fetch (3)) telles que : FTP_PASSIVE_MODE, FTP_PROXY, HTTP_PROXY ...
La primitive pkg_info (1) permet d'obtenir des renseignements sur les paquetages installés.
$ pkg_info Hermes-1.3.2_1 Fast pixel formats conversion library ImageMagick-5.5.6_1 Image processing tools (interactive optional--misc/display Mesa-3.4.2_2 A graphics library similar to SGI's OpenGL ORBit-0.5.17 High-performance CORBA ORB with support for the C language ORBit2-2.6.2 High-performance CORBA ORB with support for the C language OpenSSH-askpass-1.2.2.2001.02.24 Graphical password applet for entering SSH pass Sablot-0.97 XML toolkit implementing XSLT 1.0, XPath 1.0 and DOM Level2 XFree86-4.3.0,1 X11/XFree86 core distribution (complete, using mini/meta-po .. acid-0.9.6b23 Analysis Console for Intrusion Databases (ACID) with Snort ... docbook-1.2 Meta-port for the different versions of the DocBook DTD docbook-241_1 V2.4.1 of the DocBook DTD, designed for technical documenta
La primitive pkg_version (1), permet de résumer les versions des paquetages installés, en les comparant aux versions localement disponible dans l'arborescence des ports.
$ pkg_version | less apache = autoconf213 = calamaris = cvsup-mirror = cvsup-without-gui = db3 = emacs = expat = ezm3 = freetype2 = gd = gettext = gmake = jpeg = libiconv = libtool = m4 = mrtg = png = rsync = squid = squidGuard =
Tableau 3. Sémantique des symboles
| Symbole | Sémantique |
|---|---|
| = | La version du paquetage installée correspond à celle trouvée dans l'arborescence des ports. |
| < | La version du paquetage installée est plus vieille que la version courante. |
| > | La version du paquetage installée est plus récente que la version courante ! L'index des ports peut ne pas être à jour. |
| ? | La version du paquetage installée n'apparaît pas dans l'index des ports. L'index peut ne pas avoir été trouvé. Localisé dans un autre répertoire que celui par défaut, renseigner alors la variable d'environnement PORTSDIR ... |
| * | Plusieurs versions du même paquetage existent. C'est le cas pour emacs, tcl, tk ... |
| ! | Pour une raison inconnue les versions installée(s) et disponible(s) n'ont pu être comparée. |
Etant donné un paquetage installé, quels sont les paquetages dont il dépend, i.e. ses sous-dépendances ?
$ pkg_info -r windowmaker-0.92.0_1 Information for windowmaker-0.92.0_1: Depends on: Dependency: pkgconfig-0.20 Dependency: expat-2.0.0 Dependency: jpeg-6b_3 Dependency: png-1.2.8_3 Dependency: freetype2-2.1.10_2 Dependency: perl-5.8.7_2 Dependency: fontconfig-2.3.2_2,1 Dependency: libiconv-1.9.2_1 Dependency: xorg-libraries-6.9.0 Dependency: tiff-3.8.0 Dependency: gettext-0.14.5_1 Dependency: wmicons-1.0 Dependency: libungif-4.1.4 Dependency: libXft-2.1.7
L'option -r de la commande pkg_info (1) permet de connaître les sous-dépendances, i.e. les paquetages nécessaires au fonctionnement du paquetage courant.
Un paquetage installé peut à son tour rentrer dans le jeu des dépendances d'autres paquetages. Comment connaître ses sur-dépendances ? Reprenons, notre paquetage windowmaker-0.92.0_1, sur mon système cela donne :
$ pkg_info -r windowmaker-0.92.0_1 Information for windowmaker-0.92.0_1: Required by: wdm-1.28_1 wmakerconf-2.11_1 wmglobe-1.3_1
L'option -R de la commande pkg_info (1) permet de connaître les sur-dépendances, i.e. les paquetages dont le fonctionnement est conditionné au fonctionnement du paquetage courant.
Les ports nécessitent un peu plus de travail pour leur installation mais ils présentent aussi des avantages :
Les paquetages utilisent des options restrictives leurs permettant de s'exécuter sur n'importe quelle architecture, lesquelles ne tirent pas partie des spécificités de l'architecture cible (par exemple CPU Athlon, ...).
Certains logiciels tiers ont des jeux d'options étendus, qui ne sont pas activés dans les paquetages (limitation aux options par défaut), ce qui n'est pas le cas avec un port.
Pour utiliser les ports, il faut au préalable récupérer et installer l'arborescence des ports ports.tgz disponible sur le premier CD de la distribution (répertoire /ports, ou bien sur un serveur FTP. L'installation s'effectue par défaut dans le répertoire /usr/ports.
Installer manuellement l'arborescence des ports (CD) : # mount /cdrom # cd /usr # tar xjvf /cdrom/6.0-RELEASE/ports/ports.tgz ...
La personnalisation de l'environnement de compilation s'effectue dans le fichier /etc/make.conf. En voici un court extrait :
Extrait de /etc/make.conf d'une machine de type Ahtlon 64 bits
...
#
# (?= allows to buildworld for a different CPUTYPE.)
#
CPUTYPE=athlon64
#NO_CPU_CFLAGS= # Don't add -march=<cpu> to CFLAGS automatically
#NO_CPU_COPTFLAGS= # Don't add -march=<cpu> to COPTFLAGS automatically
#
# CFLAGS controls the compiler settings used when compiling C code.
# Note that optimization settings other than -O and -O2 are not recommended
# or supported for compiling the world or the kernel - please revert any
# nonstandard optimization settings to "-O" or -O2 before submitting bug
# reports without patches to the developers.
#
CFLAGS= -O2 -pipe
#
# CXXFLAGS controls the compiler settings used when compiling C++ code.
# Note that CXXFLAGS is initially set to the value of CFLAGS. If you wish
# to add to CXXFLAGS value, "+=" must be used rather than "=". Using "="
# alone will remove the often needed contents of CFLAGS from CXXFLAGS.
#
CXXFLAGS+= -fconserve-space
...
#
# wpa_supplicant
#
# Enable this to include 802.1X and EAP support in wpa_supplicant.
# 802.1X with EAP requires openssl but it can be used without to
# do things like dynamic WEP keying. The default is to build
# wpa_supplicant only with WPA-PSK support.
#
#ENABLE_WPA_SUPPLICANT_EAPOL=true
# added by Corto Inc, 2005-07-23
.include </usr/ports/makefile.mk>
#
ZOPEINSTANCEBASE=/jail/vm1/Zope # Directory where Zope instance should go
ZOPEINSTANCENAME="" # Default name for a new Zope instance (none)
#
# added by use.perl 2006-01-19 07:34:03
PERL_VER=5.8.8
PERL_VERSION=5.8.8
La suite de la configuration est placée (arbitrairement) dans le fichier /usr/ports/makefile.mk (c.f. l'extrait précédent). En voici le contenu à titre purement indicatif :
/usr/ports/makefile.mk pour une machine de type Ahtlon 64 bits
PORTSDIR=/usr/ports
DISTDIR=/opt/pub/FreeBSD/ports/distfiles/
PACKAGES=/opt/pub/FreeBSD/ports/amd64/packages-6.0/
#### CHOME [Reunion]
MASTER_SITES='ftp://ftp.fr.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/'
MASTER_SITE_OVERRIDE='ftp://ftp.fr.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/'
FETCH_ENV='HTTP_PROXY=http://proxy.corto.home:8080/ \
FTP_PROXY=ftp://proxy.corto.home:8080/ \
FTP_TIMEOUT=10 \
HTTP_TIMEOUT=10'
#FETCH_CMD='/usr/local/bin/wget '
X_WINDOW_SYSTEM=xorg
NO_SUID_XSERVER=YES
Nous supposons que l'arborescence des ports est localisée en /usr/ports et que nous voulons installer le port wget[2]. Nous nous contenterons de la version dediée au protocole IPv4.
Se rendre dans /usr/ports
Rechercher ensuite l'emplacement du port à installer dans l'arborescence (depuis /usr/ports) :
$ grep ^wget INDEX-6 wget-1.10.2|/usr/ports/ftp/wget|/usr/local|Retrieve files from the Net via HTTP and FTP|/usr/ports/ftp/wget/pkg-descr|sf@FreeBSD.org|ftp www ipv6|gettext-0.14.5_1 libiconv-1.9.2_1 perl-5.8.7_2|gettext-0.14.5_1 libiconv-1.9.2_1| http://www.gnu.org/software/wget/wget.html|perl-5.8.7_2|perl-5.8.7_2| wgetpro-0.1.3|/usr/ports/ftp/wgetpro|/usr/local|Wget with "PRO" features| /usr/ports/ftp/wgetpro/pkg-descr|ports@FreeBSD.org|ftp|gettext-0.14.5_1 gmake-3.80_2 libiconv-1.9.2_1|gettext-0.14.5_1 libiconv-1.9.2_1|||| wget4web-1.0|/usr/ports/www/wget4web|/usr/local|WWW interface for console wget| /usr/ports/www/wget4web/pkg-descr|sam@brj.pp.ru|www ftp|apache-1.3.34_4 expat-2.0.0 perl-5.8.7_2|apache-1.3.34_4 expat-2.0.0 gettext-0.14.5_1 libiconv-1.9.2_1 perl-5.8.7_2 wget-1.10.2|http://irodov.nm.ru/wget4web/|||
autre méthode de recherche :
$ make search key=^wget Port: wget-1.10.2 Path: /usr/ports/ftp/wget Info: Retrieve files from the Net via HTTP and FTP Maint: sf@FreeBSD.org B-deps: gettext-0.14.5_1 libiconv-1.9.2_1 perl-5.8.7_2 R-deps: gettext-0.14.5_1 libiconv-1.9.2_1 WWW: http://www.gnu.org/software/wget/wget.html Port: wgetpro-0.1.3 Path: /usr/ports/ftp/wgetpro Info: Wget with "PRO" features Maint: ports@FreeBSD.org B-deps: gettext-0.14.5_1 gmake-3.80_2 libiconv-1.9.2_1 R-deps: gettext-0.14.5_1 libiconv-1.9.2_1 WWW: Port: wget4web-1.0 Path: /usr/ports/www/wget4web Info: WWW interface for console wget Maint: sam@brj.pp.ru B-deps: apache-1.3.34_4 expat-2.0.0 perl-5.8.7_2 R-deps: apache-1.3.34_4 expat-2.0.0 gettext-0.14.5_1 libiconv-1.9.2_1 perl-5.8.7_2 wget-1.10.2 WWW: http://irodov.nm.ru/wget4web/
La requête précédente nous indique l'emplacement : /usr/ports/ftp/wget :
$ cd ftp/wget
Un listage du répertoire nous donne :
$ ls -l total 10 -rw------- 1 pascal bsd - 1283 Dec 5 17:33 Makefile-rw------- 1 pascal bsd - 191 Jan 25 00:47 distinfo
drwxr-xr-x 2 pascal bsd - 512 Sep 1 17:50 files
-rw------- 1 pascal bsd - 1045 Jun 10 2005 pkg-descr
-rw------- 1 pascal bsd - 1537 Jun 10 2005 pkg-plist
![]()
Aucune option particulière n'est requise (sinon on les renseigne, le jeu complet d'option apparaît dans le Makefile spécifique du port), on peut donc lancer le processus de compilation sous l'identité de root :
$ su - passwd: # cd /usr/ports/ftp/wget # make
Une fois la compilation terminée, on lance l'installation :
# make install
on peut éventuellement lancer l'installation en créant un package, l'intérêt est de pouvoir le réinstaller plus tard sans recompilation ou bien encore de l'installer sur une machine d'architecture similaire :
# make package
Le package obtenu est placé dans un sous répertoire de l'arborescence désignée par la variable d'environnement PACKAGE renseignée dans notre fichier /usr/ports/makefile.mk.
L'installation terminée, il faut faire le ménage, i.e. supprimer les fichiers objets et le/les exécutables obtenus et stockés dans le sous-répertoire work :
# make clean
Une vérification pour savoir si le port est installé (en tant qu'utilisateur standard) :
$ pkg_info | grep ^wget wget-1.10.2 Retrieve files from the Net via HTTP and FTP
Tableau 4. Principe de l'installation d'un port
| Opération | Sémantique |
|---|---|
make fetch | télécharge l'archive source du port depuis un site autorisé et la place dans le $DISTDIR. |
make checksum | vérifie l'intégrité de l'archive. |
make depends | vérifie les dépendances, les ports pré-requis à l'installation du présent port sont-ils déjà installés ? |
make extract | extrait le code source de l'archive dans un répertoire de travail désigné par $WRKPREFIXDIR, généralement, /usr/ports/<portname>/work/. |
make patch | applique les patchs spécifiques à FreeBSD. |
make configure | vérifie si le programme nécessite un script de configuration, si oui l'exécute. |
make build | construit l'/les exécutable(s). |
make install | installe le tout et enregistre cette installation dans /var/db/pkg. |
make package | alternative à l'option install précédente, installe le port et créé un package (archive au format .tbz) qui peut être installé sur d'autres machines (de même architecture). |
make package-recursive | installe le port et créé un package (archive au format .tbz) et tous les packages dépendants. |
make clean | nettoie l'arborescence du code objet et exécutable obtenu (suppresion du sous répertoire work). |
make distclean | nettoie l'arborescence du code objet et exécutable obtenu (suppresion du sous répertoire work) et du code source (stocké à l'endroit désigné par la variable d'environnement ${DISTDIR}). |
Si le port possède des dépendances non installées, le processus s'interrompt pour lancer l'installation des dépendances selon le même schéma que précédemment, puis reprend son cours jusqu'à l'installation.
Invoquer directement la commande make sans argument pour un port est équivalente à la succession : make fetch, make checksum, make fetch, make depends, make extract, make patch, make configure et make build.
Un port installé est un paquetage, il est donc gérable avec les primitives de gestion des paquetages. Toutefois, il est possible de dé-installer ou ré-installer un port en se plaçant dans son arborescence source et en utilisant les commandes respectives suivantes : make [-f] deinstall, make [-f] reinstall. Ces commandes respectent évidement les dépendances.
Il est possible de contruire explicitement un paquetage [package] à l'issue de la compilation d'un port, ce qui permet de l'installer sans recompilation sur d'autres machines. Pour se faire, au lieu de faire un make install, on exécute un make package. Cela a pour effet d'installer le port sur la machine et de créer un paquetage.
Il existe un outils qui permet de vérifier le statut de sécurité des ports/packages : portaudit ($PORTS/security/portaudit). Cet outils fait usage d'une application xml documentnant les problèmes de sécurité dans une collection de packages (telle l'arborescence des ports de FreeBSD) plus connue sous le nom de VuXML [Vulnerability and eXposure Markup Language]. Ce projet disponible aussi pour OpenBSD a vu le jour fin 2003.