GNU/Linux >> Tutoriales Linux >  >> Debian

Kernels personalizados en Ubuntu/Debian:cómo, cuándo y por qué

Entonces, ha decidido probar esto de lo que escuchó a otros hablar, llamado 'compilar un kernel personalizado'. Si estás intentando esto como un pasatiempo o porque quieres aprender una nueva habilidad, muy bien, sigue leyendo.

Sin embargo, antes de empezar, intentaremos explicar situaciones en las que surge esta necesidad y cómo afrontarla. Tenga en cuenta que este es un tema extenso que necesita mucho más en términos de espacio de lo que proporcionaremos aquí. Aprenderá los conceptos básicos, lo que necesita, lo que debe hacer y lo que logrará.

Para más información, como siempre, Google es tu amigo; Además, la documentación residente en el árbol de fuentes del kernel responderá muchas preguntas. Entonces, comencemos por el principio, con una última nota:si surge la necesidad, publicaremos más artículos relacionados con la compilación del kernel pertenecientes a otras distribuciones.

Cuándo necesitará compilar su propio núcleo

La primera situación sería cuando necesita un kernel más nuevo que el que proporciona su distribución, especialmente cuando ejecuta una distribución estable (por ejemplo, Debian estable, CentOS), porque su kernel no es compatible con alguna característica/controlador que necesita, o simplemente porque siente quieres probar lo último y lo mejor.

Una advertencia, sin embargo: si desea ejecutar un kernel de vanguardia, asegúrese de que sea compatible con otros componentes clave de su sistema (como glibc), recuerde que más reciente significa menos pruebas y (probablemente) más inestabilidad; Los encargados del mantenimiento del kernel de su distribución generalmente hacen un buen trabajo retroalimentando algunas características nuevas a kernels más antiguos y más estables, así que asegúrese de que realmente necesita lo último en tecnología. Nuestro consejo es no utilizar estos núcleos (los núcleos a largo plazo harían una excepción aquí) en sistemas de producción. Como se dijo, confíe en los mantenedores de su distribución.

La segunda situación es que siente que está ejecutando un kernel inflado, con muchos componentes innecesarios. Si bien el kernel solo carga módulos que coinciden con una pieza de hardware existente, una huella de memoria más pequeña del kernel generalmente ayuda a acelerar y acelerar el tiempo de arranque.

# lspci -vv
# lsusb
# hwinfo
# cat /proc/cpuinfo

Los comandos anteriores lo ayudan a conocer mejor su hardware. Anote lo que encontró y asegúrese de ejecutar los comandos ls* anteriores como root, para obtener información adicional.

Otra situación sería si desea ayudar a probar el kernel ejecutando la última versión en su sistema. Se aplican las mismas advertencias anteriores:hágalo en los sistemas de prueba, manténgase en contacto con upstream en caso de que encuentre un error (lkml.org es la lista de correo principal del kernel:alto tráfico) e intente ser lo más útil posible cuando se le solicite información. Esto no se puede enfatizar lo suficiente:lea la documentación, ya sea porque se encuentra en una situación desagradable, desea informar un error o simplemente tiene preguntas.

A continuación, es posible que desee ser el chico genial de la cuadra y ejecutar lo último y lo mejor, tal vez echando un vistazo a la fuente (siempre que le interese esto y tenga algún conocimiento de C y ASM) e incluso enviar parches. Es posible que desee buscar primero si su distribución aún no ofrece un paquete de kernel más nuevo, por ejemplo, puede instalar kernels de Debian experimental en un sistema de prueba, si modifica su source.list en consecuencia. Nuevamente, trabaje con los mantenedores si encuentra un error.

Terminología

