Jacques Foucry bio photo

Jacques Foucry

IT, râleur et faiseur de pain

Email Twitter



Où l’on continue la mise en place de notre serveur avec l’installation d’élément de confort, la mise en place de snapshots régulier et la configuration de OpenLDAP

Changement de /usr/local

La configuration locale d’un FreeBSD se trouve dans /usr/local, /etc étant réservé au système de base.

Par défaut, il s’agit d’un répertoire. Nous allons nous en servir comme point de montage d’un dataset1 ZFS. Nous pourrons ainsi bénéficier des snapshots2.

Le zpool que nous utilisons s’appelle zroot et c’est sur lui que nous allons créer le dataset :

1
2
3
4
5
6
# zpool list
NAME       SIZE  ALLOC   FREE   FRAG  EXPANDSZ    CAP  DEDUP  HEALTH  ALTROOT
bootpool  1.98G   486M  1.51G    20%         -    23%  1.00x  ONLINE  -
zroot      920G  1.30G   919G     0%         -     0%  1.00x  ONLINE  -

# zfs create -o mountpoint=/usr/local zroot/usr/local

Ce qui signifie :

  • zfs create → création d’un dataset zfs (zfs est la commande principal, create est le premier paramètre) ;
  • -o → suivent les options
  • mountpoint=/usr/local → le point de montage sera /usr/local
  • zroot/usr/local → le dataset est créé dans le zpool zroot dans l’arborescence usr/local

On peut vérifier que la commande a bien été exécutée :

1
2
3
# df -h /usr/local
Filesystem         Size    Used   Avail Capacity  Mounted on
zroot/usr/local    890G     96K    890G     0%    /usr/local

Mise à jour

Il est fort probable qu’entre la constitution de l’image d’installation que nous avons utilisée et maintenant, un nombre important de logiciels soit mit à jour. Nous allons donc récupérer les nouvelles versions de ces logiciels, mais également de l’intégralité des ports3 disponible.

Nous allons tout d’abord télécharger une nouvelle base de données de la collection des paquets (les ports) disponibles :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# portsnap fetch
Looking up portsnap.FreeBSD.org mirrors... 7 mirrors found.
Fetching public key from ec2-eu-west-1.portsnap.freebsd.org... done.
Fetching snapshot tag from ec2-eu-west-1.portsnap.freebsd.org... done.
Fetching snapshot metadata... done.
Fetching snapshot generated at Fri Apr 17 02:09:05 CEST 2015:
ca2f24109c39cd2e93138bdc86a3c28343e718b4577aa3100% of   74 MB   37 MBps 00m02s
Extracting snapshot... done.
Verifying snapshot integrity... done.
Fetching snapshot tag from ec2-eu-west-1.portsnap.freebsd.org... done.
Fetching snapshot metadata... done.
Updating from Fri Apr 17 02:09:05 CEST 2015 to Fri Apr 17 14:04:31 CEST 2015.
Fetching 4 metadata patches... done.
Applying metadata patches... done.
Fetching 0 metadata files... done.
Fetching 22 patches. 
(22/22) 100.00%  done.                              
done.
Applying patches... 
done.
Fetching 2 new ports or files... done.

Puis nous allons extraire un snapshot de ce que nous venons de télécharger :

1
2
3
# portsnap extract
.../...
Building new INDEX files... done.

Par la suite nous pourrons utiliser les commandes suivantes :

1
2
# portsnap fetch
# portsnap update

Il est même possible de coupler cela en une seule commande :

1
# portsnap fetch update

Utilisation de pkg pour la gestion des paquets binaire

La mise en place de l’outil se fait facilement :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# /usr/sbin/pkg
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y
Bootstrapping pkg from pkg+http://pkg.FreeBSD.org/freebsd:10:x86:64/latest, please wait...
Verifying signature with trusted certificate pkg.freebsd.org.2013102301... done
Installing pkg-1.5.1...
Extracting pkg-1.5.1: 100%
Message for pkg-1.5.1:
If you are upgrading from the old package format, first run:

  # pkg2ng
