OBSD4* : wiki

Compiler OpenBSD dans un système de fichiers mfs

Objectif

Compiler le couple noyau/base du système en mémoire vive.

Versions d’OpenBSD concernées

STABLE, CURRENT.

Avantages

  • Même si ce n’est pas l’intérêt principal, nous allons gagner du temps sur la durée totale de l'ensemble des compilations. (Exemple : écritures récurrentes sur un disque lent)
  • De mon point de vue, il s’agit par contre d’une méthode élégante pour « épargner » un SSD des écritures récurrentes effectuées lors des compilations. Cette méthode peut donc permettre de mieux préserver la durée de vie du SSD. Pour les utilisateurs de current, une autre méthode élégante serait évidemment de choisir de ne pas compiler le noyau/base du système (utiliser snaps). Quant aux utilisateurs de stable, ils n’ont pas le choix !

Inconvénients

  • Avoir une machine multi-cœur et robuste, dotée d’une capacité relativement conséquente de mémoire vive. Dans le cadre de ce tutoriel, le processeur est un Core 2 Duo et la capacité totale de mémoire vive est de 6 Go (DDR3).
  • La sécurité ?

Sources

Prérequis

  • Avoir un système OpenBSD fonctionnel.
  • Avoir accès aux droits administrateur (soit en ayant accès au compte 'root' lui-même soit en utilisant la commande « doas »).

Slice créés sur la partition primaire qui accueille le système OpenBSD :

Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/sd0a     1005M    108M    846M    11%    /
/dev/sd0o      7.9G    3.2M    7.5G     0%    /home
/dev/sd0d      1.8G   16.0K    1.7G     0%    /tmp
/dev/sd0f      1.9G    372M    1.4G    20%    /usr
/dev/sd0g     1005M    212M    742M    22%    /usr/X11R6
/dev/sd0h      4.0G    2.3G    1.5G    61%    /usr/local
/dev/sd0m      2.0G    2.0K    1.9G     0%    /usr/obj
/dev/sd0n      2.0G    2.0K    1.9G     0%    /usr/ports
/dev/sd0l      2.0G    2.0K    1.9G     0%    /usr/src
/dev/sd0e      2.7G   16.1M    2.6G     1%    /var

Étape n°1 : Configuration du système de fichier MFS

Nous éditons le fichier « /etc/fstab » pour

(a) commenter les lignes concernant les systèmes de fichiers « /usr/obj » et « /usr/src » :

Avant :

a6e9e4086fdf1a56.b none swap sw
a6e9e4086fdf1a56.a / ffs rw,softdep,noatime 1 1
a6e9e4086fdf1a56.o /home ffs rw,nodev,nosuid,softdep,noatime 1 2
a6e9e4086fdf1a56.d /tmp ffs rw,nodev,nosuid,softdep,noatime 1 2
a6e9e4086fdf1a56.f /usr ffs rw,nodev,softdep,noatime 1 2
a6e9e4086fdf1a56.g /usr/X11R6 ffs rw,nodev,softdep,noatime 1 2
a6e9e4086fdf1a56.h /usr/local ffs rw,wxallowed,nodev,softdep,noatime 1 2
a6e9e4086fdf1a56.n /usr/obj ffs rw,nodev,nosuid,softdep,noatime 1 2
a6e9e4086fdf1a56.m /usr/ports ffs rw,nodev,nosuid,softdep,noatime 1 2
a6e9e4086fdf1a56.l /usr/src ffs rw,nodev,nosuid,softdep,noatime 1 2
a6e9e4086fdf1a56.e /var ffs rw,nodev,nosuid,softdep,noatime 1 2

Après :

