Linux From Scratch XVIII: e2fsprogs, shadow, coreutils, iana-etc y m4

En el último articulo de esta serie, he instalado algunos paquetes más de Linux From Scratch siguiendo con el capítulo 6 del libro. Después de ello, ha quedado todo preparado para instalar e2fsprogs, que es lo que voy a hacer en este artículo. Esta vez no se trata sólo de seguir las instrucciones del libro, como en la mayoría de los artículos anteriores, sino que hay alguna sorpresa.

Instalando e2fsprogs

El paquete e2fsprogs me ha dado problemas al pasar los tests que he tenido que corregir antes de continuar. Desde que he empezado la serie, he querido que mis posts se parezcan lo más posible a lo que he hecho realmente para instalar LFS, así que, en vez de poner de frente las instrucciones que instalan el paquete sin ningún problema, voy a contaros todos mis pasos tal y como los he ido haciendo. Por eso, si estáis siguiendo las instrucciones de mis artículo para instalaros Linux From Scratch, os recomiendo que leáis esta sección entera antes de empezar a lanzar comandos.

Para empezar, usamos el script para entrar en el chroot y descomprimir el paquete de código fuente.

[~/lfs]$ sudo lfs e2fsprogs-1.42.5
root:/# cd sources/
root:/sources# tar xvf e2fsprogs-1.42.5.tar.gz
root:/sources# cd e2fsprogs-1.42.5

Ahora, compilamos y pasamos los tests. Las dos primeras instrucciones las ponemos porque el paquete recomienda compilar en un directorio aparte.

root:/sources/e2fsprogs-1.42.5# mkdir -v build
root:/sources/e2fsprogs-1.42.5# cd build
root:/sources/e2fsprogs-1.42.5/build# ../configure --prefix=/usr         \
>              --with-root-prefix="" \
>              --enable-elf-shlibs   \
>              --disable-libblkid    \
>              --disable-libuuid     \
>              --disable-uuidd       \
>              --disable-fsck
root:/sources/e2fsprogs-1.42.5/build# make
root:/sources/e2fsprogs-1.42.5/build# make -k check

...

121 tests succeeded    5 tests failed
Tests failed: f_mmp f_mmp_garbage m_mmp t_mmp_1on t_mmp_2off 
make[1]: *** [test_post] Error 1
make[1]: Target `check' not remade because of errors.
make[1]: Leaving directory `/sources/e2fsprogs-1.42.5/build/tests'
make: *** [check-recursive] Error 1
make: Target `check' not remade because of errors.

Y ahora viene lo gracioso: han fallado los tests. Los 5 tests que han fallado comprueban una característica del sistema de ficheros ext3 que se llama MMP (Multiple Mount Protection), que sirve para evitar que un sistema de fichero falle si se monta en varios puntos a la vez o si se monta mientras se está chequeando la partición.

Como sospechaba que el problema podía venir por usar el script, que compila sobre un sistema de ficheros aufs, que está a su vez sobre un tmpfs, lo que hecho es probar a repetir todos los pasos haciendo varios cambios en el script para montar las particiones de otra manera. Al final he llegado a la conclusión de que no necesito modificar el script.

La solución es entrar en el chroot sin crear el paquete, para que todos los cambios sean permanentes y llegar hasta el punto en el que hay que pasar los tests. Una vez los tests pasen, salimos del chroot y volvemos a entrar, pero poniendo el nombre del paquete para que monte el sistema de ficheros aufs. En esas condiciones hacemos la instalación y creamos el paquete. Luego volvemos a entrar sin poner el nombre del paquete para poder borrar los restos que hemos dejado en el primer paso.

Es mejor hacerlo que contarlo, así que manos a la obra. Primero salimos del chroot que nos ha fallado y entramos en otro sin poner el nombre del paquete. Entonces, compilamos y lanzamos los tests.

root:/sources/e2fsprogs-1.42.5/build# exit
[~/lfs]$ sudo lfs
root:/# cd sources/
root:/sources# tar xvf e2fsprogs-1.42.5.tar.gz
root:/sources# cd e2fsprogs-1.42.5
root:/sources/e2fsprogs-1.42.5# mkdir -v build
root:/sources/e2fsprogs-1.42.5# cd build
root:/sources/e2fsprogs-1.42.5/build# ../configure --prefix=/usr         \
>              --with-root-prefix="" \
>              --enable-elf-shlibs   \
>              --disable-libblkid    \
>              --disable-libuuid     \
>              --disable-uuidd       \
>              --disable-fsck
root:/sources/e2fsprogs-1.42.5/build# make
root:/sources/e2fsprogs-1.42.5/build# make -k check
125 tests succeeded    0 tests failed
make[1]: Leaving directory `/sources/e2fsprogs-1.42.5/build/tests'