Antes de profundizar más en este tema algo arcano, debemos aclarar algunos términos básicos (er); esto es esencial para comprender las partes clave de las pruebas y la compilación del kernel.

  • núcleo: El núcleo del sistema operativo, responsable de administrar los recursos de hardware (E/S, redes, CPU, memoria…). Básicamente, es la parte esencial del sistema operativo responsable de todo el trabajo sucio. Los programas de usuario se comunican con el núcleo, solicitando tiempo de CPU u otros recursos mediante bibliotecas del sistema que actúan como intermediarios entre el espacio del usuario (ver más abajo) y el núcleo/hardware. Los núcleos pueden ser monolíticos y micronúcleos (para obtener más información, si está interesado, consulte Enfoques de diseño de todo el núcleo en Wikipedia.org. Los micronúcleos (como Minix) utilizan un esquema de diseño que divide el núcleo del resto del núcleo y que El resto se divide en componentes, cada uno haciendo algo específico:E/S, redes, etc. Los núcleos monolíticos (Linux, BSD, Solaris), como sugiere el nombre, comprenden la mayor parte del núcleo en una unidad, con funcionalidad adicional (por ejemplo, controladores ) proporcionados por módulos. También hay kernels híbridos, una combinación entre los dos, un buen ejemplo es el kernel de Windows.
  • zona de usuario – Se dice que todo en un sistema operativo que no es parte del kernel (bibliotecas, aplicaciones) es parte de la zona de usuario. El nombre es así de obvio.
  • módulo – como se mostró anteriormente, un módulo del kernel es una pieza de software binario que básicamente "enseña" al kernel cómo "hablar" con una pieza de hardware o proporcionar alguna funcionalidad (por ejemplo, nfs)
  • compilador – el compilador es una aplicación que básicamente toma el código escrito, tal como lo descargaste de kernel.org, y lo transforma en archivos binarios. El compilador que se encuentra en las distribuciones de Linux se llama 'gcc', y significa GNU Compiler Collection, que también necesita componentes esenciales para crear software:utilidades que se encuentran en binutils como el ensamblador (as) o el archivador de bibliotecas (ar). En los sistemas Debian, o Ubuntu, uno puede encontrar a qué paquete pertenece un archivo instalando y ejecutando apt-file. Hablando de eso, veamos qué paquetes necesitamos instalar para una compilación exitosa del kernel.
  • grano de vainilla – este es el nombre que se usa para el kernel upstream, como se encuentra en kernel.org, por lo que no tiene parches específicos de la distribución.

Tenga en cuenta que cada vez que vea un comando en este documento que comience con el indicador ‘$’ eso significa que el comando deberá ejecutarse como un usuario normal y cotidiano; cada vez que vea el '#' indicador, eso significa que el comando debe ejecutarse como root (usamos sudo, pero eso no es obligatorio). El directorio actual, a menos que se especifique lo contrario, es el que contiene su árbol fuente, en este caso, linux-2.6.

Lo que necesitas para instalar

  • gcc:por supuesto, el compilador es esencial
  • binutils:este paquete contiene el enlazador, el ensamblador y otras utilidades vitales para compilar programas escritos en C.
  • gcc-doc:el manual y las páginas de información de gcc. Útil si quiere ensuciarse y modificar algunos indicadores de compilación. Útil de todos modos si quieres escribir o compilar paquetes C.
  • gdb:el depurador de GNU. No es obligatorio pero es útil si algo sale mal. Gdb-doc también ayudará.
  • libreadline5-dev:para usar la interfaz basada en ncurses de configuración del kernel. Puede utilizar otras interfaces (ver más abajo).
  • make:se instalará como dependencia, pero hay pocas palabras en orden. Consulte el manual o los libros, porque este no es un tema para ser explicado a la ligera en un espacio tan corto. Make es una utilidad que se usa al compilar programas C/C++, y lo que hace es buscar en un Makefile, que contiene reglas sobre cómo y en qué orden debe ocurrir la compilación, e intenta ejecutar esas directivas. Lea los Makefiles en el árbol de código fuente para echar un vistazo.
  • git:Git es un VCS (sistema de control de versiones), que hace lo que hace cvs o subversion, es decir, mantenerlo actualizado con el árbol del kernel más reciente.

Obteniendo la fuente del núcleo

Si desea instalar la fuente desde su distribución, use

# apt-get install linux-source-<version>

donde se puede recopilar emitiendo:

uname -r

Use esto si desea modificar su kernel existente (agregar controladores, recortar, etc.). De lo contrario, quieres la semilla de vainilla. Puede obtenerlo de www.kernel.org (sugerimos wget o curl aquí como administradores de descargas) o, si quiere la última versión, usará git. Recomendamos almacenar la fuente en el directorio de inicio de su usuario, y el comando para obtener el árbol principal más reciente es (ver man git):

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git linux-2.6

En el pasado encontramos útil el mini-howto en http://linux.yyz.us/git-howto.html; también echa un vistazo a kernelnewbies.org. El comando anterior creará una carpeta en su directorio actual llamada linux-2.6, que se puede actualizar más tarde ingresando con un cd y emitiendo un simple

make clean; git pull 

Ahora, después de tener la fuente, tendremos que configurar el kernel.

Configuración y construcción

Si tiene un archivo .config existente (el archivo que contiene las opciones para la construcción del kernel, lo que entra y lo que no), cópielo en linux-2.6 (desde /boot/config- o /proc/config .gz – la configuración actual). Si no desea modificar el .config existente, simplemente emita

$ make oldconfig

De lo contrario, sigue leyendo. Si desea modificar la configuración existente, emita

$ make menuconfig

(recomendación:puede usar make config para muchas preguntas sobre opciones en el kernel, o make xconfig, que requiere bibliotecas qt, para un menú gráfico más agradable), y seleccione "Cargar un archivo de configuración alternativo" y presione enter para .config , el nombre predeterminado del archivo de configuración, o escriba un nombre de archivo alternativo ya guardado en linux-2.6.

Después de eso, comienza a revisar los menús para hacer las modificaciones necesarias. La regla general aquí es "si no sabes lo que hace, no te metas con él", al menos hasta que adquieras algo de experiencia. Al final, desde el menú superior, seleccione "Guardar un archivo de configuración alternativo", presione enter para el nombre predeterminado (.config - recomendado) y luego "Salir" desde abajo. Si desea comenzar desde cero, olvídese del paso "Cargar un archivo de configuración alternativo" y continúe. En su próxima compilación del kernel, después de limpiar y actualizar el árbol, use 'make oldconfig' como se indicó anteriormente para usar la configuración anterior. Bien, ahora tenemos la configuración adaptada a nuestras necesidades que solo espera ser construida. Construir un kernel es tan simple como configurarlo (!). Simplemente escriba make y la salida debería verse como a continuación:

$ make 

  HOSTCC  scripts/basic/fixdep 
  HOSTCC  scripts/kconfig/conf.o 
  SHIPPED scripts/kconfig/zconf.tab.c 
  SHIPPED scripts/kconfig/zconf.lex.c 
  SHIPPED scripts/kconfig/zconf.hash.c 
  HOSTCC  scripts/kconfig/zconf.tab.o 
  HOSTLD  scripts/kconfig/conf 
  
  CHK     include/linux/version.h 
  UPD     include/linux/version.h 
  CHK     include/generated/utsrelease.h 
  UPD     include/generated/utsrelease.h 
  CC        kernel/bounds.s 
  GEN     include/generated/bounds.h 
  CC        arch/x86/kernel/asm-offsets.s 
...

y, después de un tiempo, dependiendo de la configuración de su máquina y kernel, estará listo. Si quiere acelerar un poco las cosas, use el indicador -jn para hacer, donde n es el número de procesadores/núcleos + 1. Sin embargo, tenga cuidado, eso puede exponer errores en el kernel o construir la infraestructura, así que si algo sale mal, inténtalo de nuevo simplemente usando make sin banderas. Si después de leer el manual de gcc (y si todavía está cuerdo), se siente aventurero y desea modificar algunos indicadores específicos del hardware, o tiene ganas de optimizar el código, use la página del manual de creación para averiguar cómo (principalmente COPTS y CFLAGS ). Sin embargo, las optimizaciones mayores que -O2 son riesgosas.

Tenga cuidado y espere roturas, el núcleo puede compilarse sin problemas, pero puede actuar de manera extraña. Recuerde escribir todos los comandos como un usuario normal. No es necesario compilar como root y los desarrolladores del kernel desaprueban la idea.

Instalación

Ahora instalemos los módulos:esto debe hacerse como root, ya que los módulos están instalados en /lib y el usuario normal no tiene acceso de escritura allí. Entonces,

# make modules_install 

hace exactamente eso, y esto debe hacerse antes de instalar el kernel para que los módulos y el kernel instalado estén sincronizados. Usar

# make install 

para instalar el kernel en /boot, luego

# depmod 

y prepárese para crear un initramfs (sistema de archivos RAM inicial), que es un sistema de archivos temporal cargado en la RAM en las primeras etapas de arranque, y se utiliza para proporcionar controladores básicos y otras funciones para montar el sistema de archivos raíz. Se puede encontrar más información en la página Initrd de Wikipedia. El comando necesario para la tarea es update-initramfs (también se invoca cada vez que se instala un nuevo kernel, activado por el administrador de paquetes) que puede crear un initramfs (-c) o actualizar uno existente (-u). El comando completo es

# update-initramfs -c -k  

La versión es la que verá después de que finalice 'hacer módulos_instalar' (la última línea de su salida será "DEPMOD"). Si desea tener el número de versión exacto y más largo, puede decirles a los desarrolladores qué "momento git" que usó, seleccione "Configuración general" → "Agregar automáticamente información de versión a la cadena de versión" después de emitir menuconfig. La salida en mi sistema Ubuntu se ve así:

update-initramfs: Generating /boot/initrd.img-3.1.0-rc3+
...

Actualice su Grub para que detecte su nuevo núcleo con

# update-grub

En mi máquina de prueba Debian, el resultado se ve así:

Generating grub.cfg ... 
Found background image: /usr/share/images/desktop-base/desktop-grub.png 
Found linux image: /boot/vmlinuz-3.0.0-1-amd64 
Found initrd image: /boot/initrd.img-3.0.0-1-amd64 
Found linux image: /boot/vmlinuz-3.0.0-rc6-amd64 
Found initrd image: /boot/initrd.img-3.0.0-rc6-amd64 
Found linux image: /boot/vmlinuz-2.6.39-07727-gbd1bfe4 
Found initrd image: /boot/initrd.img-2.6.39-07727-gbd1bfe4 
Found linux image: /boot/vmlinuz-2.6.39-2-amd64 
Found initrd image: /boot/initrd.img-2.6.39-2-amd64 
Found linux image: /boot/vmlinuz-2.6.39-rc7-amd64 
Found initrd image: /boot/initrd.img-2.6.39-rc7-amd64 
Found linux image: /boot/vmlinuz-2.6.38.5 
Found initrd image: /boot/initrd.img-2.6.38.5 
Found linux image: /boot/vmlinuz-2.6.38.4-00001-gfaa8ee7 
Found initrd image: /boot/initrd.img-2.6.38.4-00001-gfaa8ee7 
Found linux image: /boot/vmlinuz-2.6.38.4 
Found initrd image: /boot/initrd.img-2.6.38.4 
Found linux image: /boot/vmlinuz-2.6.38-2-amd64 
Found initrd image: /boot/initrd.img-2.6.38-2-amd64 
Found linux image: /boot/vmlinuz-2.6.32-5-amd64 
Found initrd image: /boot/initrd.img-2.6.32-5-amd64 
Found memtest86+ image: /memtest86+.bin 
Found memtest86+ multiboot image: /memtest86+_multiboot.bin 
done 

Por supuesto, su salida no se verá exactamente igual, pero el contorno debería ser el mismo; finalmente, recuerde:si quiere, edite /etc/default/grub para modificar algunas opciones antes de actualizar-grub y, con los dedos cruzados, reinicie su máquina para probar el nuevo kernel.

Si algo sale mal

Las situaciones más comunes cuando su nuevo kernel no se puede usar es que no puede arrancarlo en primer lugar, o que arranca y no tiene algún controlador esencial (por ejemplo, controladores de red). Por lo general, update-grub hace un buen trabajo al escribir el archivo de menú de grub, pero es posible que desee verificarlo de todos modos. Si pasa grub, es probable que se haya vuelto demasiado entusiasta y elimine un controlador esencial para el sistema, como las partes relacionadas con el disco (ATA, SATA, SCSI...), o tal vez NFS, si tiene una raíz montada en NFS. Inicie un kernel que funcione y vuelva a configurarlo, usando Google y otras posibles fuentes, como IRC.

Es probable que alguien ya haya tropezado con su problema en el pasado y usted tiene posibilidades de encontrar una respuesta. Si el problema es más serio y está seguro de haber leído sobre la etiqueta de la red y cómo publicar en la lista de correo del kernel, pregunte amablemente. Hay muchas personas amables y serviciales, pero tienden a no ser tan amables cuando no has hecho tu tarea y/o les haces perder el tiempo. Si tiene un /boot separado, tenga en cuenta que, por lo general, no es muy grande y puede llenarse de núcleos rápidamente. Además, /lib/modules tiende a acumular mucho espacio en /, así que asegúrese de hacer una limpieza de vez en cuando. Recuerde que el kernel es una pieza de software compleja y muchas causas pueden estar en la raíz de sus problemas. Si no tuvo problemas para seguir esta guía, está listo para una configuración más avanzada del kernel de Linux.


Debian
  1. Cómo instalar Python 3.7 en Ubuntu, Debian y LinuxMint

  2. Debian:¿cómo hacer antes del arranque dual de Windows 7 y Debian en Efi?

  3. ¿Por qué Ubuntu necesita dos núcleos?

  4. Cómo instalar Monit (Monitoreo de procesos y servicios) en Ubuntu / Debian

  5. Cómo compilar e instalar wxWidgets en Ubuntu/Debian/Linux Mint

Cómo instalar el último kernel en Debian 11 y derivados

Cómo instalar los derivados de Zoom Ubuntu y Debian

Cómo instalar Jitsi Meet en Debian y Ubuntu

Cómo instalar ONLYOFFICE Docs en Debian y Ubuntu

Cómo crear un usuario Sudo en Ubuntu y Debian

Cómo instalar Grafana en Ubuntu 18.04 y Debian 8