a6e9e4086fdf1a56.b none swap sw
a6e9e4086fdf1a56.a / ffs rw,softdep,noatime 1 1
a6e9e4086fdf1a56.o /home ffs rw,nodev,nosuid,softdep,noatime 1 2
a6e9e4086fdf1a56.d /tmp ffs rw,nodev,nosuid,softdep,noatime 1 2
a6e9e4086fdf1a56.f /usr ffs rw,nodev,softdep,noatime 1 2
a6e9e4086fdf1a56.g /usr/X11R6 ffs rw,nodev,softdep,noatime 1 2
a6e9e4086fdf1a56.h /usr/local ffs rw,wxallowed,nodev,softdep,noatime 1 2
#a6e9e4086fdf1a56.n /usr/obj ffs rw,nodev,nosuid,softdep,noatime 1 2
#a6e9e4086fdf1a56.m /usr/ports ffs rw,nodev,nosuid,softdep,noatime 1 2
#a6e9e4086fdf1a56.l /usr/src ffs rw,nodev,nosuid,softdep,noatime 1 2
a6e9e4086fdf1a56.e /var ffs rw,nodev,nosuid,softdep,noatime 1 2

Remarque : J’ai aussi commenté la ligne concernant le système de fichier « /usr/ports » qui a été créé lors de l’installation car je ne compte pas compiler les logiciels tierce-partie. Cependant si un jour je change d’avis, je serais fin prêt par le biais de « mfs » !

(b) pour ajouter les deux lignes suivantes :

Une ligne concernant « l’export » du système de fichier « /usr/obj » en mémoire vive

swap /usr/obj mfs rw,nodev,nosuid,noatime,-s=2G 0 0

et une autre concernant « l’export » du système de fichier « /usr/src » en mémoire vive

swap /usr/src mfs rw,nodev,nosuid,noatime,-s=2G 0 0

Remarque : Une capacité maximale de 2 Go de la mémoire vive a été allouée (allocation dynamique) pour chacun de ces deux systèmes de fichier. Autrement dit, dans le pire des cas (ce que je n’ai pas rencontré durant mes tests), une quantité de 4 Go (= 2 Go + 2 Go) de la mémoire vive sur les 6 Go seront utilisées lors des compilations.

Voici le nouveau fichier « /etc/fstab » :

a6e9e4086fdf1a56.b none swap sw
a6e9e4086fdf1a56.a / ffs rw,softdep,noatime 1 1
a6e9e4086fdf1a56.o /home ffs rw,nodev,nosuid,softdep,noatime 1 2
a6e9e4086fdf1a56.d /tmp ffs rw,nodev,nosuid,softdep,noatime 1 2
a6e9e4086fdf1a56.f /usr ffs rw,nodev,softdep,noatime 1 2
a6e9e4086fdf1a56.g /usr/X11R6 ffs rw,nodev,softdep,noatime 1 2
a6e9e4086fdf1a56.h /usr/local ffs rw,wxallowed,nodev,softdep,noatime 1 2
#a6e9e4086fdf1a56.n /usr/obj ffs rw,nodev,nosuid,softdep,noatime 1 2
#a6e9e4086fdf1a56.m /usr/ports ffs rw,nodev,nosuid,softdep,noatime 1 2
#a6e9e4086fdf1a56.l /usr/src ffs rw,nodev,nosuid,softdep,noatime 1 2
a6e9e4086fdf1a56.e /var ffs rw,nodev,nosuid,softdep,noatime 1 2
swap /usr/obj mfs rw,nodev,nosuid,noatime,-s=2G 0 0
swap /usr/src mfs rw,nodev,nosuid,noatime,-s=2G 0 0

Étape n°2 : Récupération des sources d'OpenBSD CURRENT

  • Comme nous allons redémarrer la machine entre l’étape de la compilation du noyau et celle de la compilation de la base du système, nous créons un répertoire « src » dans « /home » pour accueillir les sources ce qui nous évitera de télécharger une nouvelle fois celles-ci.
# mkdir /home/src &&  chown -R root:wheel /home/src && chmod 700 /home/src 
  • Nous téléchargeons les sources. (Dans notre cas : celles de current.)
# cd /home/src/
# cvs -qd anoncvs@anoncvs.ca.openbsd.org:/cvs get -P src

Puis nous redémarrons le système.

# reboot

Étape n°3 : Compilation du noyau (GENERIC.MP)

  • Nous copions les sources téléchargées précédemment dans l’arborescence adéquate (« /usr/src »).

Voici la commande :

