4.4. Configurer l'environnement

Configurez un bon environnement de travail en créant deux nouveaux fichiers de démarrage pour le shell bash. En tant qu'utilisateur lfs, exécutez la commande suivante pour créer un nouveau .bash_profile :

cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF

Lorsque vous êtes connecté en tant qu’utilisateur lfs ou transféré vers l'utilisateur lfs en utilisant une commande su avec l’option « - », le shell initial est un shell de connexion qui lit le fichier /etc/profile de l'hôte (contenant probablement quelques configurations et variables d'environnement) puis .bash_profile. La commande exec env -i.../bin/bash dans le fichier .bash_profile remplace le shell en cours par un nouveau shell ayant un environnement complètement vide en dehors des variables HOME, TERM, et PS1. Cela garantit qu'aucune variable d'environnement non souhaitée et potentiellement dangereuse provenant du système hôte ne fuit dans l'environnement de construction. La technique utilisée ici permet d'obtenir un environnement propre.

La nouvelle instance du shell est un shell sans connexion, qui ne lit donc pas et n'exécute pas les fichiers /etc/profile ou .bash_profile, mais plutôt le fichier .bashrc. Créez maintenant le fichier .bashrc :

cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/usr/bin
if [ ! -L /bin ]; then PATH=/bin:$PATH; fi
PATH=$LFS/tools/bin:$PATH
CONFIG_SITE=$LFS/usr/share/config.site
export LFS LC_ALL LFS_TGT PATH CONFIG_SITE
EOF

Voici la signification des paramètres du fichier .bashrc

set +h

La commande set +h désactive la fonction de hachage de bash. D'habitude, le hachage est une fonctionnalité utile : bash utilise une table de hachage pour se rappeler le chemin complet des fichiers exécutables et éviter d'avoir à chercher dans PATH à chaque fois qu'il doit trouver le même exécutable. Néanmoins, les nouveaux outils doivent être utilisés dès leur installation. En désactivant la fonction de hachage, le shell cherchera en permanence dans la variable PATH dès qu'un programme est exécuté. Ainsi, le shell trouvera les nouveaux outils compilés dans $LFS/tools/bin dès qu'ils seront disponibles et sans se rappeler la version précédente du même programme fourni par la distribution hôte, dans /usr/bin ou /bin.

umask 022

Configurer le masque de création de fichier (umask) à 022 garantit que les nouveaux fichiers et répertoires créés sont modifiables uniquement par leurs propriétaires, mais qu’ils restent lisibles et exécutables par tout le monde (en supposant que l'appel système open(2) utilise les modes par défaut, les nouveaux fichiers finiront avec les droits 644 et les répertoires avec les droits 755).

LFS=/mnt/lfs

La variable LFS doit être configurée avec le point de montage choisi.

LC_ALL=POSIX

La variable LC_ALL contrôle les paramètres linguistiques de certains programmes pour que leurs messages suivent les conventions du pays spécifié. Définir LC_ALL à « POSIX » ou « C » (les deux étant équivalents) garantit que tout fonctionnera comme prévu dans l'environnement de compilation croisée.

LFS_TGT=$(uname -m)-lfs-linux-gnu

La variable LFS_TGT initialise une description de machine personnalisée mais compatible lors de la construction de notre compilateur croisé, de notre éditeur de liens et lors de la compilation croisée de notre chaîne de compilation temporaire. Vous trouverez plus d'informations dans la Remarques techniques sur la chaîne de compilation.

PATH=/usr/bin

De nombreuses distributions récentes de Linux fusionnent /bin et /usr/bin. Lorsque c'est le cas, il vaut mieux paramétrer la variable PATH standard sur /usr/bin pour l'environnement Chapitre 6. Lorsque ce n'est pas le cas, la ligne suivante ajoute /bin au chemin de recherche.

if [ ! -L /bin ]; then PATH=/bin:$PATH; fi

Si /bin n'est pas un lien symbolique, il doit être ajouté à la variable PATH.

PATH=$LFS/tools/bin:$PATH

En plaçant $LFS/tools/bin au début du PATH standard, le compilateur croisé installé au début du Chapitre 5 est repéré par le shell immédiatement après son installation. Ceci, combiné à la désactivation du hachage, limite le risque que le compilateur de l'hôte ne soit utilisé à la place du compilateur croisé.

CONFIG_SITE=$LFS/usr/share/config.site

Dans le Chapitre 5 et le Chapitre 6, si cette variable n'est pas initialisée, les scripts configure peuvent essayer de charger des bouts de configuration de certaines distributions dans /usr/share/config.site sur le système hôte. Changer ce chemin permet d'éviter une contamination potentielle par l'hôte.

export ...

Bien que les commandes précédentes aient configuré certaines variables, pour les rendre visibles dans les sous-shells nous les exportons.

[Important]

Important

Plusieurs distributions commerciales ajoutent une instance non documentée de /etc/bash.bashrc à l'initialisation de bash. Ce fichier peut modifier l'environnement de l'utilisateur lfs d'une manière qui peut affecter la construction de paquets critiques de LFS. Pour vous assurer que l'environnement de l'utilisateur lfs est propre, vérifiez la présence de /etc/bash.bashrc et, s'il est présent, déplacez-le ailleurs. En tant qu'utilisateur root, exécutez la commande :

[ ! -e /etc/bash.bashrc ] || mv -v /etc/bash.bashrc /etc/bash.bashrc.NOUSE

Lorsque l'utilisateur lfs n'est plus nécessaire (au début du Chapitre 7), vous pouvez restaurer /etc/bash.bashrc (si vous le souhaitez).

Notez que le paquet Bash de LFS que nous construisons dans la Section 8.36, « Bash-5.2.32 » n'est pas configuré pour charger ou exécuter /etc/bash.bashrc, rendant ce fichier sur un système LFS complet.

Pour de nombreux systèmes modernes avec plusieurs processeurs (ou cœurs) le temps de compilation pour un paquet peut être réduit en effectuant un « make parallèle » en disant au programme make combien de processeurs sont disponibles via une option de la ligne de commande ou une variable d'environnement. Par exemple, un processeur Intel Core i9-13900K a 8 cœurs P (performance) et 16 cœurs E (efficacité) et un cœur P peut faire tourner simultanément deux fils d'exécution donc chaque cœur P est modélisé par deux cœurs logiques pour la noyau Linux. Il y a donc 32 cœurs logiques au total. Une manière simple d'utiliser tous ces cœurs logiques est de permettre à make de démarrer 32 tâches de construction. Vous pouvez le faire en passant l'option -j32 à make :

make -j32

Ou en indiquant la variable d'environnement MAKEFLAGS dont le contenu sera automatiquement utilisé par make comme s'il s'agissait d'options de la ligne de commande :

export MAKEFLAGS=-j32
[Important]

Important

Ne passez jamais l'option -j sans un nombre à make et n'indiquez pas cette option dans MAKEFLAGS. Cela premettra à make de démarrer un nombre de tâche infini et causera des problèmes de stabilité sur le système.

Pour utiliser tous les cœurs logiques disponibles pour construire les paquets dans Chapitre 5 et Chapitre 6, configurez maintenant MAKEFLAGS dans .bashrc :

cat >> ~/.bashrc << "EOF"
export MAKEFLAGS=-j$(nproc)
EOF

Remplacez $(nproc) par le nombre de cœurs logiques que vous voulez utiliser si vous ne voulez pas utiliser tous les cœurs logiques.

Enfin, pour avoir un environnement complètement préparé pour la construction des outils temporaires, forcez le shell bash à lire le profil de l'utilisateur tout juste créé :

source ~/.bash_profile