8.5.1. Installation of Glibc
Noen av Glibc programmene bruker ikke-FHS kompatible /var/db
mappen til å lagre kjøretidsdataene i.
Bruk følgende oppdatering for å forsikre om at slike programmer
lagrer kjøretidsdataene deres på de FHS kompatible stedene:
patch -Np1 -i ../glibc-2.41-fhs-1.patch
Glibc dokumentasjonen anbefaler å bygge Glibc i en dedikert
byggemappe:
mkdir -v build
cd build
Sørg for at ldconfig
og sln verktøyene vil
bli installert i /usr/sbin
:
echo "rootsbindir=/usr/sbin" > configparms
Forbered Glibc for kompilering:
../configure --prefix=/usr \
--disable-werror \
--enable-kernel=5.4 \
--enable-stack-protector=strong \
--disable-nscd \
libc_cv_slibdir=/usr/lib
Betydningen av konfigureringsalternativene:
-
--disable-werror
-
Dette alternativet deaktiverer alternativet -Werror sendt til
GCC. Dette er nødvendig for å kjøre testpakken.
-
--enable-kernel=5.4
-
Dette alternativet forteller byggesystemet at denne glibc kan
brukes med kjerner så gamle som 5.4 . Dette betyr å generere
løsninger i tilfelle et systemanrop introdusert i en senere
versjon ikke kan brukes.
-
--enable-stack-protector=strong
-
Dette alternativet øker systemsikkerheten ved å legge til
ekstra kode for å se etter bufferoverflyt "buffer overflows",
for eksempel stabel (stack) knusende angrep. Merk at Glibc
alltid eksplisitt overstyrer standarden til GCC, så dette
alternativet er fortsatt nødvendig selv om vi har allerede
spesifisert --enable-default-ssp
for GCC.
-
--disable-nscd
-
Ikke bygg navnetjenesten cache daemon som ikke er brukt
lenger.
-
libc_cv_slibdir=/usr/lib
-
Denne variabelen setter riktig bibliotek for alle systemer.
Vi ønsker ikke at lib64 skal brukes.
Kompiler pakken:
make
Viktig
I denne delen anses testpakken for Glibc som kritisk. Ikke hopp
over den under noen omstendigheter.
Vanligvis består ikke noen få tester. Testfeilene som er oppført
nedenfor er vanligvis trygge å ignorere.
make check
Du kan se noen testfeil. Glibc testpakken er noe avhengig av
vertssystemet. Noen få feil ut av over 6000 tester kan generelt
ignoreres. Dette er en liste over de vanligste problemene som er
sett for nyere versjoner av LFS:
-
io/tst-lchmod er kjent
for å mislykkes i LFS chroot miljøet.
-
Noen tester, for eksempel nss/tst-nss-files-hosts-multi og
nptl/tst-thread-affinity* er kjent
for å mislykkes på grunn av et tidsavbrudd (spesielt når
systemet er relativt sakte og/eller kjører testpakken med
flere parallelle make jobber). Disse testene kan
identifiseres med:
grep "Timed out" $(find -name \*.out)
Det er mulig å kjøre en enkelt test på nytt med større
tidsavbrudd med TIMEOUTFACTOR=<factor>
make test
t=<test
name>
. For eksempel,
TIMEOUTFACTOR=10 make test
t=nss/tst-nss-files-hosts-multi vil kjøre på
nytt nss/tst-nss-files-hosts-multi med
ti ganger det opprinnelige tidsavbruddet.
-
I tillegg kan noen tester mislykkes med en relativt gammel
CPU modell (For eksempel elf/tst-cpu-features-cpuinfo)
eller vertskjerne versjon (for eksempel stdlib/tst-arc4random-thread).
Selv om det er en ufarlig melding, vil installasjonsstadiet til
Glibc klage på fravær av /etc/ld.so.conf
. Forhindre denne advarselen med:
touch /etc/ld.so.conf
Fiks Makefile for å hoppe over en utdatert tilregnlighetssjekk som
mislykkes med en moderne Glibc-konfigurasjon:
sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile
Viktig
Hvis du oppgraderer Glibc til en ny mindre versjon (for eksempel
fra Glibc-2.36 to Glibc-2.41) på et kjørende LFS system, må du ta
noen ekstra forholdsregler for å unngå å ødelegge systemet:
-
Oppgradering av Glibc på et LFS system før 11.0
(eksklusivt) er ikke støttet. Bygg LFS på nytt hvis du
kjører et så gammelt LFS system, men du trenger en nyere
Glibc.
-
Hvis du oppgraderer på et LFS system før 12.0 (eksklusivt),
installer Libxcrypt med å
følge Seksjon 8.27,
«Libxcrypt-4.4.38» I tillegg til en normal Libxcrypt installasjon, du MÅ følge notatet i Libxcrypt delen for å
installere libcrypt.so.1*
(ved å erstatte libcrypt.so.1
fra den tidligere Glibc installasjonen).
-
Hvis du oppgraderer på et LFS-system før 12.1 (eksklusivt),
fjern nscd
programmet:
rm -f /usr/sbin/nscd
Hvis dette systemet (før LFS 12.1, eksklusivt) er basert på
Systemd, er det også nødvendig å deaktivere og stoppe
nscd
tjenesten nå:
systemctl disable --now nscd
-
Oppgrader kjernen og start på nytt hvis den er eldre enn
5.4 (sjekk gjeldende versjon med uname -r) eller hvis du
vil oppgradere den likevel, følg Seksjon 10.3, «Linux-6.13.4»
-
Oppgrader kjerne API deklarasjonene hvis de er eldre enn
5.4 (sjekk gjeldende versjon med cat
/usr/include/linux/version.h) eller hvis du
vil oppgradere den likevel, følg Seksjon 5.4,
«Linux-6.13.4 API Deklarasjoner» (men fjern
$LFS
fra cp kommandoen).
-
Utfør en DESTDIR
installasjon og
oppgrader Glibc delte biblioteker på systemet ved hjelp av
en enkelt install kommando:
make DESTDIR=$PWD/dest install
install -vm755 dest/usr/lib/*.so.* /usr/lib
Det er viktig å strengt følge disse trinnene ovenfor med mindre
du forstår helt hva du gjør. Ethvert
uventet avvik kan gjøre systemet helt ubrukelig. DU ER
ADVART.
Fortsett deretter å kjøre make
install kommandoen, sed kommandoen mot /usr/bin/ldd
, og kommandoene som skal
installere lokalitetene. Når de er ferdige, start systemet på
nytt med en gang.
Når systemet har startet på nytt, hvis du kjører et LFS system
før 12.0 (eksklusivt) der GCC ikke ble bygget med --disable-fixincludes
alternativet,
flytt to GCC deklarasjoner til en bedre plassering og fjerne de
foreldede «fixed» kopier av Glibc deklarasjonene:
DIR=$(dirname $(gcc -print-libgcc-file-name))
[ -e $DIR/include/limits.h ] || mv $DIR/include{-fixed,}/limits.h
[ -e $DIR/include/syslimits.h ] || mv $DIR/include{-fixed,}/syslimits.h
rm -rfv $(dirname $(gcc -print-libgcc-file-name))/include-fixed/*
Installer pakken:
make install
Fiks en hardkodet bane til den kjørbare lasteren i ldd skriptet:
sed '/RTLDLIST=/s@/usr@@g' -i /usr/bin/ldd
Installer deretter lokalitetene som kan få systemet til å svare i
et annet språk. Ingen av disse stedene er påkrevd, men hvis noen av
dem mangler, vil testpakkene til noen pakker hoppe over viktige
testsaker.
Individuelle lokaliteter kan installeres ved å bruke localedef programmet. For
eksempel den andre localedef kommandoen nedenfor
kombinerer /usr/share/i18n/locales/cs_CZ
tegnsettuavhengig
lokalitetsdefinisjonen med /usr/share/i18n/charmaps/UTF-8.gz
tegnsett
definisjonen og legger resultatet til /usr/lib/locale/locale-archive
filen. Følgende
instruksjoner vil installere minimumssettet med lokaliteter som er
nødvendige for optimal dekning av tester:
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
Installer i tillegg lokaliteten for ditt eget land, språk og
tegnsett.
Alternativt kan du installere alle lokaliteter som er oppført i
glibc-2.41/localedata/SUPPORTED
filen
(den inkluderer alle lokaliteter oppført ovenfor og mange flere)
med en gang med denne tidkrevende kommandoen:
make localedata/install-locales
Bruk deretter localedef kommandoen for å lage
og installere lokaliteter som ikke er oppført i glibc-2.41/localedata/SUPPORTED
filen når du
trenger dem. For eksempel er følgende to lokaliteter nødvendig for
noen tester senere i dette kapittelet:
localedef -i C -f UTF-8 C.UTF-8
localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true
Notat
Glibc bruker nå libidn2 når den løser internasjonalisert
domenenavn. Dette er en kjøretids avhengighet. Hvis denne evnen
er nødvendig, er instruksjonene for installasjon av libidn2 i
BLFS libidn2 siden.
8.5.2. Konfigurere Glibc
8.5.2.1. Legge til nsswitch.conf
/etc/nsswitch.conf
filen må
opprettes fordi Glibc standardene ikke fungerer bra i et
nettverksmiljø
Opprett en ny fil /etc/nsswitch.conf
ved å kjøre følgende:
cat > /etc/nsswitch.conf << "EOF"
# Begin /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
# End /etc/nsswitch.conf
EOF
8.5.2.2. Legge til tidssonedata
Installer og sett opp tidssonedataene med følgende:
tar -xf ../../tzdata2025a.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 Europe/Oslo
unset ZONEINFO tz
Betydningen av zic kommandoene:
-
zic -L
/dev/null ...
-
Dette skaper posix tidssoner uten noen skuddsekunder. Det
er konvensjonelt å legge disse i både zoneinfo
og zoneinfo/posix
. Det er nødvendig for å
legge POSIX tidssonene i zoneinfo
, ellers vil forskjellige
testpakker rapportere feil. På et innebygd system, hvor
plass er stramt og du aldri har tenkt å oppdatere
tidssonene, kan du spare 1,9 MB ved å ikke bruke
posix
mappen, men noen
applikasjoner eller testpakker kan produsere noen feil.
-
zic -L
leapseconds ...
-
Dette skaper riktige tidssoner, inkludert skuddsekunder. På
en innebygd system, hvor det er trangt om plass og du ikke
har tenkt å oppdatere tidssonene noen gang, eller ikke bryr
deg om riktig tid, kan du spar 1,9 MB ved å utelate
right
mappen.
-
zic ... -p
...
-
Dette oppretter posixrules
filen. Vi bruker New York fordi POSIX krever at reglene for
sommertid er i samsvar med amerikanske regler.
En måte å bestemme den lokale tidssonen på er å kjøre følgende
skript:
tzselect
Etter å ha svart på noen spørsmål om lokaliteten, vil skriptet
skrive ut navnet på tidssonen (f.eks., America/Edmonton). Det er også noen
andre mulige tidssoner oppført i /usr/share/zoneinfo
som for eksempel
Canada/Eastern eller
EST5EDT som ikke
identifiseres av skriptet, men kan brukes.
Deretter oppretter du /etc/localtime
filen med å kjøre:
ln -sfv /usr/share/zoneinfo/<xxx>
/etc/localtime
Erstatt <xxx>
med
navnet på den valgte tidssonen (f.eks. Europe/Oslo).
8.5.2.3. Konfigurere den
dynamiske lasteren
Som standard den dynamiske lasteren (/lib/ld-linux.so.2
) søker gjennom /usr/lib
for dynamiske biblioteker som trengs
av programmer når de kjøres. Imidlertid, hvis det er biblioteker
i andre kataloger enn /usr/lib
, må
disse legges til /etc/ld.so.conf
filen for at den dynamiske lasteren skal finne dem. To kataloger
som er allment kjent å inneholde flere biblioteker er
/usr/local/lib
og /opt/lib
, så legg disse mappene til den
dynamiske lasterens søkebane.
Opprett en ny fil /etc/ld.so.conf
ved å kjøre følgende:
cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib
EOF
Om ønskelig kan den dynamiske lasteren også søke i en mappe og
inkludere innholdet i filene som finnes der. Vanligvis vil filene
i denne mappen inkludere en linje som spesifiserer ønsket
biblioteksti. For å legge til denne funksjonen, kjør følgende
kommandoer:
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