# cp -rf /home/src/* /usr/src/
  • Nous pouvons aussi constater que les systèmes de fichiers « /usr/src » et « /usr/obj » sont bien montés en mémoire vive (grâce à « mfs »).
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/sd0a     1005M    237M    718M    25%    /
/dev/sd0o      8.0G    1.6G    6.0G    21%    /home
/dev/sd0d      1.8G    188K    1.7G     0%    /tmp
/dev/sd0f      1.9G    372M    1.4G    20%    /usr
/dev/sd0g     1005M    212M    742M    22%    /usr/X11R6
/dev/sd0h      4.0G    2.4G    1.4G    62%    /usr/local
/dev/sd0e      2.8G   23.0M    2.6G     1%    /var
mfs:29221      1.9G    2.7M    1.8G     0%    /usr/obj
mfs:43772      1.9G    631M    1.2G    35%    /usr/src
  • Nous allons compiler un noyau générique gérant plusieurs core et/ou plusieurs processeurs.

Voici les commandes qui doivent être saisies :

# cd /usr/src/sys/arch/$(uname -m)/conf
# config GENERIC.MP && cd ../compile/GENERIC.MP
# make clean && make && make install
  • Nous redémarrons le système à l'aide de la commande « reboot ». (Attention, de fait, nous allons perdre toutes les données contenues sur le système de fichiers « /usr/src » !)

Étape n°4 : Compilation de la base (étape la plus longue et la plus lourde en termes de compilations)

  • Nous avons perdu les sources contenues dans le système de fichiers « /usr/src ». Nous les recopions.
# cp -rf /home/src/* /usr/src/
  • Nous allons maintenant compiler la base du système.
# cd /usr/src && make obj
# cd /usr/src/etc && env DESTDIR=/ make distrib-dirs 
# cd .. && time make build

NB : Puisque le système de fichier est monté en mémoire vive, il est donc inutile (après le redémarrage) de lancer la commande suivante :

# rm -rf /usr/obj/*

Durant les compilations de la base :

load averages: 2.93, 2.66, 1.62 hades.honjin.local
18:35:37 82 processes: 2 running, 78 idle, 2 on processor up 0:16
CPU0 states: 33.7% user, 0.0% nice, 25.7% system, 2.0% interrupt, 38.6% idle
CPU1 states: 34.7% user, 0.0% nice, 21.8% system, 0.0% interrupt, 43.6% idle
Memory: Real: 1291M/2275M act/tot Free: 3568M Cache: 600M Swap: 0K/1264M

Nous constatons que le noyau « bsd.mp» prend bien en charge les deux core du processeur.

NB : Voici ce que rend la commande « df -h ».

Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/sd0a     1005M    239M    716M    25%    /
/dev/sd0o      8.0G    1.6G    6.0G    21%    /home
/dev/sd0d      1.8G   98.0K    1.7G     0%    /tmp
/dev/sd0f      1.9G    402M    1.4G    22%    /usr
/dev/sd0g     1005M    212M    742M    22%    /usr/X11R6
/dev/sd0h      4.0G    2.4G    1.4G    62%    /usr/local
/dev/sd0e      2.8G   23.0M    2.6G     1%    /var
mfs:29221      1.9G    982M    902M    52%    /usr/obj
mfs:43772      1.9G    664M    1.2G    35%    /usr/src

Nous pouvons constater que nous avions de la marge en décidant de monter en mémoire vive les systèmes de fichier « /usr/src » et « /usr/obj » avec pour chacun une capacité maximale de 2 Go.

D’autres informations : Voici la durée des compilations de la base de current (en utilisant un noyau bsd.mp dans les deux cas) :

Méthode classique (sur un disque dur Sata 7200 RPM) : environ 67 min

Méthode utilisant le système de fichier « mfs » en mémoire vive : environ 52 min

Une baisse de près de 25 % (approximativement 22 % en fait) de la durée des compilations a donc été réalisée. Ce n’est pas certes extraordinaire mais ce n’est pas non plus négligeable !!

La fin

Nous éditons le fichier « /etc/fstab » pour commenter les lignes concernant les sytèmes de fichier liés à « mfs » puis pour décommenter celles concernant les sytèmes de fichier liés à « /usr/src » et « /usr/obj » pour enfin redémarrer le système.

Remarque : Lors des prochaines compilations (dans une semaine ?!), il nous faudra mettre à jour les sources. Pour la version CURRENT d'OpenBSD, cela donne :

# cd /home/src &&  cvs -q up -Pd