pkg: not enough arguments
Usage: pkg [-v] [-d] [-l] [-N] [-j <jail name or id>|-c <chroot path>|-r <rootdir>] [-C <configuration file>] [-R <repo config dir>] [-o var=value] [-4|-6] <command> [<args>]

For more information on available commands and options see 'pkg help'.

Mise en place des snapshots automatique

Afin de commencer au plus tôt à nous protéger par des snapshot zfs, nous allons installer un port qui met en place une série de scripts qui réalise des snapshots régulier et purge les plus anciens de manière automatisée. Ce port se nomme zfs-periodic. Nous allons utiliser la commande pkg pour faire cette installation :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# pkg install zfs-periodic
Updating FreeBSD repository catalogue...
Fetching meta.txz: 100%    944 B   0.9kB/s    00:01    
Fetching packagesite.txz: 100%    5 MiB   5.3MB/s    00:01    
Processing entries: 100%
FreeBSD repository update completed. 23839 packages processed.
Updating database digests format: 100%
The following 1 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
	zfs-periodic: 1.0.20130213

The process will require 5 KiB more space.
2 KiB to be downloaded.

Proceed with this action? [y/N]: y
Fetching zfs-periodic-1.0.20130213.txz: 100%    2 KiB   2.4kB/s    00:01    
Checking integrity... done (0 conflicting)
[1/1] Installing zfs-periodic-1.0.20130213...
[1/1] Extracting zfs-periodic-1.0.20130213: 100%
Message for zfs-periodic-1.0.20130213:
In order to enable periodic snapshots you need
to add these lines to your /etc/periodic.conf

hourly_output="root"
hourly_show_success="NO"
hourly_show_info="YES"
hourly_show_badconfig="NO"
hourly_zfs_snapshot_enable="YES"
hourly_zfs_snapshot_pools="tank"
hourly_zfs_snapshot_keep=6
daily_zfs_snapshot_enable="YES"
daily_zfs_snapshot_pools="tank"
daily_zfs_snapshot_keep=7
weekly_zfs_snapshot_enable="YES"
weekly_zfs_snapshot_pools="tank"
weekly_zfs_snapshot_keep=5
monthly_zfs_snapshot_enable="YES"
monthly_zfs_snapshot_pools="tank"
monthly_zfs_snapshot_keep=2

To get hourly snapshots you also need to add
something like this to /etc/crontab:

2       *       *       *       *       root    periodic hourly

L’installation de zfs-periodic nous donne des instructions pour finir la mise en place de cet outil. Nous devons modifier le fichier /etc/periodic.conf et y ajouter les lignes qui sont décrites.

Attention, il ne faut pas les reprendre tels quels, notre pool n’a pas forcément le même nom.

Nous devons également ajouter une ligne dans le fichier /etc/crontab afin que les scripts soient lancés périodiquement.

Un peu plus tard, nous pourrons vérifier que cela fonctionne avec la commande :

1
2
3
4
5
6
7
8
9
10
11
# zfs list -t snapshot
&hellip;
zroot/usr/local@daily-2015-04-18          172K      -   318M  -
zroot/usr/local@weekly-2015-15               0      -   318M  -
zroot/usr/local@hourly-2015-04-18-21         0      -   318M  -
zroot/usr/local@hourly-2015-04-18-22         0      -   318M  -
zroot/usr/local@hourly-2015-04-18-23         0      -   318M  -
zroot/usr/local@hourly-2015-04-19-00         0      -   318M  -
zroot/usr/local@hourly-2015-04-19-01         0      -   318M  -
zroot/usr/local@hourly-2015-04-19-02         0      -   318M  -
&hellip;

Confort

Je suis un utilisateur de vi, mais comme les améliorations apportées par vim (VI Improved) me manquent rapidement. C’est pourquoi je vais dès à présent installer ce produit et le configurer un minimum.

1
# pkg install vim

De nombreux autres paquets sont nécessaires, ils seront tous installés automatiquement par pkg.

Je vais créer dans le répertoire “HOME” de root (/root) un fichier .vimrc. Celui est lu à chaque lancement de vim et conporte des instructions de personnalisation :

