LPIC-2 Tema 201.1: componentes del kernel

Nueva entrada sobre las certificaciones LPIC-2, para aquellos que quieran obtener una de las certificaciones más valiosas para los futuros administradores de sistemas GNU/Linux. En esta ocasión, trata sobre el Tema 201, dedicado al kernel Linux. Concretamente, el Tema 201.1, sobre componentes del núcleo.

Las preguntas de los exámenes sobre este tema estarán orientadas a evaluar las competencias de los candidatos para conocer los componentes del kernel Linux, pudiendo diferenciar entre imágenes del kernel diferentes, versiones estables, parches, módulos, etc. Algo necesario para determinar la compatibilidad del hardware, recursos y requisitos.

Cómo conseguir el kernel

Como ya deberías saber, el kernel Linux de tu distribución se puede actualizar desde los propios repositorios oficiales de tu distro (linux-source para DEB, kernel-src o kernel-sources en RPM, etc.). Pero eso te da acceso solo a los kernels específicos que incluyen algunas distribuciones. En cambio, si lo que quieres es acceder a una versión vainilla de Linux, el procedimiento para conseguirlo es:

  1. Ve a kernel.org
  2. Pulsa Latest Release para descargar la última versión estable disponible. También tienes a tu alcance versiones LTS (Long Term Support, o soporte a largo plazo) disponibles. En caso de que necesites otra versión específica, puedes encontrarla aquí.
    • Mainline es la rama principal.
    • Stable indica que se trata de una rama que no está en proceso de desarrollo.
    • Longterm es el LTS que he indicado.
    • Linux-next es el próximo lanzamiento, ya sea final o RC (Release Candidate).
    • EOL (End-Of-Line) determina que ya no recibirá más actualizaciones de mantenimiento.
  3. Una vez hayas descargado el tarball con las fuentes del kernel, lo siguiente que deberías hacer es verificar la suma (cada versión tiene una columna con la firma digital PGP) para comprobar que no se han alterado los datos ni hay ninguno corrupto.
  4. Una vez verificada, lo siguiente es desempaquetar y descomprimir (tar.xz) el kernel Linux, es decir, extraerlo del tarball. A estas alturas ya deberías saber cómo con tar. Recuerda el lugar destino correcto (ver siguiente apartado).

Localización del kernel Linux

En un artículo previo, ya di bastante información sobre el contenido de estas fuentes. Puedes refrescar la memoria aquí. Así evitaré generar contenido redundante y no alargaré demasiado este artículo. Aquí únicamente decir que el lugar donde se deben extraer las fuentes es:

  • /usr/src/linux

Allí es donde estará toda la jerarquía de directorios de las fuentes Linux y los scripts y herramientas necesarias para la compilación e instalación. Recuerda que ese directorio es el genérico, y puede ser el enlace simbólico hacia fuentes que se llaman de muy diferente forma, para que no tengas que mover o renombrar nada. Por ejemplo:

#Accede al directorio donde descargaste el tarball del kernel y la firma PGP
cd /home/isaac/Descargas

#Desempaqueta y descomprime las fuentes
xz -cd linux-5.11.2.tar.xz | tar xvf -

#Verifica la firma, sustituyendo los nombres e ID por el que te corresponda...
gpg --verify linux-5.11.2.tar.sign
gpg --recv-keys 79BE3E4300411886
gpg --verify linux-5.6.9.tar.sign

#Si no obtienes un "BAD Signature" en el paso anterior, estará OK

#Crea el enlace a las fuentes
ln –sf /home/isaac/Descargas/linux-5.11.2 /usr/src/linux

#Si por algún motivo ya existe el enlace simbólico, debes borrarlo previamente al último paso
rm /usr/src/linux

#También sería conveniente eliminar dependencias y árbol de construcción de compilaciones previas
make clean
make mrproper

En caso de tener dudas, puedes buscar información sobre el kernel Linux en los ficheros de documentación:

  • /usr/src/linux/Documentation

Recuerda, si vas a compilar, leer siempre el fichero README. Te puede salvar de muchos apuros y quebraderos de cabeza.

Imágenes del kernel