Ahora los tests sí que han pasado. Al haber entrado así en el chroot, todos los cambios que hemos hecho son permanentes, lo que significa que si salimos ahora mantenemos en resultado de la compilación en /sources/e2fsprogs-1.42.5. Este directorio habrá que borrarlo cuando hayamos terminado, pero por ahora nos permite salir del chroot y volver a entrar poniendo el nombre del paquete y tendremos todos nuestros ficheros ahí. O sea que podremos hacer el make install para instalarlos y dejar que el script cree el paquete.

root:/sources/e2fsprogs-1.42.5/build# exit
[~/lfs]$ sudo lfs e2fsprogs-1.42.5
root:/# cd sources/e2fsprogs-1.42.5/build/
root:/sources/e2fsprogs-1.42.5/build# make install

Todavía hay que hacer algunas cosas más para instalar este paquete. Según las instrucciones del libro, hay que instalar las librerías estáticas y darles permisos para poder borrar los símbolos más adelante.

root:/sources/e2fsprogs-1.42.5/build# make install-libs
root:/sources/e2fsprogs-1.42.5/build# chmod -v u+w /usr/lib/{libcom_err,libe2p,libext2fs,libss}.a

Ahora sólo falta instalar la documentación.

root:/sources/e2fsprogs-1.42.5/build# gunzip -v /usr/share/info/libext2fs.info.gz
root:/sources/e2fsprogs-1.42.5/build# install-info --dir-file=/usr/share/info/dir /usr/share/info/libext2fs.info
root:/sources/e2fsprogs-1.42.5/build# makeinfo -o doc/com_err.info ../lib/et/com_err.texinfo
root:/sources/e2fsprogs-1.42.5/build# install -v -m644 doc/com_err.info /usr/share/info
root:/sources/e2fsprogs-1.42.5/build# install-info --dir-file=/usr/share/info/dir /usr/share/info/com_err.info

Para generar el paquete, salimos del chroot como siempre, pero todavía tenemos algo más que hacer. Como los cambios que hemos hecho en el primer paso son permanentes, el código fuente descomprimido se ha quedado ahí. No ha entrado en el paquete binario que hemos generado porque el script se encarga de ignorarlo, pero está en nuestro directorio de código fuente de LFS. Lo que hay que hacer ahora es entrar otra vez sin poner el nombre del paquete y borrarlo junto con otro fichero que crea al pasar los tests y que tampoco necesitamos para nada.

root:/sources/e2fsprogs-1.42.5/build# exit
[~/lfs]$ sudo lfs
root:/# rm -rf sources/e2fsprogs-1.42.5
root:/# rm -rf run/blkid

Ahora sí que podemos salir del chroot e instalar el paquete que hemos generado.

root:/# exit
[~/lfs]$ sudo lfsinst e2fsprogs-1.42.5.txz

Mision cumplida. Ha ido todo bien y no ha quedado rastro del truco que hemos tenido que hacer.

Instalando shadow

El paquete shadow es el responsable de guardar las hashes de las contraseñas en el fichero /etc/shadow en vez de /etc/passwd para que los usuarios sin privilegios no tengan acceso a ellas y mejorar la seguridad del sistema. Para aumentar aún más la seguridad, el libro ofrece la alternativa de compilarlo con soporte para cracklib. En ese caso, habría que instalar el paquete cracklib primero. De momento no voy a hacer eso. Primero voy a instalarlo sin cracklib y más adelante ya se verá.

[~/lfs]$ sudo lfs shadow-4.1.5.1
root:/# cd sources/
root:/sources# tar xvf shadow-4.1.5.1.tar.bz2
root:/sources# cd shadow-4.1.5.1

