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.37-fhs-1.patch
Corrija um problema de segurança identificado pelo(a)
desenvolvedor(a):
sed '/width -=/s/workend - string/number_length/' \
-i stdio-common/vfprintf-process-arg.c
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=3.2 \
--enable-stack-protector=strong \
--with-headers=/usr/include \
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=3.2
-
Essa opção diz ao sistema de construção que esta Glibc
possivelmente seja usada com núcleos tão antigos quanto 3.2.
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 de sistema adicionando código
extra para verificar estouros de buffer, tais como ataques de
esmagamento de pilha.
-
--with-headers=/usr/include
-
Essa opção diz ao sistema de construção onde encontrar os
cabeçalhos da API do núcleo.
-
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.
-
misc/tst-ttyname é
conhecido por falhar no ambiente chroot do LFS.
-
O teste stdlib/tst-arc4random-thread é
conhecido por falhar se o núcleo do anfitrião for
relativamente antigo.
-
Alguns testes, por exemplo nss/tst-nss-files-hosts-multi, são
conhecidos por falharem em sistemas relativamente lentos
devido a um de tempo limite interno.
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
desnecessária que falha no ambiente parcial do LFS:
sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile
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
Instale o arquivo de configuração e diretório de tempo de execução
para o nscd:
cp -v ../nscd/nscd.conf /etc/nscd.conf
mkdir -pv /var/cache/nscd
Instale os arquivos de suporte do systemd para o nscd:
install -v -Dm644 ../nscd/nscd.tmpfiles /usr/lib/tmpfiles.d/nscd.conf
install -v -Dm644 ../nscd/nscd.service /usr/lib/systemd/system/nscd.service
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 POSIX -f UTF-8 C.UTF-8 2> /dev/null || true
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.37/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.37/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 POSIX -f UTF-8 C.UTF-8 2> /dev/null || true
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"
# Begin /etc/nsswitch.conf
passwd: files
group: files
shadow: files
hosts: files dns
networks: files
protocols: files
services: files
ethers: files
rpc: files
# End /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 ../../tzdata2022g.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