1
2
set nu
syn on

C’est-à-dire :

  • set nu → numérotation des lignes
  • syn on → coloration syntaxique

Gestion des utilisateurs

Un certain nombre (dont root) existent par défaut dans le système. Mais nous allons avoir besoin d’autres utilisateurs sur notre système. Nous pourrions les gérer à l’ancienne, dans le fichier /etc/passwd, mais nous allons opter pour une gestion centralisée en utilisant le protocole LDAP avec l’outil OpenLDAP.

Installation des outils

Nous avons besoin de openldap-server et de openldap-client. En effet notre machine est serveur LDAP et cliente d’elle même. Heureusement, l’installation du serveur installe également le client (et une bibliothèque nécessaire au bon fonctionnement de l’ensemble). Une fois de plus, des instructions nous sont données à la fin de l’installation.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# pkg install openldap-server
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
All repositories are up-to-date.
The following 3 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
	openldap-server: 2.4.40_4
	openldap-client: 2.4.40_1
	libltdl: 2.4.6

The process will require 8 MiB more space.
2 MiB to be downloaded.

Proceed with this action? [y/N]: y
Fetching openldap-server-2.4.40_4.txz: 100%  826 KiB 845.9kB/s    00:01    
Fetching openldap-client-2.4.40_1.txz: 100%    1 MiB   1.0MB/s    00:01    
Fetching libltdl-2.4.6.txz: 100%   36 KiB  36.5kB/s    00:01    
Checking integrity... done (0 conflicting)
[1/3] Installing openldap-client-2.4.40_1...
[1/3] Extracting openldap-client-2.4.40_1: 100%
[2/3] Installing libltdl-2.4.6...
[2/3] Extracting libltdl-2.4.6: 100%
[3/3] Installing openldap-server-2.4.40_4...
===> Creating users and/or groups.
Creating group 'ldap' with gid '389'.
Creating user 'ldap' with uid '389'.
[3/3] Extracting openldap-server-2.4.40_4: 100%
Message for openldap-client-2.4.40_1:

The OpenLDAP client package has been successfully installed.

Edit
  /usr/local/etc/openldap/ldap.conf
to change the system-wide client defaults.

Try `man ldap.conf' and visit the OpenLDAP FAQ-O-Matic at
  http://www.OpenLDAP.org/faq/index.cgi?file=3
for more information.

Message for openldap-server-2.4.40_4:

The OpenLDAP server package has been successfully installed.

In order to run the LDAP server, you need to edit
  /usr/local/etc/openldap/slapd.conf
to suit your needs and add the following lines to /etc/rc.conf:
  slapd_enable="YES"
  slapd_flags='-h "ldapi://%252fvar%252frun%252fopenldap%252fldapi/ ldap://0.0.0.0/"'
  slapd_sockets="/var/run/openldap/ldapi"

Then start the server with
  /usr/local/etc/rc.d/slapd start
or reboot.

Try `man slapd' and the online manual at
  http://www.OpenLDAP.org/doc/
for more information.
  