En primer lugar hay que hacer una serie de cambios. Los dos primeros comandos desactivan la instalación del comando groups para aprovechar la versión que viene con coreutils. El segundo usa SHA-512 para encriptar las contraseñas en lugar de DES. Con esto se gana un poco de seguridad.

root:/sources/shadow-4.1.5.1# sed -i 's/groups$(EXEEXT) //' src/Makefile.in
root:/sources/shadow-4.1.5.1# find man -name Makefile.in -exec sed -i 's/groups\.1 / /' {} \;
root:/sources/shadow-4.1.5.1# sed -i -e 's@#ENCRYPT_METHOD DES@ENCRYPT_METHOD SHA512@' \
>        -e 's@/var/spool/mail@/var/mail@' etc/login.defs

Ahora ya podemos configurar, compilar e instalar. El último comando es para mover el comando passwd a /bin, que es el directorio correcto en el que debería estar.

root:/sources/shadow-4.1.5.1# ./configure --sysconfdir=/etc
root:/sources/shadow-4.1.5.1# make
root:/sources/shadow-4.1.5.1# make install
root:/sources/shadow-4.1.5.1# mv -v /usr/bin/passwd /bin

Y listo. Este paquete no tiene tests. ¡Que aburrido! 🙂 Ahora salimos del chroot e instalamos el paquete que hemos generado.

root:/sources/shadow-4.1.5.1# exit
[~/lfs]$ sudo lfsinst shadow-4.1.5.1.txz

Instalando coreutils

Vamos a seguir instalando paquetes. Ahora le toca el turno a coreutils. A lo mejor cascan los tests y estamos entretenidos un rato. 🙂

Los primeros comandos ni los nombro. Los dos últimos son para corregir un error en uno de los tests y para activar el soporte para caracteres multibyte, respectivamente.

[~/lfs]$ sudo lfs coreutils-8.19
root:/# cd sources/
root:/sources# tar xvf coreutils-8.19.tar.xz
root:/sources# cd coreutils-8.19
root:/sources/coreutils-8.19# sed -i -e 's/! isatty/isatty/' \
>        -e '45i\              || errno == ENOENT' gnulib-tests/test-getlogin.c
root:/sources/coreutils-8.19# patch -Np1 -i ../coreutils-8.19-i18n-1.patch

Ahora ya podemos configurar el código fuente y compilar. Los tests se pasan en dos partes. Primero pasamos los que se lanzan como root.

root:/sources/coreutils-8.19# FORCE_UNSAFE_CONFIGURE=1 ./configure \
>             --prefix=/usr         \
>             --libexecdir=/usr/lib \
>             --enable-no-install-program=kill,uptime
root:/sources/coreutils-8.19# make
root:/sources/coreutils-8.19# make NON_ROOT_USERNAME=nobody check-root

Por ahora todo ha ido bien. Ahora hay que pasar los tests que se lanzan como usuario. Los vamos a lanzar como usuario nobody. Algunos tests necesitan que el usuario pertenezca a varios grupos, así que vamos a crear un grupo de mentira al cual va a pertenecer el usuario nobody. Es temporal. Luego lo borraremos.

root:/sources/coreutils-8.19# echo "dummy:x:1000:nobody" >> /etc/group
root:/sources/coreutils-8.19# chown -Rv nobody .
root:/sources/coreutils-8.19# su nobody -s /bin/bash \
>           -c "PATH=$PATH make RUN_EXPENSIVE_TESTS=yes -k check || true"

...
============================================================================
Testsuite summary for GNU coreutils 8.19
============================================================================
# TOTAL: 315
# PASS:  293
# SKIP:  21
# XFAIL: 0
# FAIL:  1
# XPASS: 0
# ERROR: 0
root:/sources/coreutils-8.19# grep -A 3 ^FAIL gnulib-tests/test-suite.log
FAIL: test-getlogin
===================

test-getlogin.c:48: assertion failed

Ha fallado un tests. Ya empieza la diversión. 🙂 El test que ha fallado es test-getlogin y, por lo que veo aquí, se trata de un bug de Linux From Scratch. Parece ser que la corrección para este test que metimos en el primer comando, es a su vez incorrecta. Hay que cambiarla y volver a pasar los tests. Por lo que dice el comentario, este test no siempre falla. Parece ser que si se automatiza la compilación suele pasar sin problemas, o sea que si a vosotros os ha funcionado, simplemente ignorad los siguientes comandos.

