GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo compilar un kernel de Linux en el siglo XXI

En informática, un kernel es el software de bajo nivel que maneja la comunicación con el hardware y la coordinación general del sistema. Además de algún firmware inicial integrado en la placa base de su computadora, cuando enciende su computadora, el kernel es lo que le da a conocer que tiene un disco duro, una pantalla, un teclado y una tarjeta de red. También es trabajo del kernel garantizar que se dé el mismo tiempo (más o menos) a cada componente para que sus gráficos, audio, sistema de archivos y red funcionen sin problemas, incluso si se ejecutan simultáneamente.

Sin embargo, la búsqueda de soporte de hardware continúa, porque cuanto más hardware se lanza, más cosas debe adoptar un núcleo en su código para que el hardware funcione como se espera. Es difícil obtener cifras precisas, pero el kernel de Linux se encuentra sin duda entre los principales kernels en cuanto a compatibilidad de hardware. Linux opera innumerables computadoras y teléfonos móviles, placas de sistema integrado en un chip (SoC) para uso industrial y de aficionados, tarjetas RAID, máquinas de coser y mucho más.

Contenido relacionado

En el siglo XX (e incluso en los primeros años del XXI), no era descabellado que un usuario de Linux esperara que cuando comprara una pieza de hardware muy nueva, necesitaría descargar el código fuente del kernel más reciente, compílelo e instálelo para que puedan obtener soporte para el dispositivo. Últimamente, sin embargo, le resultará difícil encontrar un usuario de Linux que compile su propio kernel, excepto por diversión o para obtener ganancias a través de hardware personalizado altamente especializado. Por lo general, no es necesario en estos días compilar el kernel de Linux usted mismo.

Estas son las razones, además de un tutorial rápido sobre cómo compilar un kernel cuando lo necesite.

Actualice su kernel existente

Ya sea que tenga una computadora portátil nueva con una nueva tarjeta gráfica elegante o un conjunto de chips WiFi o que acaba de traer a casa una impresora nueva, su sistema operativo (llamado GNU+Linux o simplemente Linux, que también es el nombre del kernel ) necesita un controlador para abrir canales de comunicación a ese nuevo componente (tarjeta gráfica, chip WiFi, impresora o lo que sea). Puede ser engañoso, a veces, cuando conecta un nuevo dispositivo y su computadora aparece para reconocerlo. Pero no dejes que eso te engañe. A veces eso es todo lo que necesita, pero otras veces su sistema operativo solo usa protocolos genéricos para sondear un dispositivo que está conectado.

Por ejemplo, su computadora puede identificar su nueva impresora de red, pero a veces eso es solo porque la tarjeta de red en la impresora está programada para identificarse en una red para que pueda obtener una dirección DHCP. No significa necesariamente que su computadora sepa qué instrucciones enviar a la impresora para producir una página de texto impreso. De hecho, podría argumentar que la computadora ni siquiera "sabe" realmente que el dispositivo es una impresora; solo puede mostrar que hay un dispositivo en la red en una dirección específica y el dispositivo se identifica con la serie de caracteres p-r-i-n-t-e-r . Las convenciones del lenguaje humano no tienen sentido para una computadora; lo que necesita es un controlador.

Los desarrolladores de kernel, los fabricantes de hardware, los técnicos de soporte y los aficionados saben que constantemente se lanza nuevo hardware. Muchos de ellos contribuyen con controladores, enviados directamente al equipo de desarrollo del kernel para su inclusión en Linux. Por ejemplo, los controladores de la tarjeta gráfica Nvidia a menudo se escriben en el módulo del kernel de Nouveau y, debido a que las tarjetas Nvidia son comunes, el código generalmente se incluye en cualquier kernel distribuido para uso general (como el kernel que obtiene cuando descarga Fedora o Ubuntu). Nvidia es menos común, por ejemplo, en sistemas integrados, el módulo Nouveau generalmente se excluye. Existen módulos similares para muchos otros dispositivos:las impresoras se benefician de Foomatic y CUPS, las tarjetas inalámbricas tienen módulos b43, ath9k, wl, etc.

