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}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.
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}
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} /binHistó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 /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
ln -sv /proc/self/mounts /etc/mtabPara 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"La contraseña real para root (la "x" utilizada aquí es solo un marcador de posición) se configurará más adelante.
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
Creamos el archivo /etc/group ejecutando el siguiente comando:
cat > /etc/group << "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.
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
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 +hLos 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}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.
chgrp -v utmp /var/log/lastlog
chmod -v 664 /var/log/lastlog
chmod -v 600 /var/log/btmp
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 mrproperAhora 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.16El 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.xzcd man-pages-4.16make installcd ..
Glibc-2.27El 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/libDeterminamos 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) inEliminamos un archivo que pueda quedar de un intento de compilación anterior:
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
rm -f /usr/include/limits.hLa 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 buildPreparamos Glibc para compilación:
mkdir -v build
cd build
CC="gcc -isystem $GCC_INCDIR -isystem /usr/include" \Compilamos el paquete:
../configure --prefix=/usr \
--disable-werror \
--enable-kernel=3.2 \
--enable-stack-protector=strong \
libc_cv_slibdir=/lib
unset GCC_INCDIR
makeEn general, algunas pruebas no pasan. Las fallas de prueba enumeradas a continuación generalmente son seguras para ignorar.
make checkEs 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.confReparamos 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 ../MakefileInstalamos el paquete:
make installInstalamos el archivo de configuración y el directorio de tiempo de ejecución para nscd:
cp -v ../nscd/nscd.conf /etc/nscd.confA 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.
mkdir -pv /var/cache/nscd
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/localeAlternativamente, 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:
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
make localedata/install-localesA 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:
Agregar datos de zona horariacat > /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
Instalamos y configuramos los datos de zona horaria con lo siguiente:
tar -xf ../../tzdata2018e.tar.gzUna forma de determinar la zona horaria local es ejecutar la siguiente secuencia de comandos:
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
tzselectY 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"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:
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib
EOF
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.
Comentarios
Publicar un comentario