¡Esta es una revisión vieja del documento!
Tabla de Contenidos
Un nuevo Kernel en Debian-12
Actualmente podemos bajar desde Kernel.org que se encuentra disponible la versión estable, en nuestro caso la versión Kernel-linux-6.15 que procedemos a descargar.
Para poder descargar el código fuente, debemos abrir un terminal logearnos como root, y debemos ejecutar los siguientes comandos:
# cd # mkdir kernel # cd kernel # wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.15.tar.xz # tar -Jxvf linux-6.15.tar.xz # cd linux-6.15
Una vez que hayamos creado el directorio y tengamos descomprimido la versión del kernel, instalaremos todos los paquetes necesarios para compilar nuestro kernel, con los comandos siguientes:
# apt install build-essential libncurses5-dev fakeroot \ libssl-dev gcc bc bison flex libelf-dev kmod cpio \ rsync python3 -y
Esto nos instalará en nuestro sistema los paquetes y dependencias necesarias para compilar nuestro kernel, por lo que estaremos con nuestras herramientas disponible para lograrlo e instalarlo.
Preparando nuestro sistema
Ahora deberemos de copiar las configuraciones del kernel que tiene nuestro Debian 12, en su kernel por defecto que es la versión linux-6.1.0-37 a la fecha de escritura de esta documentación. Para proceder a copiar la configuración, debemos ejecutar lo sgte:
# cp /boot/config-6.1.0-37-amd64 .config
Una vez con la configuración copiada, lo que recomiendo es sacar la configuración de DEBUG que se encuentra activada por defecto en nuestra configuración del kernel, para ello editamos el archivo que acabamos de copiar y cambiamos las siguientes lineas a:
// Estas variables deben quedar así: CONFIG_DEBUG_INFO=n CONFIG_DEBUG_INFO_BTF=n CONFIG_DEBUG_INFO_BTF_MODULES=n // Haciendo las modificaciones # sd CONFIG_DEBUG_INFO=y CONFIG_DEBUG_INFO=n .config # sd CONFIG_DEBUG_INFO_BTF=y CONFIG_DEBUG_INFO_BTF=n .config # sd CONFIG_DEBUG_INFO_BTF_MODULES=y CONFIG_DEBUG_INFO_BTF_MODULES=n .config
Guardamos y dejamos ambas variables en n⇒no
, de tal forma que en la compilación no generamos información de depuración que nos permite disponer de información en caso de tener una falla.
Ahora podemos agregar soporte de escritura y lectura para los sistemas de archivos de DOS, NTFS, ExFAT para mantener compatibilidad con pendrive que fueron formateados desde MS. Para ello lo que haremos el editar el menú de configuración del kernel:
# make menuconfig File systems --> DOS/FAT/EXFAT/NT Filesystems <*> NTFS Read-Write file system support --> Marcamos todas las opciones
Después solo guardamos y salimos de la configuración del kernel.
Compilando el kernel
Una vez listo el paso anterior, tenemos todo listo para iniciar la compilación del kernel, para ello lo que haremos es detectar la cantidad de núcleos que tenemos disponibles para asignarle al compilador el total de núcleos de nuestra maquina:
nproc // Nos proporciona el numero de procesadores 36 time make -j36 // Compilamos con medición del tiempo de compilación
Esto nos permite iniciar la compilación pero con la captura del tiempo que nos tomará con los recursos que tenemos, por eso hemos puesto el comando time
antes del ṃakẹ -j36
, esto sin duda toma un tiempo y nos debería entregar algo como esto:
real 15m58,730s user 530m22,037s sys 28m51,032s root@athos:~/linux-6.15#
Como podemos observar la compilación nos ha tomado 15 minutos con 58,73 segundos, es decir poco tiempo de compilación, considerando que en otras máquinas mas antiguas y versiones distintas del kernel, tomaba horas.
Integrando los Módulos al nuevo kernel
Ahora lo que procede es integrar al nuevo kernel, los módulos que han sido compilados en el proceso anterior, pero deben ser firmados e integrados a esta nueva versión del kernel, esto lo hacemos con los comandos siguientes:
root@athos:~/linux-6.15# time make modules -j36 mkdir -p /root/linux-6.15/tools/objtool && make O=/root/linux-6.15 subdir=tools/objtool --no-print-directory -C objtool INSTALL libsubcmd_headers CALL scripts/checksyscalls.sh real 0m15,784s user 1m28,815s sys 0m25,654s root@athos:~/linux-6.15#
Ahora lo que procede es firmarlos e instalarlos, esto lo haremos con el comando:
root@athos:~/linux-6.15# time make modules_install -j36 real 0m7,777s user 2m25,998s sys 0m26,824s root@athos:~/linux-6.15#
Instalando el nuevo kernel
Para instalar nuestro kernel debemos ejecutar lo siguiente:
# make install
Con esto debemos tener el nuevo kernel instalado en nuestro sistema, pero antes de reiniciar la maquina, necesitamos realizar un par de cambios importantes
IMPORTANTE: No reinicie su maquina, sin antes realizar los cambios indicados a continuación, ya que si no los hace, su máquina quedará con un mensaje Error: sin memoria al momento de cargar el nuevo kernel.
Modificando el initramfs
Para proceder con estos cambios debemos editar el archivo initramfs.conf
que lo encontramos en /etc/initramfs-tools/initramfs.conf
, debemos cambiar dos variables a:
# nvim /etc/initramfs-tools/initramfs.conf // Valores por defecto: MODULES=most COMPRESS=zstd //Y los debe modificar a: MODULES=dep COMPRESS=xz
o tambien puede ejecutar:
# sd MODULES=most MODULES=dep /etc/initramfs-tools/initramfs.conf # sd COMPRESS=zstd COMPRESS=xz /etc/initramfs-tools/initramfs.conf
Con esto queda resuelto el problema del Error: sin memoria, pero además necesitamos que los cambios sean aplicados:
# update-initramfs -c -k all # update-grub2
Una vez que haya ejecutado como root los comandos precedentes, podrá reiniciar su maquina y esta se iniciará sin problemas, con su nuevo kernel y adaptado a las características de su propia máquina, lo cuan siempre es una ventaja.
Eliminar los kernels antiguos
A medida que vamos actualizando nuestro sistema operativo van quedando instaladas las versiones antiguas del kernel Linux. Aquí veremos como eliminarlos
Para saber cuál es nuestro kernel actual escribimos:
# uname -r
Esto nos muestra la versión del kernel que estamos ejecutando. Para ver el listado de todos los kernels que tenemos instalado en nuestra máquina, ejecutamos como root
en una terminal lo siguiente:
# dpkg --list | grep linux-image # dpkg --get-selections |grep "linux-image\|linux-headers"
Esto nos proporcionará una lista de los kernels que tenemos instalado en nuestro sistema, y deberemos eliminar obviamente los más antiguos que tengamos instalados, en nuestro ejemplo:
# apt remove --purge linux-image-6.1.0-18-amd64 linux-image-6.1.0-21-amd64
Esto eliminará esas versiones específicas de los kernels que teníamos instalado en nuestra maquina. También debemos actualizar el grub2 con el siguiente comando ejecutado con root
# update-grub2
Y finalmente debemos reiniciar nuestra maquina, para que parte con el nuevo kernel que hemos compilado.
Problemas de Compilacion con Driver NVidia
Cuando compilamos un kernel nuevo y tenemos en nuestro sistema una tarjeta NVidia, lo normal es que al momento de realizar un make install, es dar un error al tratar de instalar ese kernel, independiente del tipo de version que este instalan.
El error que da, es similar a este:
# make install INSTALL /boot run-parts: executing /etc/kernel/postinst.d/dkms 6.14.11 /boot/vmlinuz-6.14.11 dkms: running auto installation service for kernel 6.14.11. Sign command: /lib/modules/6.14.11/build/scripts/sign-file Signing key: /var/lib/dkms/mok.key Public certificate (MOK): /var/lib/dkms/mok.pub Building module: Cleaning build area... env NV_VERBOSE=1 make -j36 modules KERNEL_UNAME=6.14.11...(bad exit status: 2) Error! Bad return status for module build on kernel: 6.14.11 (x86_64) Consult /var/lib/dkms/nvidia-current/535.247.01/build/make.log for more information. Error! One or more modules failed to install during autoinstall. Refer to previous errors for more information. dkms: autoinstall for kernel: 6.14.11 failed! run-parts: /etc/kernel/postinst.d/dkms exited with return code 11 make[1]: *** [arch/x86/Makefile:321: install] Error 1 make: *** [Makefile:251: __sub-make] Error 2
Estas enfrentando un problema comun cuando DKMS intenta compilar automaticamente los modulos del controlador NVIDIA tras instalar un nuevo kernel personalizado (en este caso, 6.14.11 en Debian 12). El proceso de make install falla debido a que el modulo de NVIDIA no es compatible o no puede compilarse correctamente con ese nuevo kernel.
El mensaje clave es:
Error! Bad return status for module build on kernel: 6.14.11 (x86_64) Consult /var/lib/dkms/nvidia-current/535.247.01/build/make.log for more information.
Puedes tratar de ver el error en los log's con el comando:
less /var/lib/dkms/nvidia-current/535.247.01/build/make.log
Y buscar un error como:
- fatal error: xxxx.h: No such file or directory
- unknown symbol o problemas de API del kernel
Este log te dira si el modulo necesita parches o si es una incompatibilidad directa.
Solucion que me funciono
Una de las posibilidades de solucion es deshabilitar la compilacion automatica de los modulos (NVidia en este caso) al instalar el kernel, para deshabilitar usamos el comando:
# mv /etc/kernel/postinst.d/dkms /etc/kernel/postinst.d/dkms.disabled
Una vez hecho esto, debemos volver a ejecutar:
# make install
Esto instalara el nuevo kernel sin tratar de compilar de nuevo el modulo de NVidia.
Una vez instalado el nuevo kernel, debemos reiniciar el computador, pero debemos tener en cuenta que el sistema no podra levantar el ambiente grafico porque no hemos instalado los modulos de NVidia.
Una vez que se ha reiniciado, nos presentara un terminal en texto, nos logearemos como root, nuevamente y ejecutaremos en el terminal:
# dkms autoinstall
Esto buscara los modulos de NVidia de la version del kernel-6.14.11 e instalara esos modulos en el nuevo kernel, hay que tener en cuenta que si usamos la ultima version del kernel de linux, es muy posible que los modulos de NVidia, aun no esten liberados para ser instalados en esa version del kernel, asi que hay que tener esto en cuenta.
Si este es tu caso, considera bajar a una version inmediatamente inferior del kernel y repetir el proceso. Es muy posible que ahi ya tengas los modulos liberados para ser instalados.
Ahora deberemos restaurar dkms al terminar este proceso, esto lo hacemos con:
# mv /etc/kernel/postinst.d/dkms.disabled /etc/kernel/postinst.d/dkms
Este dejara habilitada la opción de la compilcion automatica de los modulos para el kernel.