root:/sources/coreutils-8.19# sed -i -e 's/isatty/!isatty/' gnulib-tests/test-getlogin.c
root:/sources/coreutils-8.19# su nobody -s /bin/bash \
>           -c "PATH=$PATH make RUN_EXPENSIVE_TESTS=yes -k check || true"

...

============================================================================
Testsuite summary for GNU coreutils 8.19
============================================================================
# TOTAL: 315
# PASS:  293
# SKIP:  22
# XFAIL: 0
# FAIL:  0
# XPASS: 0
# ERROR: 0
============================================================================

Ahora sí. El siguiente paso es borrar el grupo que hemos creado e instalar los ficheros. Algunos de ellos se meten en /usr/bin y deberían estar en /usr según el FHS, así que los movemos.

root:/sources/coreutils-8.19# sed -i '/dummy/d' /etc/group
root:/sources/coreutils-8.19# make install
root:/sources/coreutils-8.19# mv -v /usr/bin/{cat,chgrp,chmod,chown,cp,date,dd,df,echo} /bin
root:/sources/coreutils-8.19# mv -v /usr/bin/{false,ln,ls,mkdir,mknod,mv,pwd,rm} /bin
root:/sources/coreutils-8.19# mv -v /usr/bin/{rmdir,stty,sync,true,uname} /bin
root:/sources/coreutils-8.19# mv -v /usr/bin/chroot /usr/sbin
root:/sources/coreutils-8.19# mv -v /usr/share/man/man1/chroot.1 /usr/share/man/man8/chroot.8
root:/sources/coreutils-8.19# sed -i s/\"1\"/\"8\"/1 /usr/share/man/man8/chroot.8
root:/sources/coreutils-8.19# mv -v /usr/bin/{head,sleep,nice} /bin

Adivinad cuáles son los dos últimos comandos. 🙂

root:/sources/coreutils-8.19# exit
[~/lfs]$ sudo lfsinst coreutils-8.19.txz

Instalando Iana-Etc

No hay un paquete más trivial que éste. Sólo tiene dos ficheros de configuración, así que se hace todo con dos comandos además de los que siempre usamos si estamos utilizando los scripts.

[~/lfs]$ sudo lfs iana-etc-2.30
[sudo] password for hexborg: 
root:/# cd sources/
root:/sources# tar xvf iana-etc-2.30.tar.bz2
root:/sources# cd iana-etc-2.30
root:/sources/iana-etc-2.30# make
root:/sources/iana-etc-2.30# make install
root:/sources/iana-etc-2.30# exit
[~/lfs]$ sudo lfsinst iana-etc-2.30.txz

Instalando M4

En último lugar, vamos a instalar también M4. Empezamos corrigiendo un problema de compatibilidad con la glibc.

[~/lfs]$ sudo lfs m4-1.4.16
root:/# cd sources/
root:/sources# tar xvf m4-1.4.16.tar.bz2
root:/sources# cd m4-1.4.16
root:/sources/m4-1.4.16# sed -i -e '/gets is a/d' lib/stdio.in.h

Ahora configuramos e instalamos.

root:/sources/m4-1.4.16# ./configure --prefix=/usr
root:/sources/m4-1.4.16# make

Por último hacemos una corrección en un test, pasamos los tests y terminamos de instalar todo. Esta vez los tests no dan problemas.

root:/sources/m4-1.4.16# sed -i -e '41s/ENOENT/& || errno == EINVAL/' tests/test-readlink.h
root:/sources/m4-1.4.16# make check
root:/sources/m4-1.4.16# make install
root:/sources/m4-1.4.16# exit
[~/lfs]$ sudo lfsinst m4-1.4.16.txz

Hasta aquí el post de hoy. En este post han empezado a surgir problemas que he tenido que resolver. Esto es lo que estaba esperando desde que he empezado esta serie. Veo que Linux From Scratch no me ha decepcionado. 🙂 En el siguiente post empezaremos instalando bison.

EOF

Anuncios