GNU/Linux >> Tutoriales Linux >  >> Linux

Linux:¿configurar, compilar e instalar un kernel de Linux personalizado?

Me gustaría intentar usar un kernel que no sea el proporcionado por mi distribución, ya sea de otro lugar o personalizado por mí. ¿Es esto difícil o peligroso?

¿Por dónde empiezo?

Respuesta aceptada:

Construir un kernel personalizado puede llevar mucho tiempo, principalmente en la configuración, ya que las computadoras modernas pueden hacer la construcción en cuestión de minutos, pero no es particularmente peligroso si mantiene su kernel actual y en funcionamiento, y se asegura de dejarlo como una opción a través de su cargador de arranque (consulte el paso n. ° 6 a continuación). De esta forma, si el nuevo no funciona, puede reiniciar el antiguo.

En las siguientes instrucciones, las rutas dentro del árbol fuente toman la forma [src]/whatever , donde [src] es el directorio en el que instaló la fuente, p. /usr/src/linux-3.13.3 . Probablemente quieras hacer estas cosas su root ya que el árbol fuente debe permanecer seguro en términos de permisos de escritura (debe ser propiedad de root).

Si bien algunos de los pasos son opcionales, debe leerlos de todos modos, ya que contienen información necesaria para comprender el resto del proceso.

  1. Descargue y descomprima el tarball de origen.

    Estos están disponibles en kernel.org. Los últimos se enumeran en la página principal, pero si mira dentro del /pub/ directorio, encontrará un archivo que se remonta a la versión 1.0. A menos que tenga una razón especial para hacer lo contrario, es mejor que elija el "Último establo". En el momento de escribir este artículo, se trata de un tar.xz de 74 MB archivo.

    Una vez que se descarga el tarball, debe descomprimirlo en algún lugar. El lugar normal es en /usr/src . Coloque el archivo allí y:

    tar -xJf linux-X.X.X.tar.xz
    

    Tenga en cuenta que las distribuciones individuales generalmente recomiendan que use uno de sus paquetes fuente en lugar del árbol de vainilla. Esto contiene parches específicos de distribución, que pueden o no importarle. También coincidirá con los encabezados de inclusión del núcleo utilizados para compilar algunas herramientas del espacio de usuario, aunque lo más probable es que sean idénticos de todos modos.

    En más de 15 años de creación de núcleos personalizados (principalmente en Fedora/Debian/Ubuntu), nunca he tenido problemas para usar la fuente de vainilla. Sin embargo, hacer eso realmente no hace mucha diferencia, más allá del hecho de que si desea el kernel más reciente, es probable que su distribución aún no lo haya empaquetado. Entonces, la ruta más segura sigue siendo usar el paquete distro, que debe instalarse en /usr/src . Prefiero el establo más reciente para poder actuar como conejillo de indias antes de que llegue a las distribuciones 🙂

  2. Empiece con una configuración básica [opcional].

    No tiene que hacer esto, simplemente puede sumergirse y crear una configuración desde cero. Sin embargo, si nunca lo ha hecho antes, espere mucho de ensayo y error. Esto también significa tener que leer la mayoría de las opciones (hay cientos). Una mejor apuesta es usar su configuración existente, si está disponible. Si usó un paquete fuente de distribución, probablemente ya contenga un [src]/.config archivo, por lo que puede utilizar eso. De lo contrario, busque un /proc/config.gz . Esta es una característica opcional añadida en el kernel 2.6. Si existe, cópielo en el nivel superior del árbol de fuentes y gunzip -c config.gz > .config .

Si no existe, quizás sea porque esta opción se configuró como un módulo. Pruebe las configuraciones de sudo modprobe configs , luego verifique el /proc directorio para config.gz de nuevo.

La configuración de distribución no es muy ideal en el sentido de que incluye casi todos los controladores de hardware posibles. Esto no le importa mucho a la funcionalidad del núcleo, ya que son módulos y la mayoría de ellos nunca se usarán, pero aumenta significativamente el tiempo requerido para compilar. También es incómodo porque requiere un initramfs para contener ciertos módulos principales (consulte el paso 4 a continuación). Sin embargo, probablemente sea un mejor punto de partida que el predeterminado.