Las distribuciones tienden a incluir todo lo que razonablemente pueden en sus compilaciones de kernel de Linux porque quieren que pueda conectar un dispositivo y comenzar a usarlo de inmediato, sin necesidad de instalar un controlador. En su mayor parte, eso es lo que sucede, especialmente ahora que muchos proveedores de dispositivos financian el desarrollo de controladores de Linux para el hardware que venden y envían esos controladores directamente al equipo del kernel para su distribución general.

A veces, sin embargo, está ejecutando un kernel que instaló hace seis meses con un dispositivo nuevo y emocionante que acaba de llegar a las tiendas hace una semana. En ese caso, es posible que su kernel no tenga un controlador para ese dispositivo. La buena noticia es que, muy a menudo, puede existir un controlador para ese dispositivo en una edición muy reciente del kernel, lo que significa que todo lo que tiene que hacer es actualizar lo que está ejecutando.

Generalmente, esto se hace a través de un administrador de paquetes. Por ejemplo, en RHEL, CentOS y Fedora:

$ sudo dnf update kernel

En Debian y Ubuntu, primero obtenga su versión actual del kernel:

$ uname -r
4.4.186

Buscar versiones más nuevas:

$ sudo apt update
$ sudo apt search linux-image

Instale la última versión que encuentre. En este ejemplo, la última disponible es 5.2.4:

$ sudo apt install linux-image-5.2.4

Después de una actualización del kernel, debe reiniciar (a menos que esté usando kpatch o kgraft). Entonces, si el controlador de dispositivo que necesita está en el kernel más reciente, su hardware funcionará como se esperaba.

Instalar un módulo del kernel

A veces, una distribución no espera que sus usuarios usen un dispositivo con frecuencia (o al menos no lo suficiente como para que el controlador del dispositivo deba estar en el kernel de Linux). Linux adopta un enfoque modular para los controladores, por lo que las distribuciones pueden enviar paquetes de controladores separados que el kernel puede cargar aunque el controlador no esté compilado en el propio kernel. Esto es útil, aunque puede complicarse cuando un controlador no está incluido en un kernel pero se necesita durante el arranque, o cuando el kernel se actualiza desde el controlador modular. El primer problema se resuelve con un initrd (disco RAM inicial) y está fuera del alcance de este artículo, y el segundo se resuelve mediante un sistema llamado kmod .

El sistema kmod garantiza que cuando se actualiza un kernel, también se actualizan todos los controladores modulares instalados junto con él. Si instala un controlador manualmente, se perderá la automatización que proporciona kmod, por lo que debe optar por un paquete kmod siempre que esté disponible. Por ejemplo, mientras que los controladores de Nvidia están integrados en el kernel como el controlador Nouveau, los controladores oficiales de Nvidia solo los distribuye Nvidia. Puede instalar los controladores de la marca Nvidia manualmente yendo al sitio web y descargando .run y ejecutar el script de shell que proporciona, pero debe repetir el mismo proceso después de instalar un nuevo kernel, porque nada le dice a su administrador de paquetes que instaló manualmente un controlador de kernel. Debido a que Nvidia controla sus gráficos, actualizar el controlador de Nvidia manualmente generalmente significa que debe realizar la actualización desde una terminal, porque no tiene gráficos sin un controlador de gráficos funcional.

Sin embargo, si instala los controladores de Nvidia como un paquete kmod, la actualización de su kernel también actualiza su controlador de Nvidia. En Fedora y relacionados:

$ sudo dnf install kmod-nvidia

En Debian y relacionados:

$ sudo apt update
$ sudo apt install nvidia-kernel-common nvidia-kernel-dkms nvidia-glx nvidia-xconfig nvidia-settings nvidia-vdpau-driver vdpau-va-driver

Este es solo un ejemplo, pero si está instalando controladores Nvidia en la vida real, también debe incluir en la lista negra el controlador Nouveau. Consulte la documentación de su distribución para conocer los mejores pasos.

