Linux From Scratch (Parte 8 - Entrando al entorno chroot)

Es el momento de entrar en el entorno chroot para comenzar a construir e instalar el sistema LFS final.
Como usuario root, ejecute el siguiente comando que, en este momento, se rellena con solo las herramientas temporales:
chroot "$LFS" /tools/bin/env -i \
    HOME=/root                  \
    TERM="$TERM"                \
    PS1='(lfs chroot) \u:\w\$ ' \
    PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
    /tools/bin/bash --login +h

NOTA: Hay que tener en cuenta que el mensaje bash dirá I have no name! 
Esto es normal porque el archivo /etc/passwd aún no se ha creado.
Es importante que todos los comandos en el resto de este capítulo y en las siguientes publicaciones se ejecuten desde el entorno chroot. Si abandona este entorno por algún motivo (reiniciando por ejemplo), asegúrese de que los sistemas de archivos del kernel virtual estén montados. E ingrese a chroot nuevamente antes de continuar con la instalación.

Creando Directorios

Es hora de crear alguna estructura en el sistema de archivos LFS. Cree un árbol de directorio estándar emitiendo los siguientes comandos:
mkdir -pv /{bin,boot,etc/{opt,sysconfig},home,lib/firmware,mnt,opt}
mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}
install -dv -m 0750 /root
install -dv -m 1777 /tmp /var/tmp
mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}
mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man}
mkdir -v  /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -v  /usr/libexec
mkdir -pv /usr/{,local/}share/man/man{1..8}

case $(uname -m) in
 x86_64) mkdir -v /lib64 ;;
esac

mkdir -v /var/{log,mail,spool}
ln -sv /run /var/run
ln -sv /run/lock /var/lock
mkdir -pv /var/{opt,cache,lib/{color,misc,locate},local}
Los directorios se crean de manera predeterminada con el modo de permiso 755, pero esto no es deseable para todos los directorios. En los comandos anteriores, se realizan dos cambios: uno en el directorio inicial de la raíz del usuario y otro en los directorios de los archivos temporales.