También debes conocer ya dónde se instala la imagen del kernel Linux, una vez se ha generado el binario tras la compilación. Esta imagen debe estar en esa ruta específica para poder cargarlo durante el arranque, además de tener unos formatos muy concretos. Como también sabrás, la imagen se comprime, dando lugar a diferentes tipos de archivos que deberías conocer:

  • vmLinux: kernel Linux en un formato de fichero ejecutable vinculado estáticamente. Es simplemente un paso intermedio en el procedimiento de arranque, por lo que no tienes que prestar atención a él (a no ser que lo quieras usar para depuración).
  • vmlinux.bin: igual al anterior, pero sin formato de arranque. Se descartan todos los símbolos y la información de reubicación.
  • vmlinuz: es un enlace simbólico hacia la imagen del kernel Linux comprimida con zlib. Ten en cuenta que, según la versión, la imagen puede llamarse diferente. De esta forma, se puede apuntar hacia la imagen deseada con un nombre común. La compresión puede ocurrir con zImage o bzImage. Será la función decompress_kernel() la que gestione la descompresión durante el arranque. Por cierto, suele haber una vmlinuz.old que apunta a la imagen funcional previa a la nueva versión, por si hubiera que arrancar un kernel previo…
  • zImage: es un formato antiguo para núcleos pequeños, por debajo de los 512 KB.
  • bzImage: es el formato actual. A medida que el kernel crecía y se necesitaba gestionar imágenes más grandes, se creó este otro formato, que se cargará en una zona de la RAM alta, por encima de 1MB. Ten en cuenta que a esta imagen es a la que apuntaría el enlace simbólico vmlinuz, y su nombre real como la puedes encontrar en tu sistema no es bzImage, sino que puede ser un nombre como vmlinuz-5.4.0-66-generic o similar.
  • System.map: es una tabla de símbolos utilizada por el kernel. Esta tabla permtie buscar entre los nombres de los símbolos (variable o función) y direcciones de memoria.

initrd y initramfs

Por otro lado, en el directorio /boot, también habrás visto otras imágenes. Antiguamente se empleaba initrd, otra imagen necesaria y complementaria a la propia del kernel Linux que se usa durante el arranque del sistema. Para esa imagen se empleaba ramdev, pasando luego a usarse tmpfs (desde Linux 2.6). Eso significa que en la actualidad realmente se está usando initramfs, aunque la imagen aún sigue denominándose initrd en el sistema…

Existen dos herramientas de bajo nivel para poder generar este tipo de imágenes de forma manual. La antigua se llama mkinitrd y la moderna es mkinitramfs. Son scripts que pueden generar un fichero comprimido cpio con lo necesario.

Resumiendo, lo que debes saber es que estos mecanisos, para implementar sistemas FS temporales sobre la RAM, son usados por el kernel Linux durante el arranque del sistema, para hacer todos los arreglos necesarios antes de que el FS pueda montar /. De esa forma, el sistema carga todos los ficheros necesarios para el arranque en este disco RAM que de otra forma no serían accesibles durante el arranque.

Por cierto, nuevamente tendrás un initrd.img (y un initrd.img.old) que es el enlace hacia la imagen que sea. Por ejemplo, puede apuntar hacia initrd.img-5.4-generic…

Cómo parchear el kernel

Ya sabes que puedes usar uname -r para saber qué versión tienes actualmente instalada. Además, en la página kernel.org, hay una columna llamada patch que permite descargar los parches para transformar una versión anterior del kernel en esta otra nueva versión, sin tener que descargar el kernel completo. Es decir, podrías aplicar este parche a la versión mainline previa, como sería una 3.16.0 para transformarla en una 3.16.6.

También encontrarás una columna llamada inc. patch, es decir, para el parche incremental. La diferencia con el anterior es que la incremental puede ser aplicada solo a la versión inmediatamente anterior. Por ejemplo, si tienes la versión 5.11.2, con un parche incremental la puedes convertir en la 5.11.3. Pero no podrías aplicar un parche a una versión 5.11.1 o 5.11.

Una vez conoces eso, lo siguiente es conocer cómo aplicar el parche que has descargado. Pero, antes de eso, recuerda que si deseas ver las diferencias que aplicaría un parche, puedes usar el comando diff. Este comando puede usarse incluso para comparar un código fuente con otra implementación actualizada y obtener así el parche. Por ejemplo, imagina que creas un script y actualizas tu script. Ahora posees ambos códigos, el del anterior y el del nuevo. Si quisieras enviar el parche de actualización a todos los usuarios que estén usando ese script, podrías generar el parche con:

#Generar el parche
diff –u original.sh actualizado.sh > parche.patch

#Para el parcheo
patch original.sh < parche.path

Siguiendo con el tema del kernel, aplicar el parche a un código fuente de Linux que ya tienes implicaría hacer lo siguiente:

cd /usr/src
tar –zxvf patch-linux-5.11.1-2.tar.gz
zcat  patch-linux-5.11.1-2.gz | patch  -p0

Evidentemente, si se trata de un nuevo kernel aún no instalado, tendrás que seguir el proceso de compilación. En caso de ser uno que ya está en uso, debes recompilar igualmente para que el parche surta efecto…

Isaac

Apasionado de la computación y la tecnología en general. Siempre intentando desaprender para apreHender.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

A %d blogueros les gusta esto:

Si continuas utilizando este sitio aceptas el uso de cookies. más información

Los ajustes de cookies de esta web están configurados para "permitir cookies" y así ofrecerte la mejor experiencia de navegación posible. Si sigues utilizando esta web sin cambiar tus ajustes de cookies o haces clic en "Aceptar" estarás dando tu consentimiento a esto.

Cerrar