Linux From Scrach (Parte 3 - Construyendo un sistema temporal 1)

Vamos a ver como se construye un sistema Linux mínimo.
El sistema sólo contendrá las herramientas para iniciar a construir el sistema final LFS y permitir un entorno de trabajo con más comodidad para el usuario que un entorno mínimo mínimo haría.

  • El primer paso es construir una nueva cadena de herramientas independiente del host (compilador, ensamblador, enlazador, bibliotecas y algunas herramientas útiles). 
  • El segundo paso, usa esta cadena de herramientas para construir las otras herramientas esenciales. 


Empezamos con lo bueno... ¡leña al mono, que es de goma!

Por si acaso nos hemos despistado...
Nos aseguamos que estamos logueados como usuario lfs:
su - lfs
Cargamos las variables y configuración de usuario
source ~/.bash_profile
Y por último, comprobamos que estamos en el directorio /mnt/lfs/sources
cd /mnt/lfs/sources

Si nos dá algún error, mejor volvemos a empezar, que estamos a tiempo. Así evitaremos frustrarnos mas adelante.

Binutils-2.30 - 1º Paso (hay otros pasos mas adelante)

El paquete Binutils contiene un enlazador, un ensamblador y otras herramientas para manejar archivos de objetos.
Tiempo aproximado de compilación: 1 SBU
Tamaño de disco requerido: 547 MB

Descomprimimos el archivo
tar -xvf binutils-2.30.tar.gz
cd binutils-2.30

Creamos el directorio build.
mkdir -v build
Entramos dentro del directorio build.
cd build
Y ahora configuramos el paquete
../configure --prefix=/tools            \
             --with-sysroot=$LFS        \
             --with-lib-path=/tools/lib \
             --target=$LFS_TGT          \
             --disable-nls              \
             --disable-werror
Si no nos ha dado ningún error, compilaremos el paquete
make
Si estamos creando en un sistema x86_64, crearemos un enlace simbólico para garantizar la sanidad de la cadena de herramientas.
case $(uname -m) in
  x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac
Y ahora instalamos el paquete
make install
Vamos a salir del directorio build
cd ..
Borramos el directorio build
rm -R -f build

Y ahora salimos del directorio de binutils-2.30 (y nos quedaremos en /mnt/lfs/sources).
cd ../..
GCC-8.1.0 - 1º Paso
El paquete GCC contiene la colección de compiladores, que incluye los compiladores C y C++.
Tiempo aproximado de compilación: 8.8 SBU
Tamaño de disco requerido: 2.2 GB
Descomprimimos el paquete GCC
tar -xvf gcc-8.1.0.tar.xz 
y entramos en el directorio gcc -8.1.0
cd gcc-8.1.0
GCC ahora requiere los paquetes GMP, MPFR y MPC. Como estos paquetes pueden no estar incluidos en nuestra distribución de Linux, se compilarán con GCC. Desempaquetaremos cada paquete en el directorio de origen del GCC y cambiaremos el nombre de los directorios resultantes para que los procedimientos de compilación de GCC los utilicen automáticamente.
tar -xf ../mpfr-4.0.1.tar.xz
mv -v mpfr-4.0.1 mpfr
tar -xf ../gmp-6.1.2.tar.xz
mv -v gmp-6.1.2 gmp
tar -xf ../mpc-1.1.0.tar.gz
mv -v mpc-1.1.0 mpc
El siguiente comando cambiará la ubicación del enlazador dinámico predeterminado de GCC para usar el que está instalado en / tools. También elimina / usr / include de la ruta de búsqueda de inclusión de GCC:
for file in gcc/config/{linux,i386/linux{,64}}.h
do
  cp -uv $file{,.orig}
  sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
      -e 's@/usr@/tools@g' $file.orig > $file
  echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
  touch $file.orig
