FreeBSD (3/3) Ports & optims

, par MiKaël Navarro

On s’attaque maintenant à ce qui fait la spécificité des systèmes *BSD, à savoir l’installation à partir des sources et les « Jails ».

Merci à Olivier <https://olivier.cochard.me/bidouill...> et aux hors séries n°29 & n°30 de Linux Mag (2007) qui m’ont servi de base pour cette doc…

Compilation des sources FreeBSD

Que l’on souhaite la dernière version de FreeBSD avec la pile TCP BBR et juste un OS optimisé pour son processeur :

  1. Télécharger les sources :
    # pkg install git
    # git clone -o freebsd https://git.freebsd.org/src.git -b releng/13.1 /usr/src
  2. Activation de CPUTYPE?=native :
    # cat > /etc/make.conf <<EOF
    CPUTYPE?=native
    KERNCONF=MYKERNEL
    WITH_META_MODE=yes
    WITH_DIRDEPS_BUILD=yes
    WITH_DIRDEPS_CACHE=yes
    WITHOUT_LLVM_ASSERTIONS=yes
    WITH_MALLOC_PRODUCTION=yes
    MALLOC_PRODUCTION=yes
    DEVELOPER=yes
    #WITHOUT_LIB32=yes
    #MODULES_OVERRIDE=linux acpi sound/sound sound/driver/dr1 ntfs
    EOF
  3. Déclaration d’un kernel spécifique :
    # cat >/usr/src/sys/i386/conf/MYKERNEL <<EOF
    include GENERIC
    ident           MYKERNEL
    options         TCPHPTS
    options         RATELIMIT
    makeoptions     WITH_EXTRA_TCP_STACKS=1
    options         KDB_UNATTENDED
    EOF
  4. Compilation et installation :
    # cd /usr/src
    # make -j2 buildworld buildkernel KERNCONF=MYKERNEL

    Bon après plus de 12h de compilation (sur mon vieux Dual-core) on peut installer le nouveau noyau !

    # make installkernel KERNCONF=MYKERNEL

    La suite n’est pas faisable directement, il nous faut redémarrer et passer en mode mono-utilisateur (option 2 dans le menu de boot, attention le clavier est en qwerty) :

    # shutdown -r now
    # fsck -p
    # mount -u /
    # mount -a -t ufs
    # swapon -a
    # adjkerntz -i
    # mergemaster -p
    # cd /usr/src/
    # make installworld KERNCONF=MYKERNEL
    # mergemaster
    # reboot

    On vérifie que le nouveau noyau est bien pris en compte : uname -v
    FreeBSD 13.1-RELEASE-p7 releng/13.1-n250182-00935d2e533c MYKERNEL

  5. Activation de la pile TCP BBR :
    # echo "net.inet.tcp.functions_default=bbr" >> /etc/sysctl.conf
    # sysrc kld_list+="filemon tcp_rack tcp_bbr"
    # kldload tcp_bbr && sysctl net.inet.tcp.functions_default=bbr
  • P.S. si vous avez besoin de (re)compiler un module / driver il n’est pas nécessaire de recompiler l’ensemble :
    # cd /usr/src/sys/modules/<module>/
    # make
    # make load

Les ports

Idem si on souhaite des ports compilés avec les optimisations de votre processeur :

  1. La première chose à faire est de récupérer / mettre à jour le catalogue des logiciels portés, pour cela la méthode classique / recommandée est d’utiliser Portsnap :
    # portsnap fetch
    # portsnap extract
    # portsnap update
  2. Ensuite l’installation d’un logiciel porté se fait sous root,

    ex. pour Enlightenment :

    # cd /usr/ports/x11-wm/enlightenment
    # make
    # make install
    # make clean
  3. Pour la mise-à-jour des logiciels portés, d’abord lister les logiciels portés périmés :
    # pkg version -v
    # pkg info

    Puis à l’aide de Portupgrade :

    # cd /usr/ports/ports-mgmt/portupgrade
    # make install clean
    # portupgrade -ai  # pour tout mettre à jour (3j de compil tout de même !)
    # portupgrade -R firefox  # pour màj qu'une seule application avec ses dépendances
    # portupgrade -PP gnome2  # pour éviter l’usage des logiciels portés et utiliser les versions pré-compilées

    P.S. penser à faire régulièrement le nettoyage dans les sources :

    # portsclean -C
    # portsclean -D