Tenga en cuenta que las opciones de configuración cambian y cambian de una versión del kernel a la siguiente, y cuando ejecuta uno de los make config programas debajo de su .config primero se analizará y actualizará para que coincida con la nueva versión. Si la configuración es de una versión mucho más antigua, esto puede generar resultados extraños, así que preste atención cuando realice la configuración. AFAIK, no funcionará al revés (usando una configuración de una versión más nueva).

  1. Cree un .config uración.

    [src]/.config es un archivo de texto usado para configurar el kernel. No edites este archivo directamente . Cambiar las opciones a menudo no es una simple cuestión de reemplazar un Y con un N , etc; suele haber un conjunto de interdependencias y posibilidades de ramificación. En su lugar, desea utilizar uno de los objetivos de configuración del archivo MAKE del kernel (es decir, ingrese make _____ en la línea de comando del directorio fuente de nivel superior):

    • make config es el más básico, pero probablemente no sea del gusto de la mayoría de la gente. Es una secuencia de preguntas — muchas de preguntas, y si cambia de opinión, debe comenzar de nuevo.

    • make oldconfig es como make config excepto, si ya tiene un .config de una versión anterior, se saltarán las preguntas excepto las relativas a las nuevas opciones. Todavía puede haber muchos de esos y la mayoría de ellos serán irrelevantes para ti, así que, de nuevo, no lo recomiendo.

    • make menuconfig es mi método preferido (y creo que el de la mayoría). Construye y ejecuta una interfaz TUI (menús de colores que funcionarán en una terminal). Esto requiere que tengas el -dev paquete para ncurses instalado. Se explica por sí mismo, excepto por la búsqueda a la que se puede acceder a través de /; la “ayuda” de F1 proporciona una explicación de la opción actual. Hay una versión alternativa, make nconfig , con algunas funciones adicionales, donde F2 "syminfo" es el equivalente de F1 de menuconfig.

    • make xconfig es una interfaz GUI completa. Esto requiere qmake y el -dev paquete para Qt se instale, como de nuevo, es un programa que se compila y construye. Si no los estaba usando anteriormente, esa puede ser una descarga sustancial. La razón por la que prefiero menuconfig a la versión GUI es que las jerarquías de opciones se presentan utilizando pantallas sucesivas en la primera, pero abiertas como un acordeón en la segunda.

    Una de las primeras cosas que debe (pero no tiene que) hacer es agregar una cadena de "Versión local" (en Configuración general ). La razón de esto se menciona en el #5 a continuación.

    "Laberíntico" es una buena manera de describir la jerarquía de opciones, y entrar en detalles está mucho más allá del alcance de una sesión de preguntas y respuestas como esta. Si quieres sentarte y repasar todo, reserva horas . Greg Kroah-Hartman (desarrollador líder desde hace mucho tiempo para el kernel de Linux) tiene un libro gratuito en línea sobre el kernel (ver Referencias a continuación) que contiene un capítulo sobre configuración, aunque fue escrito en 2006. Mi consejo es comenzar con una base razonable. de su núcleo de distribución actual (según el n. ° 2) y luego revíselo y desmarque todas las cosas que sabe que no necesita. Probablemente también desee cambiar algunas de las opciones de "módulo" a "incorporado", lo que nos lleva al siguiente punto...

  2. Acerca de initramfs [opcional]

    Un "initramfs" es un sistema de archivos comprimido integrado en el kernel y/o cargado en el momento del arranque. Su propósito principal es incluir módulos que el kernel necesitará antes de que pueda acceder a aquellos en /lib/modules en el sistema de archivos raíz, por ejemplo, controladores para el dispositivo que contiene ese sistema de archivos. Las distribuciones siempre los usan parcialmente porque los controladores son incompatibles entre sí y, por lo tanto, no pueden integrarse en el núcleo. En cambio, los apropiados para el sistema actual se seleccionan desde dentro de initramfs .

    Esto funciona bien y no representa ningún tipo de desventaja, pero probablemente sea una complicación innecesaria a la hora de construir tu propio kernel. El problema es que, si no usa un initramfs, debe asegurarse de que los controladores para su sistema de archivos raíz (y el dispositivo en el que se encuentra) estén integrados en el kernel. En menuconfig , esta es la diferencia entre una M (=módulo) opción y un * (=opción integrada). Si no lo hace bien, el sistema fallará al principio del proceso de arranque. Entonces, por ejemplo, si tiene un disco duro SATA y un sistema de archivos raíz ext4, necesita controladores para esos integrados. [Si alguien puede pensar en algo más que sea imprescindible, deje un comentario y lo incorporaré aquí].

    Si desea utilizar un initramfs , deberá seleccionar las opciones adecuadas en Configuración general . Hay una guía básica para crear uno integrado en el núcleo en [src]/Documentation/filesystems/ramfs-rootfs-initramfs.txt , pero tenga en cuenta que las distribuciones no hacen esto; utilizan un archivo cpio comprimido con gzip externo. Sin embargo, ese documento contiene una discusión de lo que debe ir en initramfs (ver “Contenido de initramfs”).

  3. Compila e instala el kernel.

    El siguiente paso es fácil. Para hacer el núcleo, simplemente ejecute make en el [src] directorio. Si está en un sistema multinúcleo, puede agregar -j N para acelerar las cosas, donde N es la cantidad de núcleos que desea dedicar + 1. No hay test o check . Una vez hecho esto, puede make modules . En una caja rápida, todo esto debería llevar <10 minutos.

    Si todo va bien, make INSTALL_MOD_STRIP=1 modules_install . Esto creará un directorio en /lib/modules haciendo coincidir el número de versión del kernel más la cadena de "Versión local" mencionada en el paso 3, si corresponde. Si no usó una cadena de "Versión local", tenga cuidado si ya tiene un kernel de la misma versión de la que depende , porque estos módulos reemplazarán a aquellos.INSTALL_MOD_STRIP=1 es opcional, para el significado ver aquí.

    A continuación, puede make install para instalar el kernel en una ubicación predeterminada. Sin embargo, mi recomendación es que lo haga usted mismo para asegurarse de que no se sobrescriban los archivos existentes. Busque en [src]/arch/[ARCH]/boot para un archivo llamado bzImage , donde [ARCH] es x86 si está en una máquina x86 o x86-64 (y algo más si está en otra cosa). Copia eso en /boot y cámbiele el nombre a algo más específico e informativo (no importa qué). Haz lo mismo con [src]/System.map , pero cámbiele el nombre de acuerdo con el siguiente esquema:

    System.map-[VERSION]
    

    Aquí, [VERSION] es exactamente igual que el nombre del directorio en /lib/modules creado por make modules_install , que incluirá la cadena "Versión local", por ejemplo, System.map-3.13.3-mykernel .

  4. Configurar el cargador de arranque GRUB 2.

    Si no está utilizando grub (la mayoría de los usuarios de escritorio de Linux lo son), esto obviamente no se aplica a usted. Deberías tener un /etc/grub.d/40_custom archivo con no mucho en él. De lo contrario, créelo propiedad de root y chmod 755 (debe ser ejecutable). A eso agrega:

    menuentry 'My new kernel, or whatever' {
        set root='hd0,1'
        linux /boot/[name-of-kernel] root=/dev/sda1 [other kernel options]
    }
    

    Si está utilizando un initramfs, también debe tener una última línea initrd /path/to/initramfs . Cuidado con el set root= línea. El ejemplo supone que grub se instaló en la primera partición del primer disco duro (hd0,1). Si tiene varias unidades, es posible que desee utilizar el UUID de partición en su lugar y reemplazar esa línea con:

        search --no-floppy --fs-uuid --set=root [the UUID of the partition]
    

    A menos que grub no esté en su sistema de archivos raíz, esto también debería corresponder a root= directiva en linux línea, que indica su sistema de archivos raíz (el que tiene /sbin/init y /lib/modules ). La versión UUID de eso es root=UUID=[the UUID] .

    Puede mirar su /boot/grub2/grub.cfg existente para obtener una pista sobre el nombre del dispositivo. Aquí hay una breve guía para esto en grub 2. Una vez que esté satisfecho, ejecute grub2-mkconfig -o /boot/grub2/grub.cfg (pero haga una copia de seguridad de su grub.cfg actual primero). Es posible que desee editar ese archivo y mover su entrada a la parte superior. Todavía debe contener una lista para su kernel anterior (en ejecución), y su distribución puede tener un mecanismo que duplique una entrada para el nuevo kernel automáticamente (porque se encontró en /boot; Fedora hace esto, por lo tanto, usa un título distinto con menuentry es una buena idea). Puedes eliminar eso más tarde si todo va bien.

    También puede simplemente insertar el menuentry en grub.cfg directamente, pero algunas distribuciones sobrescribirán esto cuando se actualice su kernel (mientras que usan /etc/grub.d/ lo mantendrá incorporado).

    Eso es todo. Todo lo que necesita hacer ahora es reiniciar. Si no funciona, intente deducir el problema de la salida de la pantalla, reinicie eligiendo un núcleo antiguo y vuelva al paso 3 (excepto use el .config que ya tiene y modifique eso). Puede ser una buena idea make clean (o make mrproper ) entre intentos pero asegúrese de copiar [src]/.config a alguna copia de seguridad primero, porque eso se borrará. Esto ayuda a garantizar que los objetos utilizados en el proceso de compilación no estén obsoletos.

  5. Con respecto a los encabezados del núcleo et. al.

    Una cosa que probablemente deberías hacer es un enlace simbólico (ln -s -i ) /lib/modules/X.X.X/source y /lib/modules/X.X.X/build al /usr/src directorio donde está el árbol de fuentes (guárdelo). Esto es necesario para que algunas herramientas del espacio de usuario (e instaladores de controladores de terceros) puedan acceder a la fuente del kernel en ejecución.

    Un problema relacionado con esto es .h archivos en /usr/include , etc. Estos cambian muy gradualmente y son compatibles con versiones anteriores. Tienes dos opciones:

    • Deja los que usa tu distro. Si actualiza todo el sistema regularmente, la distribución instalará nuevos periódicamente de todos modos, por lo que esta es la opción "menos complicada".

    • Usa make headers_install .

    Dado que son compatibles con versiones anteriores (lo que significa que "un programa creado en una biblioteca C que usa encabezados de kernel más antiguos debería ejecutarse en un kernel más nuevo"), no tiene que ser demasiado quisquilloso con esto. El único problema potencial sería si crea un kernel personalizado y lo mantiene por un tiempo, tiempo durante el cual la distribución actualiza el paquete "kernel-headers" a un más nuevo versión que la utilizada para construir su kernel, y resulta que hay alguna incompatibilidad (que solo se aplicaría al software compilado posteriormente desde la fuente).

Relacionado:Linux:¿el comando de dedo no funciona?

Referencias

Estos son algunos recursos:

  • [src]/README incluye una breve guía de construcción e instalación.

  • El [src]/Documentation El directorio contiene mucha información que puede ser útil en la configuración.

  • Gran parte del libro Linux Kernel in a Nutshell de Greg K-H (disponible allí de forma gratuita como una serie de archivos PDF) gira en torno a la construcción del kernel.

  • Grub 2 tiene un manual en línea.

Relacionado:¿Env o no env?


Linux
  1. Instalación y uso de Homebrew Package Manager en Linux

  2. Configuración de una dirección IPv6 en Red Hat Enterprise Linux 7 y 8

  3. Instalación y configuración de Grafana en Linux

  4. Linux:¿compilar e instalar un kernel de Kernel.org en un volumen personalizado en el disco?

  5. Linux – ¿Diseño de tabla de página de volcado (configuración del kernel)?

Kernel de Linux y sus funciones

Administre y monitoree los módulos del kernel de Linux con Kmon

Instale Linux Kernel 4.15 en sistemas basados ​​en RPM y DEB

Instalación y configuración de Jenkins en Linux

Guía para instalar y desinstalar Anaconda en Linux

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