el kernel linux y el initramfs en el directorio /boot/

fundamentos GNU/Linux fun-gnu


kernel-linux34En este artículo sólo pretendo hacer una descripción básica del contenido del famoso directorio /boot/ que todo sistema GNU/Linux contiene en la raíz. Tradicionalmente este directorio se montaba en su propia partición, de hecho así se sigue haciendo por tradición en distros como Arch o Gentoo, pero hoy en día esto ya no suele ser necesario. La causa era la limitación de que el núcleo Linux estuviese en una partición con un sistema de archivos ext2, por lo que si la raíz estaba en ext3 o ext4, no arrancaría. Esto ya está superado y la decisión de asignarle su propia partición o no a /boot/ queda al gusto del usuario.

¿Qué dos cosas básicas tiene que haber en /boot/?

  1. el kernel o núcleo Linux (vmlinuz o zImage)
  2. un ramdisk en formato intramfs o initrd.

El kernel linux, es un archivo comprimido que suele llamarse vmlinuz o zImage (por convención, aunque el nombre no importa) y que contiene el núcleo Linux propiamente dicho en formato binario (ejecutable) en formatos tales como ELF, COFF y a.out. El tamaño del kernel es variable, pues dependerá entre otras cosas del tipo y nivel de compresión y de la cantidad de drivers y parches que sean incorporados directamente en él (no como módulos externos). El kernel ahora suele estar comprimido mediante bzip2 (bz) y antes solía hacerse mediante gzip (z). Cuando se compila el kernel desde el directorio de las fuentes, con el famoso comando make, el archivo se guarda normalmente en:

/usr/src/directorio-de-fuentes/arch/x86/boot/bzImage

ese bzImage es el nuevo kernel compilado, realmente tan sólo hay que copiarlo en nuestro directorio /boot/ y ya tendremos listo el nuevo núcleo para arrancar. Se suele renombrar para que sepamos de qué versión de trata, así por ejemplo haríamos:

sudo cp /arch/x86/boot/bzImage /boot/vmlinuz-3.17.2

El archivo initramfs “initial ram file system”, sistema de archivos ram inicial (ramdisk), es un archivo cpio comprimido normalmente en formato gzip que contiene un pequeño sistema de archivos que se cargará en la memoria RAM en el proceso de arranque del núcleo. El kernel lo montará, como una pequeña raíz, pues la necesita para completar algunas tareas relacionadas con módulos y controladores de dispositivos antes de poder arrancar el verdadero sistema de archivos raíz instalado en el disco duro e invocar al proceso init. Más antiguo que initramfs es initrd “disco RAM inicial”, aún ampliamente usado, y cuya función es la misma a pesar de ciertas diferencias técnicas y de funcionamiento.

Recordemos que al compilar el kernel (make menuconfig) decidimos qué controladores se integrarán dentro de kernel mismo (en el bzImage) y cuales irán fuera en forma de módulos, que puedan ser invocados desde éste si son necesarios. Pues estos módulos se integrarán precisamente en la imagen initramfs (o initrd) para que estén a disposición del kernel en el proceso de arranque del núcleo.

La creación tradicional del ramdisk initrd se hacía mediante el comando mkinitrd pero hoy en día generalmente ha sido sustituido por la creación de un initramfs mediante el comando mkinitramfs.

En Archlinux, por ejemplo, el encargado de crear el initramfs es mkinitcpio que es un script de bash utilizado para generar un ramdisk inicial initramfs de última generación.

Más información en la wiki de Arch:

https://wiki.archlinux.org/index.php/Mkinitcpio_%28Espa%C3%B1ol%29

En Gentoo, se utiliza un conjunto de scripts equivalentes, genkernel, que vale tanto para automatizar la configuración, compilación e instalación del kernel mismo, como para crear el ramdisk inicial.

genkernel --install ramdisk (crea un ramdisk en formato initrd)

genkernel --install initramfs (crean un ramdisk en formato initramfs)

Este último es el recomendado en Gentoo.