done 
Finalmente, en hosts x86_64, estableceremos el nombre de directorio predeterminado para las bibliotecas de 64 bits en "lib":
case $(uname -m) in
  x86_64)
    sed -e '/m64=/s/lib64/lib/' \
        -i.orig gcc/config/i386/t-linux64
 ;;
esac 
Y ahora vamos a crear un directorio build y entraremos dentro de él.
mkdir -v build 
cd build
Configuraremos la compilación:
../configure                                       \
    --target=$LFS_TGT                              \
    --prefix=/tools                                \
    --with-glibc-version=2.11                      \
    --with-sysroot=$LFS                            \
    --with-newlib                                  \
    --without-headers                              \
    --with-local-prefix=/tools                     \
    --with-native-system-header-dir=/tools/include \
    --disable-nls                                  \
    --disable-shared                               \
    --disable-multilib                             \
    --disable-decimal-float                        \
    --disable-threads                              \
    --disable-libatomic                            \
    --disable-libgomp                              \
    --disable-libmpx                               \
    --disable-libquadmath                          \
    --disable-libssp                               \
    --disable-libvtv                               \
    --disable-libstdcxx                            \
    --enable-languages=c,c++
Luego compilaremos:
make
Y por último, instalaremos la compilación del paquete.
make install
Salimos del directorio hasta quedarmos en /mnt/lfs/sources/gcc-8.1.0/
cd ..
Borramos el directorio build
rm -R -f build
Y volvemos a salir del directorio hasta quedarnos en /mnt/lfs/sources
cd ..
Ya hemos instalado el paquete GCC.

Ahora vamos a instalar los encabezados de API de Linux
Tiempo aproximado de compilación: 0.2 SBU
Tamaño de disco requerido: 917 MB

Descomprimiremos el paquete linux-4.16.7.tar.xz
tar -xvf linux-4.16.7.tar.xz
entramos en el directorio linux-4.16.7
cd linux-4.16.7
Y ejecutamos la instrucción siguiente:
make mrproper
Con la instrucción que acabamos de ejecutar, nos hemos asegurado de que no haya archivos obsoletos incrustados en el paquete.
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. 
make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /tools/include
 Salimos del directorio
cd ..
Vamos a por el Glibc
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: 4.3 SBU
Tamaño de disco requerido: 823 MB
Descomprimimos el paquete:
 tar -xvf glibc-2.27.tar.xz
Entramos en el directorio:
cd glibc-2.27
Creamos un directorio build, y entramos dentro de el:
mkdir -v build
cd build
Lo preparamos para copilarlo:
../configure                             \
      --prefix=/tools                    \
      --host=$LFS_TGT                    \
      --build=$(../scripts/config.guess) \
      --enable-kernel=3.2             \
      --with-headers=/tools/include      \
      libc_cv_forced_unwind=yes          \
      libc_cv_c_cleanup=yes

ATENCIÓN:
Se han recibido informes de que este paquete puede fallar al compilarse como una "marca paralela". Así que compilaremos con un solo procesador / núcleo, para evitar problemas.
Coompilamos (ojo al detalle de esta vez, que cambiamos la instrucción make, que le añadimos -j1). Así compilaremos con un solo procesador / núcleo.
make -j1
Si no ha habido error, instalamos.
make install
En este punto, es imprescindible detenerse y garantizar que las funciones básicas (compilación y enlace) de la nueva cadena de herramientas funcionen como se esperaba. Para llevar a cabo una comprobación de validez, ejecutaremose los siguientes comandos:
echo 'int main(){}' > dummy.c
$LFS_TGT-gcc dummy.c
readelf -l a.out | grep ': /tools' 
Si todo funciona correctamente, no debería haber errores, y la salida del último comando será semejante a la siguiente forma:
[Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]

En la siguiente publicación, seguiremos con Libstdc++, espero que os esté funcionando todo bien, sin errores, y os esté gustando. 
Gracias, y hasta la próxima!

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

Activar tema Negro (gris oscuro) en Microsoft Office 2016