slapd runs under a non-privileged user id (by default `ldap'),
see /usr/local/etc/rc.d/slapd for more information.

Configuration du serveur

La configuration du serveur se fait dans le fichier /usr/local/etc/openldap/slapd.conf. Le programme principal du serveur openldap se nomme slapd.

Étudier toutes les lignes de ce fichier serait fastidieux et d’autres le feront mieux que moi. Je ne vais parler que des lignes qui changent, en quoi elles changent et pourquoi.

Les schémas

Sans entrer dans les détails, les données du LDAP sont organisées selon des schémas codifiés. Chaque schéma étant un peu plus les possibilités du LDAP et les champs disponibles. Les schémas décrivent ces champs, ceux qui sont obligatoires, ceux qui sont obligatoires entre eux (si l’un existe alors un autre doit exister), ceux qui sont facultatifs. Celui qui est déjà présent est le schéma de base, core.schema. Nous aurons besoin d’autres schémas pour stocker les données que nous désirons. Nous allons donc ajouter des schémas, à la suite de la ligne déjà présente.

1
2
3
4
5
6
7
include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/corba.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
include /usr/local/etc/openldap/schema/nis.schema
include /usr/local/etc/openldap/schema/collective.schema
include /usr/local/etc/openldap/schema/openldap.schema

Les modules

Les modules permettent d’étendre ou de préciser certains paramètres de LDAP. Par exemple la synchronisation de la base sur deux machines (que nous n’exploiterons pas) est régie par le module syncrepl. Ici nous avons besoin de préciser le module qui servira au stockage des données.

Nous allons décommenter les deux lignes suivantes :

1
2
moduleload      back_mdb
moduleload      back_ldap

Le suffix

Le suffix est l’un des éléments constants des attributs de notre base LDAP. Il permet de rendre uniques les enregistrements. En général, on utilise le nom de domaine décomposé. Mon nom de domaine est foucry.net, mon suffixe est donc :

1
suffix 	"dc=foucry,dc=net"

Le rootdn

Le DN, pour distingued name est une façon unique de retrouver les enregistrements. Le rootdn est celui de l’utilisateur administrateur de la base LDAP

1
rootdn	"cn=admin,dc=foucry,dc=net"

Autres éléments (et pas des moindres)

Nous allons définir le type de base de données que nous allons utiliser pour stocker les objets de notre LDAP. Cet élément doit être conforme au module correspondant :

1
2
database mdb
maxsize 1073741824

Le rootpw est le mot de passe du rootdn que nous avons défini plus haut. Nous allons mettre un mot de passe offusqué que nous allons créer maintenant avec quelques commandes. Nous allons tout d’abord générer un mot de passe aléatoire, avec la commande openssl puis le transformer en quelque chose qui n’est pas compréhensible par les humains, avec la commande slappasswd.

1
2
3
4
5
6
# openssl rand 6 -base64 
xosvq6s2WDvY
# slappasswd -h '{SHA}'
New password: 
Re-enter new password: 
{SHA}8ohame7d9AZ5XdXU8DxbhPq4sIA=

C’est le résultat de slappasswd que nous mettons dans le fichier en face de rootpw

1
rootpw {SHA}8ohame7d9AZ5XdXU8DxbhPq4sIA=

Attention, sauvegarder dans un coin le mot de passe, openssl ne vous le redonnera jamais.

Nous allons également définir le répertoire dans lequel openldap va stocker ses fichiers.

1
directory /var/db/openldap-data

Le fichier /etc/rc.conf

Ce fichier est extrêmement important pour le système, c’est lui qui indique quels sont les services qui seront lancés au démarrage de la machine. On trouve également les paramètres que ces services devront utiliser pour démarrer.

Nous allons indiquer comment le service LDAP doit démarrer et avec quels paramètres :

1
2
3
slapd_enable="YES"
slapd_flags='-h "ldapi://%252fvar%252frun%252fopenldap%252fldapi/ ldap://0.0.0.0/"'
slapd_sockets="/var/run/openldap/ldapi"

Démarrage du service

Normalement tout est prêt et le service devrait fonctionner (sans données) correctement. Il est temps de le démarrer :

1
2
3
# service slapd start
Starting slapd.
/usr/local/etc/rc.d/slapd: WARNING: slapd: Can't find socket /var/run/openldap/ldapi

On a un avertissement au moment du démarrage, slapd ne trouve pas la socket que nous lui avons indiqué dans le fichier /etc/rc.conf

Vérification du bon démarrage du service

Nous allons faire une requête au service et vérifier que sa réponse est conforme à ce que l’on attend :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# ldapsearch -x -W -D cn=admin,dc=foucry,dc=net
Enter LDAP Password:
# extended LDIF
#
# LDAPv3
# base <> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# search result
search: 2
result: 32 No such object

# numResponses: 1

Nous avons une réponse de notre serveur. Certes, il indique qu’il n’a rien trouvé (No such object), mais c’est normal puisque notre base est vide.

Peupler notre LDAP

Il est maintenant temps de peupler notre LDAP avec un début d’arborescence. Nous allons voir comment créer les premiers niveaux de cette arborescence.

Il faut éditer un fichier, que nous appellerons addstuff.ldif :

1
2
3
4
5
6
7
8
dn: dc=foucry,dc=net
objectclass: dcObject
objectclass: organization
o: foucry
dc: foucry
dn: cn=admin,dc=foucry,dc=net
objectclass: organizationalRole
cn: admin

Une fois ce fichier sauvegardé, nous allons ajouter les données qu’il contient dans LDAP à l’aide de la commande ldapadd :

1
2
ldapadd -x -W -D cn=admin,dc=acme,dc=com -f addstuff.ldif
Enter LDAP password:

Note : mon fichier addstuff.ldif est issue de la sauvegarde d’un autre serveur LDAP. La mise en place des données se fait de la même manière, avec ldapadd.

Ajouter des enregistrements

Vous aurez sans doute besoin d’ajouter des enregistrements dans votre LDAP. Il suffit de faire un fichier de description et d’utiliser ldapadd pour les ajouter.

Voici un exemple pour un utilisateur :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
dn: uid=Julie,ou=people,dc=foucry,dc=net
objectClass: top
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: julie
cn: Julie
sn: Julie
givenName: Julie
uidNumber: 5009
gidNumber: 5009
shadowFlag: 0
shadowWarning: 7
shadowMin: 8
shadowMax: 999999
mail: julie@example.com
loginShell: /usr/local/bin/bash
userPassword:: e1NTSEF9UjlSVVlOWnRTUlczQnVpMVczTlBFVW9mUS9uQ0JzOUMg
gecos: Julie Pietri
homeDirectory: /usr/home/julie

Une autre possibilité est d’utiliser ldapvi, une version spéciale pour éditer les informations d’une base LDAP. L’outil vérifie la conformité avec les schémas présents dans la configuration de slapd.

Configuration du client

Le logiciel client est déjà installé, nous l’avons fait au début de cet article. Il faut maintenant le configurer.

Le fichier de configuration est /usr/local/etc/openldap/ldap.conf

Dans celui-ci nous allons indiquer la base de recherche, l’url vers laquelle faire les requêtes.

1
2
URI ldap://127.0.0.1/
BASE dc=foucry,dc=net

Cette configuration ne permet pas encore la connexion des utilisateurs (via ssh ou autre). Il manque quelques logiciels que nous devons installer :

  • pam_ldap
  • nss_ldap
1
2
# pkg install pam_ldap
# pkg nss_ldap 

Configuration de pam_ldap

La configuration se fait dans le fichier /usr/local/etc/ldap.conf.

Attention : ce fichier n’est pas le même que /usr/local/etc/openldap/ldap.conf

Le contenue de ce fichier est simple et reprend l’autre fichier ldap.conf en le complétant. Nous allons donc commencer par recopier /usr/local/etc/openldap/ldap.conf.

1
# cp /usr/local/etc/openldap/ldap.conf /usr/local/etc/ldap.conf

Nous ajoutons dans ce nouveau fichier la ligne :

1
pam_login_attribute	uid

Qui indique que à pam, l’autre logiciel que nous venons d’installer, de rechercher dans la base LDAP, l’attribut uid pour la connexion des utilisateurs.

Note : uid est l’un des attributs des utilisateurs que nous ajoutons à notre LDAP. Regardez à nous l’extrait de fichier plus haut dans cette page.

PAM

PAM signifie Pluggable Authentification Modules. Il s’agit de la méthode utilisé par de nombreux Unix (dont Linux et FreeBSD) pour authentifier les sessions.

La plus grande partie de la configuration se fait dans le répertoire /etc/pam.d. Dans se répertoire on trouve un fichier par module d’authentification possible (sshd, ftp, imap, pop3,…) Pour ce qui est des connexions distantes via ssh, c’est le fichier /etc/pam.d/sshd qui est concerné.

Chaque fichier peut contenir plusieurs sections, pour l’authentification (auth), le compte utilisateur (account), les sessions (sessions) et les mots de passe (password).

Note : je ne détaillerais pas ici les différentes sections ni comment elles fonctionnent, vous trouverez sur Internet de quoi étancher votre soif de savoir.

Dans le fichier /etc/pam.d/sshd nous allons ajouter une ligne dans la section auth afin de d’indiquer que l’authentification se fait en interrogeant le serveur LDAP.

1
auth 	sufficient 	/usr/local/lib/pam_ldap.so 	no_warn

Nous allons aussi ajouter une ligne dans la section account afin que PAM vérifie l’existence effective du compte (et que celui-ci n’est pas bloqué). Pour éviter de bloquer les utilisateurs qui ne sont pas dans le LDAP (root par exemple) et que vous ne soyez bloquer si le serveur LDAP devient injoignable nous allons ajouter les lignes suivantes :

1
2
account 	required 	pam_login_access.so
account 	required 	/usr/local/lib/pam_ldap.so 	no_warn ignore_authinfo_unavail ignore_unknown_user

NSS

NSS signifie Name Service Switch. C’est le service qui est chargé de faire la corrélation entre l’uid d’un utilisateur son nom. Cette information était historiquement stockée dans le fichier /etc/passwd. Elle est désormais dans le LDAP. Il est donc nécessaire d’indiquer à nss d’aller la chercher dans ce service.

C’est dans le fichier /etc/nsswitch que se fait cette configuration.

Nous allons modifier les lignes passwd et group :

1
2
group: compat
passwd:	compat

deviennent :

1
2
group: files ldap
passwd: files ldap

Il faut également indiquer à nss sur quel serveur trouver les informations. Cela se fait dans le fichier /usr/local/etc/nss_ldap.conf. Il suffit d’y mettre l’adresse IP du serveur et la base de recherche :

1
2
host 127.0.0.1
base dc=foucry,dc=net

Normalement vous devriez avoir un LDAP en étant de fonctionnement.

Un dernier point

N’oubliez pas de créer un dataset ZFS pour le répertoire home de chacun de vos utilisateurs :

1
# zfs create -o mountpoint /usr/home/user zroot/usr/home/user

De mon côté cette nouvelle machine remplaçant une machine excitante, je vais migrer les dataset ZFS de l’ancienne machine vers la nouvelle. C’est l’une des fonctionnalités absolument géniales de ZFS :

1
# zfs send zroot/usr/home/jacques | ssh _nouvelle_machine_ zfs receive zroot/usr/home/jacques

La première machine envoie (zfs send) le dataset à travers ssh vers la nouvelle machine qui reçois les données et les ranges dans le zpool désigné en créant le dataset voulu (zfs receive zroot/usr/home/jacques). Epoustouflant n’est-ce t-il pas ?

  1. ZFS est un système de fichier créé par Sun Microsystem (racheté par Oracle) qui possède des fonctionnalités très intéressantes. Sa capacité, les snapshot, la compression et la déduplication à la volée, l’absence de formatage. L’entité de base est le ZPOOL constitué d’un ou plusieurs disques physiques, organisés en “stripe”, “mirror”, “raid”, etc. Chaque zpool peut porter un nombre important de dataset. Chaque dataset comporte un certain nombre de paramètres, dont le point de montage ce qui les apparentes à des systèmes de fichiers sur des partitions. Pour plus de précisions sur ZFS, lisez la page wikipédia qui lui est consacrée. 

  2. les snaphosts de ZFS (ou d’autres systèmes de fichiers) sont de photographies à l’instant T. Ils sont figés et même si le système de fichier dont ils sont issus continue à vivre, les données qu’ils contiennent ne changent plus. Ils peuvent ensuite être utilisés pour faire des sauvegardes sur des supports externes (bandes magnétiques, disque dur, cloud), mais également pour revenir à un état précédent une manipulation importante, typiquement la mise à jour d’un logiciel ou du système. 

  3. les ports constituent les logiciels préparés pour être utilisés sous FreeBSD. Ils ont été validés, compilés, traités avec leurs dépendances pour une installation facilitée. 


Article suivant :

Laisser un commentaire

Les commentaires sont soumis à modération.