Linux From Scratch XIII: Instalando man-pages y glibc

En este post, sigo instalando cada paquete de Linux From Scratch desde el sistema temporal que he compilado anteriormente. Usaré los scripts para generar paquetes binarios que he publicado en mi anterior artículo. Esta vez le toca el turno a las páginas del manual y glibc, que tiene bastante chicha.

Las páginas del manual

Instalar las páginas del manual es trivial. No requiere compilar nada. Basta con descomprimir el paquete y hacer make install. Voy a hacerlo con los scripts anteriores para que me genere un paquete. Los comandos son los siguientes:

[~/lfs]$ sudo lfs man-pages-3.42
root:/# cd sources/
root:/sources# tar xvJf man-pages-3.42.tar.xz
root:/sources# cd man-pages-3.42
root:/sources/man-pages-3.42# make install
root:/sources/man-pages-3.42# exit
[~/lfs]$ sudo lfsinst man-pages-3.42.txz

Esto generará un paquete en el directorio inicial (en mi caso ~/lfs) y lo instalará en el sistema LFS.

Instalando glibc

La instalación de glibc, en cambio, es más complicada. Vayamos por partes. Primero voy a poner los comandos hasta la compilación y luego los comento.

[~/lfs]$ sudo lfs glibc-2.16.0
root:/# cd sources
root:/sources# tar xvJf glibc-2.16.0.tar.xz
root:/sources# cd glibc-2.16.0
root:/sources/glibc-2.16.0# sed -i 's##"rpc/types.h"#' sunrpc/rpc_clntout.c
root:/sources/glibc-2.16.0# sed -i '/test-installation.pl/d' Makefile
root:/sources/glibc-2.16.0# sed -i 's|@BASH@|/bin/bash|' elf/ldd.bash.in
root:/sources/glibc-2.16.0# patch -Np1 -i ../glibc-2.16.0-res_query_fix-1.patch
root:/sources/glibc-2.16.0# mkdir -v ../glibc-build
root:/sources/glibc-2.16.0# cd ../glibc-build
root:/sources/glibc-build# ../glibc-2.16.0/configure  \
>     --prefix=/usr          \
>     --disable-profile      \
>     --enable-add-ons       \
>     --enable-kernel=2.6.25 \
>     --libexecdir=/usr/lib/glibc
root:/sources/glibc-build# make

La primera linea simplemente lanza el script para crear el paquete glibc-2.16.0 y nos deja en un chroot dentro de nuestro LFS. A continuación, descomprimimos el paquete de código fuente y nos colocamos en el directorio que genera. Las lineas siguientes son para corregir varios errores que hay en el paquete. Para los tres primeros no hay parche, por eso hay que hacerlo con sed.

Lo siguiente es crear un directorio para compilar desde él, igual que habíamos hecho en el sistema temporal. Esto es porque la documentación de glibc recomienda hacerlo así. Una vez en el directorio, configuramos el código fuente y lo compilamos.

En esta parte del libro los tests son críticos, así que hay que pasarlos. Para poder examinar bien la salida de los tests, la redirigimos hacia un fichero, pero lo hacemos usando tee para que salga también en la pantalla. Después se pueden buscar los errores con un grep.

root:/sources/glibc-build# make -k check 2>&1 | tee glibc-check-log
root:/sources/glibc-build# grep Error glibc-check-log
make[1]: Target `check' not remade because of errors.
make[1]: Leaving directory `/sources/glibc-2.16.0'
make: *** [check] Error 2
root:/sources/glibc-build# grep Error glibc-check-log
make[2]: *** [/sources/glibc-build/stdio-common/test-vfprintf.out] Error 1
make[1]: *** [stdio-common/tests] Error 2
make[2]: [/sources/glibc-build/posix/annexc.out] Error 1 (ignored)
make[2]: [/sources/glibc-build/conform/run-conformtest.out] Error 1 (ignored)
make: *** [check] Error 2

Según el libro, es normal que fallen algunos tests. Hay una lista con los tests que suelen fallar. En mi caso, uno de los que han fallado, stdio-common/test-vfprintf, no está en la lista, lo cual me preocupa un poco, pero como veo aquí parece que es aceptable, o sea que voy a seguir así a ver si hay suerte. 🙂

Lo siguiente es instalar los ficheros. Aquí hay algunas cosas que hay que hacer a mano, como crear el ld.so.conf, copiar algunos ficheros que no se instalan por defecto y crear los locales necesarios para que otros paquetes puedan pasar sus tests.

