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