Herramientas de usuario

Herramientas del sitio


informatica:certificaciones:lpic:lpic-2:201_linux_kernel:201.2_compiling_a_kernel

201.2: Compiling a kernel

Perteneciente a LPI Topic 201: Linux Kernel.

  • Weight: 3
  • Description: Candidates should be able to properly configure a kernel to include or disable specific features of the Linux kernel as necessary. This objective includes compiling and recompiling the Linux kernel as needed, updating and noting changes in a new kernel, creating an initrd image and installing new kernels.
  • Key Knowledge Areas:
    • /usr/src/linux/
    • Kernel Makefiles
    • Kernel 2.6.x/3.x make targets
    • Customize the current kernel configuration.
    • Build a new kernel and appropriate kernel modules.
    • Install a new kernel and any modules.
    • Ensure that the boot manager can locate the new kernel and associated files.
    • Module configuration files
    • Use DKMS to compile kernel modules.
    • Awareness of dracut
  • Terms and Utilities:
    • mkinitrd
    • mkinitramfs
    • make
    • make targets (all, config, xconfig, menuconfig, gconfig, oldconfig, mrproper, zImage, bzImage, modules, modules_install, rpm-pkg, binrpm-pkg, deb-pkg)
    • gzip
    • bzip2
    • module tools
    • /usr/src/linux/.config
    • /lib/modules/kernel-version/
    • depmod
    • dkms

Pasos:

  1. Obtener fuentes del kernel
  2. Herramientas para compilación
  3. Limpieza
  4. Configuración
  5. Compilación

Obtención de fuentes

El primer paso es obtener las fuentes del kernel: https://kernel.org, eligiendo el enlace de tarball. El fichero puede tener extensión tar.xz o tar.gz, es decir, es un paquete comprimido.

Para descomprimirlo, en caso de tar.xz tendremos que hacer dos pasos:

Descomprimir:

unxz <FUENTES_KERNEL.tar.xz>

Y desempaquetar:

tar xvf <FUENTES_KERNEL.tar> -C /usr/src/
  • -C: permite indicar el directorio de destino antes de desempaquetar.

En caso de tar.gz:

tar zxvf <FUENTES_KERNEL.tar.gz> -C /usr/src/

Una vez descomprimido, las fuentes del kernel deben quedar en /usr/src/linux-<VERSION_KERNEL>

Herramientas para compilación

En Debian es necesario instalar:

apt-get install build-essential bison flex libelf-dev libssl-dev bc libncurses5-dev

En CentOS:

yum group install "Development Tools"

Es posible que hagan falta más herramientas, pero eso lo sabremos cuando empecemos a compilar y nos aparezcan errores.

Limpieza

Para asegurarnos de que comenzamos con un estado limpio del kernel, debemos realizar la limpieza del mismo:

make mrproper

Debemos realizar la operación dentro del directorio con las fuentes del kernel que vamos a compilar

Generar archivo de configuración

La compilación se realiza en función de la información albergada en el archivo .conf que se encuentra en la raíz del directorio de las fuentes. Para generar este fichero:

make menuconfig

Debemos realizar la operación dentro del directorio con las fuentes del kernel que vamos a compilar

Después de hacer los cambios, cuando guardamos y salimos, se generará un fichero .config (si hemos dejado el nombre por defecto)

Compilación

La compilación se realiza ejecutando el comando make:

make

Debemos realizar la operación dentro del directorio con las fuentes del kernel que vamos a compilar

Este proceso dura un tiempo que dependerá de la potencia del equipo donde se haga la compilación.

bzImage

Tras una compilación satisfactoria, debemos crear la imagen:

make bzImage

Debemos realizar la operación dentro del directorio con las fuentes del kernel

Se creará en /usr/src/<VERSION_KERNEL>/arch/x86/boot/bzImage

Instalación de módulos

make modules

Y tras ello:

make modules_install

Los módulos se instalarán en la carpeta /lib/modules/<VERSION_KERNEL>

En versiones antiguas (antes del kernel 3.0), se utiliza make dep

Instalación del kernel

Al finalizar los pasos anteriores, tendríamos:

  • 32 bits: /usr/src/<VERSION_KERNEL>/arch/x86/boot/bzImage
  • 64 bits: /usr/src/<VERSION_KERNEL>/arch/x86_64/boot/bzImage

La instalación se hace copiando simplemente dicho archivo a /boot y se renombra con el formato que tengan las otras imágenes en ese directorio:

cp /usr/src/<VERSION_KERNEL>/arch/x86_64/boot/bzImage /boot/vmlinuz-<VERSION_KERNEL>

Finalmente también tendríamos que añadir los ficheros System.map y .config:

cp /usr/src/<VERSION_KERNEL>/System.map /boot/System.map-<VERSION_KERNEL>
cp /usr/src/<VERSION_KERNEL>/.config /boot/config-<VERSION_KERNEL>

Creación del Ramdisk

Tenemos que dejar a disposición del kernel un ramdisk que contenga el conjunto de módulos compilados para la nueva versión del nuevo kernel:

mkinitramfs -o NOMBRE_IMAGEN_VERSION

Anteriormente se utilizaba el comando mkinitrd

Ejemplo:

mkinitramfs -o initrd.img-4.16.7

Configurar el gestor de arranque

Tenemos que indicarle al gestor de arranque que hay un nuevo kernel para que nos permita elegirlo y arrancarlo. Aquí veremos el ejemplo del cargador de arranque GRUB.

Entramos en /boot/grub.d y editamos, por ejemplo, el fichero llamado 40_custom:

menuentry 'Debian GNU/Linux, with Linux 4.16.7' {
    # Partición del disco donde está el sistema
    set root='hd0,msdos1'
    
    # Kernel a usar
    linux /boot/vmlinuz-4.16.7 root=/dev/sda1 ro single
    
    # Ramdisk donde se descomprimirá el kernel
    initrd /boot/initrd-4.16.7
}

El primer disco es hd0. Y las particiones empiezan a partir del 1. Si el sistema de particiones es MBR, será msdos. hd0,msdos1. Primer disco, MBR y primera partición.

Generamos el nuevo fichero de configuración del GRUB (/boot/grub/grub.cfg):

grub-mkconfig -o grub.cfg

Aplicar los cambios:

update-grub
informatica/certificaciones/lpic/lpic-2/201_linux_kernel/201.2_compiling_a_kernel.txt · Última modificación: por tempwin