Apr 14, 2009

Eliminar los kernels antiguos del gestor de arranque

A medida que vamos actualizando nuestro sistema Linux, también hay veces en las que se actualiza la pieza más importante de todo ese engranaje: el kernel.

Se podría definir al kernel de Linux, también conocido como núcleo, como aquella capa de abstracción entre el hardware y el software a nivel de usuario. O dicho de otra forma, es la parte encargada de proveer el soporte necesario para acceder, gestionar e interactuar con los distintos componentes físicos del sistema.

El kernel por sí solo no puede proveer toda la funcionalidad existente. De hecho estamos ante un software cuyo tamaño es muy pequeño (en comparación con la mayoría de los programas actuales). Por ese motivo lo que se hace es incluir en el núcleo todas aquellas características básicas o primordiales, y a su vez, el propio kernel será el encargado de iniciar el resto de funciones principales durante el arranque. Este conjunto de funcionalidades adicionales irán encapsuladas en lo que se conoce como módulos del sistema (por ejemplo soporte para montar un RAID, tarjeta inalámbrica, etc).

Cada vez que se actualiza el kernel, se genera una nueva entrada en el gestor de arranque, pasando esta última a ser la configuración activa. El resto de kernels son mantenidos por defecto tanto en el disco duro como en el gestor de arranque. Esto puede conllevar a que en nuestro GRUB (un típico gestor de arranque) vaya creciendo cada vez más la lista de kernels disponibles para arrancar el sistema.

Lo habitual va a ser tener un par de kernels: el más actual y la versión anterior (por si ocurre algún problema con el actual). El resto no nos sirven para nada, ocupan espacio en disco y ofuscan la lista del GRUB.

Para eliminar los kernels que no nos sirven, primero tenemos que conocer cuál es nuestro kernel actual (el que está en uso). Para ello ejecutaremos el siguiente comando:

~# uname -a
Linux javi-desktop 2.6.27-11-generic #1 SMP Thu Jan 29 19:24:39 UTC 2009 i686 GNU/Linux


A continuación listaremos todos los kernels instalados en el sistema:

~# aptitude search ~ilinux-image
i linux-image-2.6.27-11-generic - Linux kernel image for version 2.6.27 on x86/x86_64
i linux-image-2.6.27-7-generic - Linux kernel image for version 2.6.27 on x86/x86_64
i linux-image-2.6.27-9-generic - Linux kernel image for version 2.6.27 on x86/x86_64
i linux-image-generic - Imagen genérica del núcleo Linux

Y por último, eliminaremos los núcleos antiguos. Esta última orden también eliminará las entradas en el gestor de arranque.

~# aptitude purge linux-image-2.6.27-7-generic

NOTA: las pruebas se han realizado sobre un sistema operativo Kubuntu.

4 comments:

  1. Regresado de mis vacaciones de Pascua, vuelvo a poner algún comentario en tus post, y espero que a alguien le sirva para aclarar mas las cosas.

    Los modulos del kernel son partes del sistema operativo que pueden cargarse o descargarse en tiempo de ejecución. Generalmente se asocian con device drivers, aunque no tiene por que ser asi.

    Las herramientras básicas para gestionar modulos son lsmod, insmod y rmmod. Ademas, puede usarse modprobe para cargar/descargar modulos evitando manejar a mano las dependencias entre modulos (ver modules.dep del running kernel).

    Lo interesante de los módulos es que pueden instalarse cuando realmente es necesario usar el hardware al que dan soporte. Mientras el modulo no esté cargado, el binario del kernel es mas pequeño, por tanto mas rápido.

    Cuando un modulo se usa siempre (tarjeta de video), lo interesante es compilarlo como parte del kernel (built-in), de forma que irá integrado junto con el binario del kernel y por tanto ahorraremos el tiempo de cargar el modulo cada vez que arranca nuestra maquina. No obstante, esto no es siempre posible (ejemplo driver propietario nvidia).

    ReplyDelete
  2. ¿Cuánto ocupan los micro-kernels de los Linux embebidos con los que trabajas?

    ReplyDelete
  3. Siendo purista (y pedante :-) no puedo hablarte en términos de micro-kernel, puesto que Linux es un kernel monolítico. De micro-kernels sabe un rato el Dr. Andrew S. Tanenbaum (ver Minix).

    Los núcleos Linux para los sistemas embedded que compilamos son para procesadores ARM9 y ARM11. Suelen ser núcleos muy pequeños (del orden de los 500kB), ya que manejan un hardware muy específico . El sistema de ficheros completo (sin contar la aplicación) puede rondar 1MB. Como librería estandar, usamos uClibc (solo 400kB frente a los 1.7MB de la glibc) y para las herramientas del sistema busybox. El resto prácticamente son los scripts de arranque que para un sistema embedded ocupan pocos kB.

    ReplyDelete
  4. Lo digo por el tamaño!

    ~# ls -lh /boot/vmlinuz-2.6.27-11-generic
    -rw-r--r-- 1 root root 2,2M 2009-01-29 22:11 /boot/vmlinuz-2.6.27-11-generic

    Desde hace unos años, los instaladores gráficos ya no dan la opción de crear un disquete de arranque.

    Arriba tienes el motivo, :)

    ReplyDelete