8.5.1. Instalação da Glibc
Alguns dos aplicativos Glibc usam o diretório não conforme com o
FHS /var/db
para armazenar os dados
em tempo de execução deles. Aplique o seguinte remendo para fazer
com que tais aplicativos armazenem os dados em tempo de execução
deles nos locais conformes com o FHS:
patch -Np1 -i ../glibc-2.39-fhs-1.patch
A documentação da Glibc recomenda construir a Glibc em um diretório
dedicado à construção:
mkdir -v build
cd build
Garanta que os utilitários ldconfig e sln serão instalados no
/usr/sbin
:
echo "rootsbindir=/usr/sbin" > configparms
Prepare a Glibc para compilação:
../configure --prefix=/usr \
--disable-werror \
--enable-kernel=4.19 \
--enable-stack-protector=strong \
--disable-nscd \
libc_cv_slibdir=/usr/lib
O significado das opções do configure:
-
--disable-werror
-
Essa opção desabilita a opção -Werror passada para o GCC.
Isso é necessário para executar a suíte de teste.
-
--enable-kernel=4.19
-
Essa opção diz ao sistema de construção que esta Glibc
possivelmente seja usada com núcleos tão antigos quanto 4.19.
Isso significa que a geração de contornos, no caso de uma
chamada de sistema introduzida em uma versão posterior, não
pode ser usada.
-
--enable-stack-protector=strong
-
Essa opção aumenta a segurança do sistema adicionando código
extra para verificar estouros de buffer, como ataques de
esmagamento de pilha. Observe que a Glibc sempre substitui
explicitamente o padrão do GCC, de forma que essa opção ainda
é necessária mesmo que já tenhamos especificado --enable-default-ssp
para GCC.
-
--disable-nscd
-
Não construa o processo de segundo plano de armazenamento
temporário do serviço de nomes, o qual não mais é usado.
-
libc_cv_slibdir=/usr/lib
-
Essa variável configura a biblioteca correta para todos os
sistemas. Nós não queremos que a lib64 seja usada.
Compile o pacote:
make
Importante
Nesta seção, a suíte de teste para a Glibc é considerada crítica.
Não pule-a sob qualquer circunstância.
Geralmente uns poucos testes não passam. As falhas de teste
listadas abaixo usualmente são seguras ignorar.
make check
Você possivelmente veja algumas falhas de teste. A suíte de teste
da Glibc é de alguma forma dependente do sistema anfitrião. Umas
poucas falhas saídas de mais que 5.000 testes geralmente podem
ignoradas. Esta é uma lista dos problemas mais comuns vistos para
versões recentes do LFS:
-
io/tst-lchmod é
conhecido por falhar no ambiente chroot do LFS.
-
Alguns testes, por exemplo nss/tst-nss-files-hosts-multi e
nptl/tst-thread-affinity* são
conhecidos por falharem devido a um tempo limite
(especialmente quando o sistema está relativamente lento e
(ou) executando a suíte de teste com várias tarefas make
paralelas). Esses testes podem ser identificados com:
grep "Timed out" -l $(find -name \*.out)
É possível reexecutar um teste com tempo limite aumentado com
TIMEOUTFACTOR=<fator>
make test
t=<nome do
teste>
. Por exemplo,
TIMEOUTFACTOR=10 make test
t=nss/tst-nss-files-hosts-multi reexecutará
nss/tst-nss-files-hosts-multi com
dez vezes o tempo limite original.
-
Além disso, alguns testes possivelmente falhem com um modelo
de CPU relativamente antigo (por exemplo elf/tst-cpu-features-cpuinfo) ou
versão do núcleo do anfitrião (por exemplo stdlib/tst-arc4random-thread).
Mesmo sendo uma mensagem inofensiva, o estágio de instalação da
Glibc reclamará acerca da ausência do /etc/ld.so.conf
. Evite esse aviso com:
touch /etc/ld.so.conf
Corrija o Makefile para pular uma verificação de sanidade
desatualizada que falha com uma configuração moderna da Glibc:
sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile
Importante
Se atualizar a Glibc para uma nova versão secundária (por
exemplo, da Glibc-2.36 para a Glibc-2.39) em um sistema LFS em
execução, [então] você precisará tomar algumas precauções extras
para evitar quebrar o sistema:
-
Atualizar a Glibc em um sistema LFS anterior ao 11.0
(exclusivo) não é suportado. Reconstrua o LFS se você
estiver executando um sistema LFS antigo, mas precisar de
uma Glibc mais recente.
-
Se atualizar em um sistema LFS anterior a 12.0 (exclusivo),
[então] instale a Libxcrypt seguindo a Seção 8.26,
“Libxcrypt-4.4.36.” Além de uma instalação normal da
Libxcrypt, você DEVE seguir a observação na seção
Libxcrypt para instalar a libcrypt.so.1*
(substituindo libcrypt.so.1
originária da instalação
anterior da Glibc).
-
Se atualizar em um sistema LFS anterior ao 12.1
(exclusivo), [então] remova o aplicativo nscd:
rm -f /usr/sbin/nscd
Se esse sistema (anterior ao LFS 12.1, exclusivo) for
baseado em Systemd, [então] também é necessário desabilitar
e parar o serviço nscd agora:
systemctl disable --now nscd
-
Atualize o núcleo e reinicialize se ele for mais antigo que
4.19 (verifique a versão atual com uname -r) ou se quiser
atualizá-lo mesmo assim, seguindo a Seção 10.3, “Linux-6.7.4.”
-
Atualize os cabeçalhos da API do núcleo se forem mais
antigos que 4.19 (verifique a versão atual com cat
/usr/include/linux/version.h) ou se quiser
atualizá-los mesmo assim, seguindo a Seção 5.4,
“Cabeçalhos da API do Linux-6.7.4” (mas removendo
$LFS
do comando cp).
-
Realize uma instalação DESTDIR
e
atualize as bibliotecas compartilhadas da Glibc no sistema
usando um comando simples install:
make DESTDIR=$PWD/dest install
install -vm755 dest/usr/lib/*.so.* /usr/lib
É obrigatório seguir rigorosamente essas etapas acima, a menos
que você entenda completamente o que está fazendo. Qualquer desvio inesperado possivelmente torne o
sistema completamente desusável. VOCÊ ESTÁ
AVISADO(A).
Em seguida, continue a executar o comando make install, o comando
sed contra o
/usr/bin/ldd
e os comandos para
instalar as localidades. Assim que estiverem finalizados,
reinicialize o sistema imediatamente.
Instale o pacote:
make install
Corrija um caminho codificado rigidamente para o carregador de
executável no script ldd:
sed '/RTLDLIST=/s@/usr@@g' -i /usr/bin/ldd
Em seguida, instale os locales que podem fazer o sistema responder
em um idioma diferente. Nenhum desses locales é exigido, mas se
alguns deles estiverem ausentes, [então] as suítes de teste de
alguns pacotes pularão casos de teste importantes.
Locales individuais podem ser instalados usando o aplicativo
localedef. Por
exemplo, o segundo comando localedef abaixo combina a
definição de locale independente do conjunto de caracteres
/usr/share/i18n/locales/cs_CZ
com a
definição de mapa de caracteres /usr/share/i18n/charmaps/UTF-8.gz
e adiciona o
resultado ao arquivo /usr/lib/locale/locale-archive
. As seguintes
instruções instalarão o conjunto mínimo de locales necessário para
a cobertura ótima de testes:
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
Adicionalmente, instale o locale para seu próprio país, idioma e
conjunto de caracteres.
Alternativamente, instale todos os locales listados no arquivo
glibc-2.39/localedata/SUPPORTED
(inclui cada locale listado acima e muitos mais) de uma vez com o
seguinte comando consumidor de tempo:
make localedata/install-locales
Então, use o comando localedef para criar e instalar
locales não listados no arquivo glibc-2.39/localedata/SUPPORTED
quando você
precisar deles. Por exemplo, os seguintes dois locales são
necessários para alguns testes posteriormente neste capítulo:
localedef -i C -f UTF-8 C.UTF-8
localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true
Nota
A Glibc agora usa a libidn2 quando resolver nomes
internacionalizados de domínio. Essa é uma dependência de tempo
de execução. Se essa capacidade for necessária, [então] as
instruções para instalar a libidn2 estão na
página da libidn2 do BLFS.
8.5.2. Configurando a
Glibc
8.5.2.1. Adicionando o nsswitch.conf
O arquivo /etc/nsswitch.conf
precisa ser criado, pois os padrões da Glibc não funcionam bem em
um ambiente de rede de comunicação.
Crie um novo arquivo /etc/nsswitch.conf
executando o seguinte:
cat > /etc/nsswitch.conf << "EOF"
# Começo /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
# Fim /etc/nsswitch.conf
EOF
8.5.2.2. Adicionando Dados de Fuso Horário
Instale e configure os dados de fuso horário com o seguinte:
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
O significado dos comandos zic:
-
zic -L
/dev/null ...
-
Isso cria fusos horários posix sem quaisquer segundos
bissextos. É convencional colocá-los em ambos zoneinfo
e zoneinfo/posix
. É necessário colocar os
fusos horários POSIX em zoneinfo
, do contrário várias suítes de
teste reportarão erros. Em um sistema embarcado, onde o
espaço é apertado e você não pretende nunca atualizar os
fusos horários, você poderia economizar 1,9 MB não usando o
diretório posix
, mas alguns
aplicativos ou suítes de teste poderiam produzir algumas
falhas.
-
zic -L
leapseconds ...
-
Isso cria fusos horários corretos, incluindo segundos
bissextos. Em um sistema embarcado, onde o espaço é
apertado e você não pretende nunca atualizar os fusos
horários ou se importa com a hora correta, você poderia
economizar 1,9 MB omitindo o diretório right
.
-
zic ... -p
...
-
Isso cria o arquivo posixrules
. Nós usamos New York, pois
POSIX exige que as regras de horário de verão estejam de
acordo com regras dos Estados Unidos da América do Norte.
Uma maneira para determinar o fuso horário local é a de executar
o seguinte script:
tzselect
Depois de responder à umas poucas perguntas a respeito do local,
o script retornará o nome do fuso horário (por exemplo,
America/Edmonton). Existem
também alguns outros possíveis fusos horários listados em
/usr/share/zoneinfo
, tais como
Canada/Eastern ou
EST5EDT que não são
identificados pelo script, mas podem ser usados.
Então crie o arquivo /etc/localtime
executando:
ln -sfv /usr/share/zoneinfo/<xxx>
/etc/localtime
Substitua <xxx>
pelo nome do fuso horário selecionado (por exemplo,
Canada/Eastern).
8.5.2.3. Configurando o
Carregador Dinâmico
Por padrão, o carregador dinâmico (/lib/ld-linux.so.2
) procura em /usr/lib
por bibliotecas dinâmicas que são
necessárias para aplicativos assim que são executados.
Entretanto, se existirem bibliotecas em outros diretórios
diferentes do /usr/lib
, [então]
esses precisam ser adicionados ao arquivo /etc/ld.so.conf
para a finalidade de que o
carregador dinâmico encontre elas. Dois diretórios que são
comumente conhecidos por conterem bibliotecas adicionais são
/usr/local/lib
e /opt/lib
; então adicione esses diretórios ao
caminho de busca do carregador dinâmico.
Crie um novo arquivo /etc/ld.so.conf
executando o seguinte:
cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib
EOF
Se desejado, o carregador dinâmico também pode pesquisar um
diretório e incluir o conteúdo de arquivos encontrados lá.
Geralmente os arquivos nesse diretório include são uma linha
especificando o caminho de biblioteca desejado. Para adicionar
essa capacidade, execute os seguintes comandos:
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