Descargar e instalar un controlador

No todo está incluido en el kernel, y no todo else está disponible como un módulo del núcleo. En algunos casos, debe descargar un controlador especial escrito y empaquetado por el proveedor del hardware y, en otras ocasiones, tiene el controlador pero no la interfaz para configurar las opciones del controlador.

Dos ejemplos comunes son las impresoras HP y las tabletas de ilustración Wacom. Si obtiene una impresora HP, probablemente tenga controladores genéricos que puedan comunicarse con su impresora. Es posible que incluso pueda imprimir. Pero es posible que el controlador genérico no pueda proporcionar opciones especializadas específicas para su modelo, como impresión a doble cara, intercalación, opciones de bandejas de papel, etc. HPLIP (el sistema de imágenes e impresión HP Linux) brinda opciones para administrar trabajos, ajustar las opciones de impresión, seleccionar bandejas de papel cuando corresponda, etc.

HPLIP generalmente se incluye en administradores de paquetes; simplemente busque "hplip".

De manera similar, los controladores para tabletas Wacom, la tableta de ilustración líder para artistas digitales, generalmente se incluyen en su kernel, pero las opciones para ajustar la configuración, como la sensibilidad a la presión y la funcionalidad de los botones, solo son accesibles a través del panel de control gráfico incluido de forma predeterminada con GNOME pero instalable como paquete extra kde-config-tablet en KDE.

Es probable que haya algunos casos extremos que no tengan controladores en el kernel pero que ofrezcan versiones kmod de módulos de controladores como un archivo RPM o DEB que puede descargar e instalar a través de su administrador de paquetes.

Parchear y compilar su propio kernel

Incluso en la utopía futurista que es el siglo XXI, hay proveedores que no comprenden lo suficiente el código abierto como para proporcionar controladores instalables. A veces, estas empresas proporcionan el código fuente de un controlador, pero esperan que usted descargue el código, parchee un kernel, compile e instale manualmente.

Este tipo de modelo de distribución tiene las mismas desventajas que la instalación de controladores empaquetados fuera del sistema kmod:una actualización de su kernel rompe el controlador porque debe reintegrarse en su kernel manualmente cada vez que se cambia el kernel por uno nuevo.

Afortunadamente, esto se ha vuelto raro porque el equipo del kernel de Linux ha hecho un excelente trabajo al suplicar en voz alta a las empresas que se comuniquen con ellos, y porque las empresas finalmente están aceptando que el código abierto no desaparecerá en el corto plazo. Pero todavía existen dispositivos novedosos o hiperespecializados que solo brindan parches de kernel.

Oficialmente, existen preferencias específicas de distribución sobre cómo debe compilar un kernel para mantener a su administrador de paquetes involucrado en la actualización de una parte tan vital de su sistema. Hay demasiados administradores de paquetes para cubrir cada uno; como ejemplo, esto es lo que sucede detrás de escena cuando usa herramientas como rpmdev en Fedora o build-essential y devscripts en Debian.

Primero, como de costumbre, averigüe qué versión del kernel está ejecutando:

$ uname -r

En la mayoría de los casos, es seguro actualizar su kernel si aún no lo ha hecho. Después de todo, es posible que su problema se resuelva en la última versión. Si lo intentó y no funcionó, debe descargar el código fuente del kernel que está ejecutando. La mayoría de las distribuciones proporcionan un comando especial para eso, pero para hacerlo manualmente, puede encontrar el código fuente en kernel.org.

También debe descargar cualquier parche que necesite para su kernel. A veces, estos parches son específicos de la versión del kernel, así que elija con cuidado.

Es tradicional, o al menos lo era cuando la gente compilaba regularmente sus propios núcleos, colocar el código fuente y los parches en /usr/src/linux. .

Desarchive el código fuente del kernel y los archivos de parche según sea necesario:

$ cd /usr/src/linux
$ bzip2 --decompress linux-5.2.4.tar.bz2
$ cd  linux-5.2.4
$ bzip2 -d ../patch*bz2