Más información en la wiki de Gentoo:

https://wiki.gentoo.org/wiki/Genkernel/es

Nota.- no olvidemos nunca que tras compilar e instalar kernels (y ramdisks) nuevos, siempre habrá que actualizar GRUB para poder arrancar con ellos (sudo grub-mkconfig -o /boot/grub/grub.cfg)

varios kernels al arranque en Archlinux

kernelUna medida de seguridad básica en GNU/Linux, es contar con más de una opción de kernel o núcleo en el arranque del sistema. Es cierno que los “kernel panic” en Linux son infrecuentes, pero es prudente tener al menos una opción más, pues si el núcleo de un sistema operativo no arranca, estamos bien jodidos.

Arch es una distro rolling release, lo que significa que se actualiza constantemente a las versiones más modernas del software. Es mi distro principal, con la que trabajo a diario hace tres años, y su estabilidad y solidez es sorprendente. Pero siempre hay que ser prudente y contar con más opciones al arranque.

Instalar el kernel LTS, (la opción de la estabilidad).

Arch dispone de un kernel LTS (Long Term Support) soporte a largo plazo, que garantiza la máxima estabilidad. Para instalarlo:

sudo pacman -S linux-lts linux-lts-headers

con lo cual al arranque ya tendremos dos opciones de núcleo para elegir, la oficial de Arch, y la LTS.

Hoy, 14 de agosto de 2014, el kernel oficial ARCH es 3.16.0-2 (la nueva rama 3.16) y el LTS es 3.14.16-1 (la rama 3.14).

Instalar el kernel Grsecurity, (la opción de la seguridad).

El kernel Grsecurity/PaX, es una versión modificada del kernel que incorpora múltiples parches para maximizar la seguridad del kernel y por lo tanto el sistema. https://grsecurity.net/

sudo pacman -S linux-grsec linux-grsec-headers

Instalar el kernel CK, (la opción de la customización según el microprocesador).

A diferencia de los núcleos anteriores que están los repositorios oficiles de ARCH, el kernel CK podemos encontrarlo en AUR y además tiene su propio repositorio. Consiste en versiones del kernel compiladas para optimizar el uso de cada tipo de microprocesador.

Podemos añadir a nuestro /etc/pacman.conf el repositorio CK:

[repo-ck]
Server = http://repo-ck.com/$arch

tras lo que hacemos:

sudo pacman -Syu

y de esta manera ya podemos ver todas las versiones del kernel-ck: kernel26-ck, linux-ck-atom, linux-ck-barcelona, linux-ck-bulldozer, linux-ck-core2, linux-ck-corex, linux-ck-haswell, linux-ck-ivybridge, linux-ck-k10, linux-ck-kx, linux-ck-nehalem, linux-ck-p4, linux-ck-pentm, linux-ck-piledriver, linux-ck-sandybridge

ahora podremos instalar la versión que corresponda a nuestro microprocesador. Por ejemplo, si tenemos un antiguo micro tipo Intel Core 2, instalaremos la versión linux-ck-core2:

sudo pacman -S linux-ck-core2 linux-ck-core2-headers

Tip: para mejorar aún más el rendimiento del kernel ck, podemos habilitar BFQ I/O Scheduler en nuestro archivo /etc/default/grub

en la línea: GRUB_CMDLINE_LINUX_DEFAULT= agregamos elevator=bfq de manera que quede así:

GRUB_CMDLINE_LINUX_DEFAULT=”elevator=bfq”

tras lo cual, como es lógico hay que actualizar nuestro GRUB2 /boot/grub/grub.cfg así:

sudo grub-mkconfig -o /boot/grub/grub.cfg

Nota: siempre que se instalan nuevos kernels hay que actualicar el GRUB para poder arrancar con ellos si lo deseamos.

Finalmente, si deseas investigar muchas más posiblilidades de kernels para Archlinux, puedes mirar aquí:

https://wiki.archlinux.org/index.php/Kernel

linux_kernel