¡Esta es una revisión vieja del documento!
Tabla de Contenidos
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:
mkinitrdmkinitramfsmake- make targets (
all,config,xconfig,menuconfig,gconfig,oldconfig,mrproper,zImage,bzImage,modules,modules_install,rpm-pkg,binrpm-pkg,deb-pkg) gzipbzip2- module tools
/usr/src/linux/.config/lib/modules/kernel-version/depmoddkms
Pasos:
- Obtener fuentes del kernel
- Herramientas para compilación
- Limpieza
- Configuración
- 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