El archivo del parche puede tener instrucciones sobre cómo hacer el parche, pero a menudo están diseñadas para ejecutarse desde el nivel superior de su árbol:

$ patch -p1 < patch*example.patch

Una vez que el código del kernel esté parcheado, puede usar su configuración anterior para preparar la configuración del kernel parcheado:

$ make oldconfig

El hacer configuración antigua El comando tiene dos propósitos:hereda la configuración de su kernel actual y le permite configurar nuevas opciones introducidas por el parche.

Es posible que deba ejecutar make menuconfig comando, que lanza una lista basada en menús y basada en ncurses de posibles opciones para su nuevo kernel. El menú puede ser abrumador, pero dado que comienza con su configuración anterior como base, puede revisar el menú y deshabilitar módulos para el hardware que sabe que no tiene y que no anticipa necesitar. Alternativamente, si sabe que tiene alguna pieza de hardware y ve que no está incluida en su configuración actual, puede optar por compilarla, ya sea como un módulo o directamente en el kernel. En teoría, esto no es necesario porque, presumiblemente, su kernel actual lo estaba tratando bien, excepto por el parche que faltaba, y probablemente el parche que aplicó haya activado todas las opciones necesarias requeridas por cualquier dispositivo que le haya pedido parchear su kernel en primer lugar. .

A continuación, compile el núcleo y sus módulos:

$ make bzImage
$ make modules

Esto te deja con un archivo llamado vmlinuz , que es una versión comprimida de su kernel de arranque. Guarde su versión anterior y coloque la nueva en su /boot directorio:

$ sudo mv /boot/vmlinuz /boot/vmlinuz.nopatch
$ sudo cat arch/x86_64/boot/bzImage > /boot/vmlinuz
$ sudo mv /boot/System.map /boot/System.map.stock
$ sudo cp System.map /boot/System.map

Hasta ahora, ha parcheado y creado un núcleo y sus módulos, ha instalado el núcleo, pero no ha instalado ningún módulo. Ese es el paso final de compilación:

$ sudo make modules_install

El nuevo núcleo está en su lugar y sus módulos están instalados.

El paso final es actualizar su cargador de arranque para que la parte de su computadora que se carga antes que el kernel sepa dónde encontrar Linux. El cargador de arranque GRUB hace que este proceso sea relativamente simple:

$ sudo grub2-mkconfig

Compilación del mundo real

Por supuesto, nadie ejecuta esos comandos manuales ahora. En su lugar, consulte su distribución para obtener instrucciones sobre cómo modificar un kernel usando el conjunto de herramientas para desarrolladores que usan los mantenedores de su distribución. Este conjunto de herramientas probablemente creará un nuevo paquete instalable con todos los parches incorporados, alertará al administrador de paquetes de la actualización y actualizará su gestor de arranque por usted.

Núcleos

Los sistemas operativos y los núcleos son cosas misteriosas, pero no se necesita mucho para entender sobre qué componentes están construidos. La próxima vez que obtenga una pieza de tecnología que parezca no funcionar en Linux, respire hondo, investigue la disponibilidad del controlador y siga el camino de menor resistencia. Linux es más fácil que nunca, y eso incluye el kernel.


Linux
  1. Cómo actualizar Kernel en Linux Desktop

  2. Linux:¿cómo encontrar las implementaciones de las llamadas al sistema del kernel de Linux?

  3. Linux:¿cómo determinar qué módulo contamina el kernel?

  4. ¿Cómo determina el kernel de Linux el orden de las llamadas __init?

  5. ¿Cómo puedo encontrar el modelo de hardware en Linux?

Cómo actualizar el kernel de Linux en CentOS 7

Cómo compilar un kernel:al estilo Debian

Cómo instalar el último kernel de Linux en CentOS 7

Cómo ver información de hardware en Linux

Cómo compilar el kernel de Linux desde el origen para crear un kernel personalizado

¿Cómo carga Linux la imagen 'initrd'?