root:/sources/glibc-build# touch /etc/ld.so.conf
root:/sources/glibc-build# make install
root:/sources/glibc-build# cp -v ../glibc-2.16.0/sunrpc/rpc/*.h /usr/include/rpc
root:/sources/glibc-build# cp -v ../glibc-2.16.0/sunrpc/rpcsvc/*.h /usr/include/rpcsvc
root:/sources/glibc-build# cp -v ../glibc-2.16.0/nis/rpcsvc/*.h /usr/include/rpcsvc
root:/sources/glibc-build# mkdir -pv /usr/lib/locale
root:/sources/glibc-build# localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
root:/sources/glibc-build# localedef -i de_DE -f ISO-8859-1 de_DE
root:/sources/glibc-build# localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
root:/sources/glibc-build# localedef -i de_DE -f UTF-8 de_DE.UTF-8
root:/sources/glibc-build# localedef -i en_GB -f UTF-8 en_GB.UTF-8
root:/sources/glibc-build# localedef -i en_HK -f ISO-8859-1 en_HK
root:/sources/glibc-build# localedef -i en_PH -f ISO-8859-1 en_PH
root:/sources/glibc-build# localedef -i en_US -f ISO-8859-1 en_US
root:/sources/glibc-build# localedef -i en_US -f UTF-8 en_US.UTF-8
root:/sources/glibc-build# localedef -i es_MX -f ISO-8859-1 es_MX
root:/sources/glibc-build# localedef -i fa_IR -f UTF-8 fa_IR
root:/sources/glibc-build# localedef -i fr_FR -f ISO-8859-1 fr_FR
root:/sources/glibc-build# localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
root:/sources/glibc-build# localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
root:/sources/glibc-build# localedef -i it_IT -f ISO-8859-1 it_IT
root:/sources/glibc-build# localedef -i it_IT -f UTF-8 it_IT.UTF-8
root:/sources/glibc-build# localedef -i ja_JP -f EUC-JP ja_JP
root:/sources/glibc-build# localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
root:/sources/glibc-build# localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
root:/sources/glibc-build# localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
root:/sources/glibc-build# localedef -i zh_CN -f GB18030 zh_CN.GB18030

Ahora hay que crear algunos ficheros de configuración que usa glibc e instalar la información de las zonas horarias con el comando zic.

root:/sources/glibc-build# 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
root:/sources/glibc-build# tar -xf ../tzdata2012e.tar.gz
root:/sources/glibc-build# ZONEINFO=/usr/share/zoneinfo
root:/sources/glibc-build# mkdir -pv $ZONEINFO/{posix,right} 
root:/sources/glibc-build# for tz in etcetera southamerica northamerica europe africa antarctica  \
>           asia australasia backward pacificnew solar87 solar88 solar89 \
>           systemv; do
>     zic -L /dev/null   -d $ZONEINFO       -y "sh yearistype.sh" ${tz} 
>     zic -L /dev/null   -d $ZONEINFO/posix -y "sh yearistype.sh" ${tz} 
>     zic -L leapseconds -d $ZONEINFO/right -y "sh yearistype.sh" ${tz}
> done
root:/sources/glibc-build# cp -v zone.tab iso3166.tab $ZONEINFO
root:/sources/glibc-build# zic -d $ZONEINFO -p America/New_York
root:/sources/glibc-build# unset ZONEINFO

En las últimas lineas es importante dejar puesto America/New_York, ya que es necesario para cumplir el estándar POSIX.

El siguiente paso es configurar nuestra zona horaria. La mía es Europe/Madrid. Si no sabéis la vuestra, lo mejor es usar el comando tzselect, que os hace una serie de preguntas y luego os la dice. Tendríais que cambiar Europe/Madrid en el siguiente comando.

root:/sources/glibc-build# cp -v --remove-destination /usr/share/zoneinfo/Europe/Madrid \
>     /etc/localtime

Y ahora toca configurar el cargador dinámico. Esto será facil.

root:/sources/glibc-build# cat > /etc/ld.so.conf << "EOF"
> # Begin /etc/ld.so.conf
> /usr/local/lib
> /opt/lib
> 
> # Add an include directory
> include /etc/ld.so.conf.d/*.conf
> 
> EOF
root:/sources/glibc-build# mkdir /etc/ld.so.conf.d

Listo. Sólo falta salir del chroot y dejar que el script cree el paquete y, luego, instalarlo. Tarda un rato tanto en generar el paquete como en instalarlo. No he puesto mensajes en los scripts, así que aunque parezca que no hace nada, paciencia, que está en ello. 🙂

root:/sources/glibc-build# exit
[~/lfs]$ sudo lfsinst glibc-2.16.0.txz

Y por ahora eso es todo. En el siguiente post empezaremos ajustando el toolchain antes de seguir compilando paquetes.

EOF

Anuncios