8.5.1. Installation de Glibc
Certains programmes de Glibc utilisent le répertoire non conforme
au FHS /var/db
pour stocker leurs
données d'exécution. Appliquez le correctif suivant pour que ces
programmes stockent leurs données à des emplacements conformes au
FHS :
patch -Np1 -i ../glibc-2.39-fhs-1.patch
La documentation de Glibc recommande de construire Glibc dans un
répertoire de construction dédié :
mkdir -v build
cd build
Assurez-vous que les utilitaires ldconfig et sln s’installent dans le
répertoire /usr/sbin
:
echo "rootsbindir=/usr/sbin" > configparms
Préparez la compilation de Glibc :
../configure --prefix=/usr \
--disable-werror \
--enable-kernel=4.19 \
--enable-stack-protector=strong \
--disable-nscd \
libc_cv_slibdir=/usr/lib
Voici la signification des options de
configuration :
-
--disable-werror
-
Désactive l'option -Werror passée à GCC. Ceci est nécessaire
pour lancer la suite de tests.
-
--enable-kernel=4.19
-
Indique au système de construction que cette Glibc peut être
utilisée avec les noyaux aussi vieux que 4.19 (maximum). Cela
permet de générer des contournements au cas où on ne peut pas
utiliser un appel système introduit dans une version
ultérieure.
-
--enable-stack-protector=strong
-
Cette option améliore la sécurité du système en ajoutant du
code supplémentaire pour vérifier les dépassements de tampon,
comme dans les attaques par dépassement de pile. Remarquez
que Glibc remplace toujours la valeur par défaut de GCC, donc
cette option est nécessaire, même si nous avons déjà spécifié
l'option --enable-default-ssp
pour GCC.
-
--disable-nscd
-
Ne pas construire le démon de cache de service de nom qui
n'est plus utilisé.
-
libc_cv_slibdir=/usr/lib
-
Indique la bibliothèque adaptée pour chaque système. Nous ne
voulons pas utiliser lib64.
Compilez le paquet :
make
Important
Dans cette section, la suite de tests de Glibc est considérée
comme critique. Ne l’ignorez sous aucun prétexte.
En général, quelques tests ne réussissent pas, mais vous pouvez le
plus souvent ignorer les erreurs listées ci-dessous.
make check
Vous verrez probablement quelques erreurs lors des tests. La suite
de tests de Glibc est quelque peu dépendante du système hôte. Vous
pouvez généralement ignorer quelques erreurs parmi les plus de
5 000 tests. Voici une liste des problèmes les plus
fréquents dans les versions récentes de LFS :
-
io/tst-lchmod est
connu pour échouer dans l'environnement chroot de LFS.
-
Certains tests, par exemple nss/tst-nss-files-hosts-multi et
nptl/tst-thread-affinity* sont
connus pour échouer à cause d'un délai d'attente dépassé
(surtout quand le système est assez lent ou exécute la suite
de tests avec plusieurs tâches make en parallèle). Ces tests
peuvent être identifiés avec :
grep "Timed out" -l $(find -name \*.out)
Il est possible de relancer un test unique avec un plus grand
délai d'attente avec TIMEOUTFACTOR=<factor>
make test
t=<nom du
test>
. Par exemple,
TIMEOUTFACTOR=10 make test
t=nss/tst-nss-files-hosts-multi relancera
nss/tst-nss-files-hosts-multi avec
dix fois plus de temps que l'original.
-
De plus, certains tests peuvent échouer avec un modèle de CPU
assez ancien (par exemple elf/tst-cpu-features-cpuinfo) ou
une version du noyau hôte assez ancienne (par exemple
stdlib/tst-arc4random-thread).
Bien que ce ne soit qu'un simple message, l'étape d'installation de
Glibc indiquera l'absence de /etc/ld.so.conf
. Supprimez ce message
d'avertissement avec :
touch /etc/ld.so.conf
Corrigez le Makefile généré pour éviter un test de cohérence
obsolète qui échoue avec une configuration moderne de Glibc :
sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile
Important
Si vous mettez à jour Glibc vers une nouvelle version mineure
(par exemple, de Glibc-2.36 à Glibc-2.39) sur un système LFS qui
tourne, vous devez prendre des précautions supplémentaires pour
éviter de casser votre système :
-
Mettre à jour Glibc sur un système LFS avant 11.0
(exclusif) n'est pas pris en charge. Reconstruisez LFS si
vous avez un système LFS aussi vieux et que vous avez
besoin d'une nouvelle Glibc.
-
Si vous mettez à jour depuis un système LFS avant 12.0
(exclusif), installez Libxcrypt en suivant Section 8.26,
« Libxcrypt-4.4.36. ». En plus d'une
installation de Libxcrypt
normale, vous DEVEZ suivre la
note dans la section Libxcrypt pour installer libcrypt.so.1*
(ce qui remplace
libcrypt.so.1
de
l'installation de Glibc précédente).
-
Ssi vous mettez à jour depuis un système LFS avant 12.1
(exclusif), supprimez le programme nscd :
rm -f /usr/sbin/nscd
Si ce système (avant LFS 12.1, exclusif) est basé sur
Systemd, il est également nécessaire de désactiver et
d'arrêter le service nscd maintenant :
systemctl disable --now nscd
-
Mettez à jour le noyau et redémarrez s'il est plus vieux
que 4.19 (vérifiez la version actuelle avec uname -r) ou si vous
voulez quand même le mettre à jour, en suivant Section 10.3,
« Linux-6.7.4. »
-
Mettez à jour les en-têtes de l'API du noyau s'il est plus
vieux que 4.19 (vérifiez la version actuelle avec
cat
/usr/include/linux/version.h) ou si vous
voulez mettre à jour quand même, en suivant Section 5.4,
« Linux-6.7.4 API Headers » (mais en
supprimant $LFS
de la commande
cp).
-
Effectuez une installation DESTDIR
et mettez à jour les bibliothèques
Glibc partagées sur le système avec une seule commande
install :
make DESTDIR=$PWD/dest install
install -vm755 dest/usr/lib/*.so.* /usr/lib
Il est impératif de suivre à la lettre ces étapes à moins de
comprendre complètement ce que vous faites. Toute déviation inattendue peut rendre le système
complètement instable. VOUS ÊTES PRÉVENU.
Continuez ensuite à exécutez la commande make install, la commande
sed pour
/usr/bin/ldd
et les commandes pour
installer les paramètres linguistiques. Une fois qu'elles ont
fini, redémarrez le système immédiatement.
Installez le paquet :
make install
Corrigez le chemin codé en dur vers le chargeur d'exécutable dans
le script ldd :
sed '/RTLDLIST=/s@/usr@@g' -i /usr/bin/ldd
Ensuite, installez les locales qui permettent à votre système de
répondre dans une langue différente. Aucune n'est indispensable,
mais si certaines sont absentes, les suites de test des futurs
paquets peuvent sauter des tests importants.
Vous pouvez installer les locales individuelles en utilisant le
programme localedef.
Par exemple, la seconde commande localedef ci-dessous combine la
définition de la locale indépendante du codage /usr/share/i18n/locales/cs_CZ
avec la définition
de la page de codes /usr/share/i18n/charmaps/UTF-8.gz
et ajoute le
résultat à la fin du fichier /usr/lib/locale/locale-archive
. Les instructions
suivantes installent les paramètres minimums des locales
nécessaires au déroulement optimal des tests :
mkdir -pv /usr/lib/locale
localedef -i C -f UTF-8 C.UTF-8
localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
localedef -i de_DE -f ISO-8859-1 de_DE
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
localedef -i de_DE -f UTF-8 de_DE.UTF-8
localedef -i el_GR -f ISO-8859-7 el_GR
localedef -i en_GB -f ISO-8859-1 en_GB
localedef -i en_GB -f UTF-8 en_GB.UTF-8
localedef -i en_HK -f ISO-8859-1 en_HK
localedef -i en_PH -f ISO-8859-1 en_PH
localedef -i en_US -f ISO-8859-1 en_US
localedef -i en_US -f UTF-8 en_US.UTF-8
localedef -i es_ES -f ISO-8859-15 es_ES@euro
localedef -i es_MX -f ISO-8859-1 es_MX
localedef -i fa_IR -f UTF-8 fa_IR
localedef -i fr_FR -f ISO-8859-1 fr_FR
localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
localedef -i is_IS -f ISO-8859-1 is_IS
localedef -i is_IS -f UTF-8 is_IS.UTF-8
localedef -i it_IT -f ISO-8859-1 it_IT
localedef -i it_IT -f ISO-8859-15 it_IT@euro
localedef -i it_IT -f UTF-8 it_IT.UTF-8
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true
localedef -i ja_JP -f UTF-8 ja_JP.UTF-8
localedef -i nl_NL@euro -f ISO-8859-15 nl_NL@euro
localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
localedef -i se_NO -f UTF-8 se_NO.UTF-8
localedef -i ta_IN -f UTF-8 ta_IN.UTF-8
localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
localedef -i zh_CN -f GB18030 zh_CN.GB18030
localedef -i zh_HK -f BIG5-HKSCS zh_HK.BIG5-HKSCS
localedef -i zh_TW -f UTF-8 zh_TW.UTF-8
En outre, installez la locale de votre pays, de votre langue et de
votre encodage de caractères.
Sinon, vous pouvez installer les locales listées dans le fichier
glibc-2.39/localedata/SUPPORTED
(il
inclut toutes les locales citées ci-dessus et bien plus) en une
seule fois avec la commande suivante (qui prend un certain
temps) :
make localedata/install-locales
Ensuite, utilisez la commande localedef pour créer et installer
les locales non listées dans le fichier glibc-2.39/localedata/SUPPORTED
dans le cas peu
probable où vous en auriez besoin. Par exemple, les deux paramètres
linguistiques suivants sont requis par certains tests plus tard
dans ce chapitre :
localedef -i C -f UTF-8 C.UTF-8
localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true
Note
Glibc utilise maintenant libidn2 lors de la résolution de noms de
domaines internationalisés. C'est une dépendance à l'exécution.
Si cette fonctionnalité est requise, les instructions pour
installer libidn2 se trouvent sur la
page libidn2 de BLFS.
8.5.2. Configuration de
Glibc
8.5.2.1. Ajout de nsswitch.conf
Le fichier /etc/nsswitch.conf
doit
être créé car les valeurs par défaut de Glibc ne fonctionnent pas
correctement dans un environnement en réseau.
Créez un nouveau fichier /etc/nsswitch.conf
en exécutant :
cat > /etc/nsswitch.conf << "EOF"
# Début de /etc/nsswitch.conf
passwd: files systemd
group: files systemd
shadow: files systemd
hosts: mymachines resolve [!UNAVAIL=return] files myhostname dns
networks: files
protocols: files
services: files
ethers: files
rpc: files
# Fin de /etc/nsswitch.conf
EOF
8.5.2.2. Ajout des données de fuseaux horaires
Installez et configurez les données de fuseaux horaires en
exécutant :
tar -xf ../../tzdata2024a.tar.gz
ZONEINFO=/usr/share/zoneinfo
mkdir -pv $ZONEINFO/{posix,right}
for tz in etcetera southamerica northamerica europe africa antarctica \
asia australasia backward; do
zic -L /dev/null -d $ZONEINFO ${tz}
zic -L /dev/null -d $ZONEINFO/posix ${tz}
zic -L leapseconds -d $ZONEINFO/right ${tz}
done
cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p America/New_York
unset ZONEINFO
Voici la signification de la commande
zic :
-
zic -L
/dev/null ...
-
Crée des fuseaux horaires posix sans secondes
intercalaires. Par convention, on le met dans zoneinfo
et dans zoneinfo/posix
. Il faut indiquer les
fuseaux horaires POSIX dans zoneinfo
, sinon plusieurs suites de tests
renverront des erreurs. Sur un système embarqué, où il y a
peu de place et vous ne souhaitez pas mettre à jour les
fuseaux horaires, vous pouvez économiser 1,9 Mo en
n'utilisant pas le répertoire posix
, mais certaines applications ou
suites de tests pourraient échouer.
-
zic -L
leapseconds ...
-
Crée les fuseaux horaires adaptés incluant les secondes
intercalaires. Sur un système embarqué, où il y a peu de
place et vous ne souhaitez pas mettre à jour les fuseaux
horaires, ou si vous ne trouvez pas important d’avoir la
bonne heure, vous pouvez économiser 1,9 Mo en ne
mettant pas de répertoire right
.
-
zic ... -p
...
-
Crée le fichier posixrules
.
Nous utilisons New York car POSIX exige que les règles de
l’heure d’été respectent les règles américaines.
Lancez ce script pour déterminer dans quel fuseau horaire vous
vous situez :
tzselect
Après quelques questions sur votre emplacement, le script
affichera le nom du fuseau horaire (par exemple Europe/Paris). D'autres fuseaux
horaires sont aussi listés dans le fichier /usr/share/zoneinfo
comme Canada/Eastern ou EST5EDT qui ne sont pas identifiés par
le script mais qui peuvent être utilisés.
Puis créez le fichier /etc/localtime
en exécutant :
ln -sfv /usr/share/zoneinfo/<xxx>
/etc/localtime
Remplacez <xxx>
par le nom du fuseau horaire sélectionné (par exemple
Europe/Paris).
8.5.2.3. Configuration du
chargeur dynamique
Par défaut, le chargeur dynamique (/lib/ld-linux.so.2
) cherche dans /usr/lib
les bibliothèques partagées
nécessaires aux programmes lors de leur exécution. Néanmoins,
s'il existe des bibliothèques dans d'autres répertoires que
/usr/lib
, leur emplacement doit
être ajouté dans le fichier /etc/ld.so.conf
pour que le chargeur dynamique
les trouve. /usr/local/lib
et
/opt/lib
sont deux répertoires qui
contiennent des bibliothèques supplémentaires, donc ajoutez-les
au chemin de recherche du chargeur dynamique.
Créez un nouveau fichier /etc/ld.so.conf
en exécutant ce qui suit :
cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib
EOF
Si vous le désirez, le chargeur dynamique peut également chercher
un répertoire et inclure le contenu des fichiers qui s'y
trouvent. Les fichiers de ce répertoire include sont en général
constitués d'une ligne spécifiant le chemin vers la bibliothèque
désirée. Pour ajouter cette possibilité, exécutez les commandes
suivantes :
cat >> /etc/ld.so.conf << "EOF"
# Add an include directory
include /etc/ld.so.conf.d/*.conf
EOF
mkdir -pv /etc/ld.so.conf.d