Nota de cumplimiento de FHS 
El árbol de directorios se basa en el Estándar de jerarquía del sistema de archivos (FHS) (disponible en https://wiki.linuxfoundation.org/en/FHS). El FHS también especifica la existencia opcional de algunos directorios como /usr/local/games y /usr/share/games. Creamos solo los directorios que se necesitan. Sin embargo, siéntete libre de crear estos directorios.

Creación de archivos y enlaces simbólicos esenciales 
Algunos programas usan rutas cableadas a programas que aún no existen. Para satisfacer estos programas, crearemos una cantidad de enlaces simbólicos que serán reemplazados por archivos reales a lo largo de esta publicación una vez que el software haya sido instalado: 
ln -sv /tools/bin/{bash,cat,dd,echo,ln,pwd,rm,stty} /bin
ln -sv /tools/bin/{install,perl} /usr/bin
ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib
ln -sv /tools/lib/libstdc++.{a,so{,.6}} /usr/lib
ln -sv bash /bin/sh 
Históricamente, Linux mantiene una lista de los sistemas de archivos montados en el archivo /etc/mtab. Los núcleos modernos mantienen esta lista internamente y la exponen al usuario a través del sistema de archivos /proc. Para satisfacer las utilidades que esperan la presencia de /etc/mtab, cree el siguiente enlace simbólico:
ln -sv /proc/self/mounts /etc/mtab
Para que el usuario root pueda iniciar sesión y para que se reconozca el nombre "root", debe haber entradas relevantes en los archivos /etc/passwd y /etc/group.
Creamos el archivo /etc/passwd ejecutando el siguiente comando:
cat > /etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/dev/null:/bin/false
daemon:x:6:6:Daemon User:/dev/null:/bin/false
messagebus:x:18:18:D-Bus Message Daemon User:/var/run/dbus:/bin/false
nobody:x:99:99:Unprivileged User:/dev/null:/bin/false
EOF 
La contraseña real para root (la "x" utilizada aquí es solo un marcador de posición) se configurará más adelante.
Creamos el archivo /etc/group ejecutando el siguiente comando: 
cat > /etc/group << "EOF"
root:x:0:
bin:x:1:daemon
sys:x:2:
kmem:x:3:
tape:x:4:
tty:x:5:
daemon:x:6:
floppy:x:7:
disk:x:8:
lp:x:9:
dialout:x:10:
audio:x:11:
video:x:12:
utmp:x:13:
usb:x:14:
cdrom:x:15:
adm:x:16:
messagebus:x:18:
systemd-journal:x:23:
input:x:24:
mail:x:34:
nogroup:x:99:
users:x:999:
EOF 
Los grupos creados no forman parte de ningún estándar; son grupos decididos en parte por los requisitos de la configuración de Udev en este capítulo, y en parte por convenciones comunes empleadas por varias distribuciones de Linux existentes. Además, algunas suites de prueba dependen de usuarios o grupos específicos. Linux Standard Base (LSB, disponible en http://www.linuxbase.org) recomienda solo que, además de la raíz de grupo con un ID de grupo (GID) de 0, esté presente un contenedor de grupo con un GID de 1. El administrador del sistema puede elegir libremente todos los demás nombres de grupos y GID ya que los programas bien redactados no dependen de los números de GID, sino que usan el nombre del grupo.

Para eliminar el mensaje "I have no name!", Inicie un nuevo shell. Como se ha instalado un Glibc completo y se han creado los archivos /etc/passwd y /etc/group, el nombre de usuario y la resolución del nombre del grupo ahora funcionarán: 
exec /tools/bin/bash --login +h
Los programas de inicio de sesión, agetty e init (y otros) utilizan una cantidad de archivos de registro para registrar información, como quién inició sesión en el sistema y cuándo. Sin embargo, estos programas no escribirán en los archivos de registro si aún no existen. Inicializaremos los archivos de registro y asígnaremos los permisos adecuados:
touch /var/log/{btmp,lastlog,faillog,wtmp}
chgrp -v utmp /var/log/lastlog
chmod -v 664  /var/log/lastlog
chmod -v 600  /var/log/btmp 
El archivo /var/log/wtmp registra todos los inicios de sesión y los cierres de sesión. El archivo /var/log/lastlog registra cuando cada usuario inició sesión por última vez. El archivo /var/log/faillog registra intentos fallidos de inicio de sesión. El archivo /var/log/btmp registra los intentos de inicio de sesión incorrectos.
El archivo /run/utmp registra los usuarios que están actualmente conectados. Este archivo se crea dinámicamente en los scripts de arranque.

Linux-4.16.10 API Headers
Los encabezados de la API de Linux (en linux-4.16.10.tar.xz) exponen la API del kernel para su uso por Glibc.
Tiempo aproximado de compilación: menos de 0.1 SBU
Tamaño de disco requerido: 921 MB
Instalación de encabezados de API de Linux 
Nos aseguramos de que no haya archivos obsoletos ni dependencias de actividades anteriores:
cd sources/linux-4.16.7
make mrproper
Ahora extraemos los encabezados del kernel visibles para el usuario desde la fuente. Se colocan en un directorio local intermedio y se copian en la ubicación necesaria porque el proceso de extracción elimina los archivos existentes en el directorio de destino. También hay algunos archivos ocultos utilizados por los desarrolladores del núcleo y no son necesarios para LFS que se eliminan del directorio intermedio. 
make INSTALL_HDR_PATH=dest headers_install
find dest/include \( -name .install -o -name ..install.cmd \) -delete
cp -rv dest/include/* /usr/include

Man-pages-4.16
El paquete Man-pages contiene más de 2,200 páginas man.
Tiempo aproximado de compilación: menos de 0.1 SBU
Tamaño de disco requerido: 27 MB
cd ..
tar -xvf man-pages-4.16.tar.xz
cd man-pages-4.16
make install
cd ..

Glibc-2.27
El paquete Glibc contiene la biblioteca principal C. Esta biblioteca proporciona las rutinas básicas para asignar memoria, buscar directorios, abrir y cerrar archivos, leer y escribir archivos, manejo de cadenas, coincidencia de patrones, aritmética, etc.
Tiempo aproximado de compilación: 21 SBU
Tamaño de disco requerido: 2.4 GB
El sistema de compilación Glibc es autónomo y se instalará perfectamente, a pesar de que el archivo de especificaciones del compilador y el enlazador siguen apuntando a / tools. Las especificaciones y el enlazador no se pueden ajustar antes de la instalación de Glibc porque las pruebas de autoconfimiento de Glibc darían resultados falsos y frustrarían el objetivo de lograr una compilación limpia.
Algunos de los programas Glibc utilizan el directorio no compilado de FHS /var/db para almacenar sus datos de tiempo de ejecución. Aplique el siguiente parche para que dichos programas almacenen sus datos de tiempo de ejecución en las ubicaciones compatibles con FHS:  
cd glibc-2.27
patch -Np1 -i ../glibc-2.27-fhs-1.patch
Primero crea un enlace simbólico de compatibilidad para evitar referencias a /tools en nuestro glibc final:
ln -sfv /tools/lib/gcc /usr/lib
Determinamos el directorio de inclusión de GCC y cree un enlace simbólico para el cumplimiento de LSB. Además, para x86_64, cree un enlace simbólico de compatibilidad requerido para que el cargador dinámico funcione correctamente:
case $(uname -m) in
    i?86)    GCC_INCDIR=/usr/lib/gcc/$(uname -m)-pc-linux-gnu/8.1.0/include
            ln -sfv ld-linux.so.2 /lib/ld-lsb.so.3
    ;;
    x86_64) GCC_INCDIR=/usr/lib/gcc/x86_64-pc-linux-gnu/8.1.0/include
            ln -sfv ../lib/ld-linux-x86-64.so.2 /lib64
            ln -sfv ../lib/ld-linux-x86-64.so.2 /lib64/ld-lsb-x86-64.so.3
    ;;
esac
Eliminamos un archivo que pueda quedar de un intento de compilación anterior:
rm -f /usr/include/limits.h
La documentación de Glibc recomienda construir Glibc en un directorio de compilación dedicado. Pero antes eliminaremos el directorio que creamos al compilar Glibc:
rm -R -f build
mkdir -v build
cd       build 
Preparamos Glibc para compilación:
CC="gcc -isystem $GCC_INCDIR -isystem /usr/include" \
../configure --prefix=/usr                          \
             --disable-werror                       \
             --enable-kernel=3.2                    \
             --enable-stack-protector=strong        \
             libc_cv_slibdir=/lib
unset GCC_INCDIR
Compilamos el paquete:
make 
En general, algunas pruebas no pasan. Las fallas de prueba enumeradas a continuación generalmente son seguras para ignorar.
make check
 Es posible que vea algunas pruebas fallidas. El conjunto de pruebas Glibc depende en cierto modo del sistema host. Esta es una lista de los problemas más comunes que se observan en algunas versiones de LFS: Se sabe que misc/tst-ttyname falla en el entorno chroot LFS.
posix/tst-getaddrinfo4 y posix/tst-getaddrinfo5 pueden fallar en algunas arquitecturas.

Aunque es un mensaje inofensivo, la etapa de instalación de Glibc se quejará de la ausencia de /etc/ld.so.conf. Prevenga esta advertencia con:

touch /etc/ld.so.conf
Reparamos el Makefile generado para omitir una comprobación de cordura innecesaria que falla en el entorno parcial de LFS:
sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile
Instalamos el paquete:
make install
Instalamos el archivo de configuración y el directorio de tiempo de ejecución para nscd:
cp -v ../nscd/nscd.conf /etc/nscd.conf
mkdir -pv /var/cache/nscd
A continuación, instalamos las configuraciones regionales que pueden hacer que el sistema responda en un idioma diferente. No se requieren ninguno de los entornos locales, pero si faltan algunos de ellos, las suites de prueba de paquetes futuros saltearán pruebas importantes.

Las configuraciones regionales individuales pueden instalarse utilizando el programa localedef. Por ejemplo, el primer comando localedef a continuación combina la definición del sitio /usr/share/i18n/locales/cs_CZ charset-independent con la definición /usr/share/i18n/charmaps/UTF-8.gz charmap y agrega el resultado al /usr/lib/locale/locale-archive. Las siguientes instrucciones instalarán el conjunto mínimo de configuraciones regionales necesarias para la cobertura óptima de las pruebas: 
    mkdir -pv /usr/lib/locale
    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 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_MX -f ISO-8859-1 es_MX
    localedef -i es_ES -f UTF-8 es_ES
    localedef -i es_ES -f ISO-8859-1 es_ES
    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 it_IT -f ISO-8859-1 it_IT
    localedef -i it_IT -f UTF-8 it_IT.UTF-8
    localedef -i ja_JP -f EUC-JP ja_JP
    localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
    localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
    localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
    localedef -i zh_CN -f GB18030 zh_CN.GB18030
Alternativamente, instale todas las configuraciones regionales enumeradas en el archivo glibc-2.27/localedata/SUPPORTED (incluye todas las configuraciones regionales enumeradas anteriormente y muchas más) a la vez con el siguiente comando que consume mucho tiempo:
make localedata/install-locales
A continuación, utilizaríamos el comando localedef para crear e instalar configuraciones regionales que no figuran en el archivo glibc-2.27/localedata/SUPPORTED en el caso poco probable de que las necesitemos.

 
Configurando GlibcEl archivo /etc/nsswitch.conf debe crearse porque los valores predeterminados de Glibc no funcionan bien en un entorno de red.
Creamos un nuevo archivo /etc/nsswitch.conf ejecutando lo siguiente:  
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
Agregar datos de zona horaria
Instalamos y configuramos los datos de zona horaria con lo siguiente:
tar -xf ../../tzdata2018e.tar.gz

ZONEINFO=/usr/share/zoneinfo
mkdir -pv $ZONEINFO/{posix,right}

for tz in etcetera southamerica northamerica europe africa antarctica  \
          asia australasia backward pacificnew 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

cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p Europe/Madrid
unset ZONEINFO
Una forma de determinar la zona horaria local es ejecutar la siguiente secuencia de comandos:
tzselect
Y seguir las instrucciones. 
En mi caso sería:
7, y luego ENTER  (para elegir EUROPE)
44, y luego ENTER (para elegir SPAIN)
1, y luego ENTER (para elegir Spain (mainland))
1, y luego ENTER (para aceptar los cambios)

A continuación, creamos el archivo /etc/localtime ejecutando:
cp -v /usr/share/zoneinfo/Europe/Madrid /etc/localtime
Configurando el Cargador Dinámico
De forma predeterminada, el cargador dinámico (/lib/ld-linux.so.2) busca a través de /lib y /usr/lib para las bibliotecas dinámicas que necesitan los programas a medida que se ejecutan. Sin embargo, si hay bibliotecas en directorios que no sean /lib y /usr/lib, estos deben agregarse al archivo /etc/ld.so.conf para que el cargador dinámico los pueda encontrar. Dos directorios que comúnmente se sabe que contienen bibliotecas adicionales son /usr/local/lib y /opt/lib, así que agregue esos directorios a la ruta de búsqueda del cargador dinámico.
Crearemos un nuevo archivo /etc/ld.so.conf ejecutando lo siguiente:
cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib

EOF
Si lo deseamos, el cargador dinámico también puede buscar en un directorio e incluir los contenidos de los archivos que allí se encuentran. En general, los archivos en este directorio de inclusión son una línea que especifica la ruta de la biblioteca deseada. Para agregar esta capacidad ejecuta los siguientes 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

Para la siguiente publicación, continuaremos con el ajuste de Toolchain.

Entradas populares de este blog

Acerca de los mensajes de tipo... "Por favor no agreges a este usuario es un virus!"

Temas oficiales para Windows XP

Linux From Scrach (Parte 1 - Preparación del sistema)