P.I. y-a aussi d’autres outils comme Portmanager ou encore Portmaster (conçu pour n’utiliser que les outils du système de "base" et ne dépendant d’aucun autre logiciel porté, il utilise les informations contenues dans /var/db/pkg/) pour vous faciliter la vie :

# cd /usr/ports/ports-mgmt/portmaster
# make install clean
# portmaster -L  # pour lister les logiciels installés et les mises à jour
# portmaster -a  # pour mettre à jour l’ensemble des logiciels portés
# portmaster -af  # en cas de problème, met à jour ou recompile tous les logiciels installés
# portmaster -P firefox  # pour màj qu'une seule application en privilégiant les versions pre-compilées
# portmaster -PP gnome2  # pour n’utiliser que les versions pré-compilées
# portmaster x11/terminology  # pour installer un nouveau logiciel porté

À suivre aussi l’outil Poudriere

Compatibilité Linux

FreeBSD offre une compatibilité binaire avec Linux, permettant d’installer / exécuter des applications Linux, sans avoir à les modifier.

  1. On commence par activer la compatibilité binaire avec Linux :
    # sysrc linux_enable=YES
    # service linux start

    Ceci changera les modules noyau nécessaires et montera les systèmes de fichiers attendus sous /compat/linux ; Suffisant pour faire fonctionner les binaires Linux statiques.

  2. Mais pour les binaires liés dynamiquement if faut que les bibliothèques dynamiques Linux soient installées. Pour cela on va installer la version pré-compilée de Cent OS 7 :
    # pkg install linux_base-c7
  3. Reste plus qu’à installer nos logiciels :
    # pkg install linux-opera

Une autre solution consiste à utiliser sysutils/debootstrap dans un « Jails ». Cela a pour avantage de disposer d’une distribution complète Debian ou Ubuntu.

Jails

Les environnements Jails (prisons) sont une amélioration et un remplacement des environnements chrootés. Ils permettent d’isoler des applications ou des piles entières avec leurs propres processus, systèmes de fichiers et utilisateurs, tout en utilisant le même noyau du système d’exploitation hôte. C’est semblable aux containers Dockers avec 13 ans d’avance !

  1. On commence par installer Ubuntu Bionic (18.04) (dernière à supporter les 32bits) :
    # pkg install debootstrap
    # debootstrap bionic /compat/ubuntu

    P.I. vous aurez des alertes durant la phase de configuration, généralement des warnings, mais tant que ça se termine par “Base system installed successfully” c’est okey ;)

  2. Déclarer les systèmes de fichier Linux dans /etc/fstab :
    devfs           /compat/ubuntu/dev      devfs           rw,late                      0       0
    tmpfs           /compat/ubuntu/dev/shm  tmpfs           rw,late,size=1g,mode=1777    0       0
    fdescfs         /compat/ubuntu/dev/fd   fdescfs         rw,late,linrdlnk             0       0
    linprocfs       /compat/ubuntu/proc     linprocfs       rw,late                      0       0
    linsysfs        /compat/ubuntu/sys      linsysfs        rw,late                      0       0

    Pour partager le répertoire /home et être capable de lancer des applications X11, rajouter :

    /tmp            /compat/ubuntu/tmp      nullfs          rw,late                      0       0
    /home           /compat/ubuntu/home     nullfs          rw,late                      0       0

    Et les monter : mount -al

  3. Et c’est tout ! Maintenant on peut chroot /compat/ubuntu /bin/bash et exécuter apt (ou tout autre commande) comme sur un Linux Ubuntu classique ;)
    # apt-get update
    # apt-get install aptitude
    # aptitude search …
    # aptitude install …
  • Si vous rencontrez des erreurs rsyslogd, enlevez-le : apt remove rsyslog
  • Il est peut être aussi nécessaire d’ajouter des dépôts dans /compat/ubuntu/etc/apt/sources.list :
    deb http://archive.ubuntu.com/ubuntu bionic main universe restricted multiverse
    deb http://security.ubuntu.com/ubuntu/ bionic-security universe multiverse restricted main
    deb http://archive.ubuntu.com/ubuntu bionic-backports universe multiverse restricted main
    deb http://archive.ubuntu.com/ubuntu bionic-updates universe multiverse restricted main
  • Démarrer sshd (service ssh start) afin d’y accéder avec un « vrai » login.
  • Le reste est de la conf des utilisateurs / groupes (avec les mêmes UIDs/GIDs que sur le système hôte), …