Configurar, compilar e instalar un núcleo Linux personalizado


38

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

¿Dónde empiezo?

Respuestas:


51

Construir un kernel personalizado puede llevar mucho tiempo, principalmente en la configuración, ya que las computadoras modernas pueden hacer la compilació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 gestor de arranque (consulte el paso 6 a continuación). De esta manera, si la nueva no funciona, puede reiniciar la anterior.

En las siguientes instrucciones, las rutas dentro del árbol de origen toman la forma [src]/whatever, donde [src]está el directorio en el que instaló el origen, por ejemplo /usr/src/linux-3.13.3. Probablemente desee hacer estas cosas su rootya que el árbol de origen 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 la información necesaria para comprender el resto del proceso.

  1. Descargue y descomprima el tarball fuente.

    Estos están disponibles en kernel.org . Los últimos se enumeran en la portada, 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 Estable". En el momento de escribir esto, este es un tar.xzarchivo de 74 MB .

    Una vez que se descarga el tarball, debes descomprimirlo en algún lugar. El lugar normal está adentro /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. Contiene parches específicos de distribución, que pueden o no ser importantes para usted. También coincidirá con los encabezados de inclusión del núcleo utilizados para compilar algunas herramientas de espacio de usuario, aunque es muy probable que sean idénticas de todos modos.

    En más de 15 años de construcción de núcleos personalizados (principalmente en Fedora / Debian / Ubuntu), nunca he tenido problemas para usar la fuente vanilla 1 . Sin embargo, hacer eso realmente no hace mucha diferencia, más allá del hecho de que si quieres el último kernel absoluto, tu distribución probablemente aún no lo ha empaquetado. Entonces, la ruta más segura es usar el paquete de distribución, que debe instalarse en /usr/src. Prefiero el último establo para poder actuar como conejillo de indias antes de que se lance a las distribuciones :)

  2. Comience 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 has hecho antes, espera mucha prueba y error. Esto también significa tener que leer la mayoría de las opciones (hay cientos). Una mejor opción es usar su configuración existente, si está disponible. Si usó un paquete fuente de distribución, probablemente ya contenga un [src]/.configarchivo, por lo que puede usarlo. De lo contrario, verifique si hay a /proc/config.gz. Esta es una característica opcional agregada en el kernel 2.6. Si existe, cópielo en el nivel superior del árbol de origen y gunzip -c config.gz > .config.

Si no existe, tal vez porque esta opción se configuró como un módulo. Intente sudo modprobe configs, luego verifique el /procdirectorio config.gznuevamente.

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 tiene mucha importancia para 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 la construcción. También es incómodo ya que requiere un initramfs para contener ciertos módulos principales (vea el paso 4 a continuación). Sin embargo, es probablemente un mejor punto de partida que el predeterminado.

Tenga en cuenta que las opciones de configuración cambian y cambian de una versión de kernel a la siguiente, y cuando ejecuta uno de los make configsiguientes programas .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 conducir a 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. Crea una .configuración.

    [src]/.configes un archivo de texto usado para configurar el núcleo. No edite este archivo directamente . Cambiar opciones a menudo no es una simple cuestión de reemplazar a Ypor un N, etc; generalmente hay un conjunto de interdependencias y posibilidades de ramificación. En su lugar, desea utilizar uno de los destinos de configuración del archivo make del kernel (es decir, ingresar make _____en la línea de comando desde el directorio de origen de nivel superior):

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

    • make oldconfiges como make config, excepto, si ya tiene una .configversión anterior, omitirá las preguntas, excepto las relacionadas con las nuevas opciones. Todavía puede haber muchos de ellos y la mayoría de ellos serán irrelevantes para usted, así que nuevamente, no lo recomiendo.

    • make menuconfiges mi método preferido (y creo que el de la mayoría de los demás). Construye y ejecuta una interfaz TUI (menús de colores que funcionarán en un terminal). Esto requiere que tenga -devinstalado el paquete para ncurses. Es bastante autoexplicativo, excepto por la búsqueda a la que se puede acceder mediante /; la "ayuda" F1 proporciona una explicación de la opción actual. Hay una versión alternativa make nconfig, con algunas características adicionales, en la que F2 "syminfo" es el equivalente de menuconfig's F1.

    • make xconfiges una interfaz GUI completa. Esto requiere que se instale qmakeel -devpaquete para Qt, ya que nuevamente, es un programa que se compila y se construye. Si no los estaba utilizando anteriormente, puede ser una descarga sustancial. La razón por la que prefiero menuconfigla versión GUI es que las jerarquías de opciones se presentan utilizando pantallas sucesivas en la primera pero abiertas en forma de acordeón en la última.

    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 con ella está mucho más allá del alcance de un Q&A como este. Si quieres sentarte y revisar todo, reserva horas . Greg Kroah-Hartman (desarrollador principal desde hace mucho tiempo para el kernel de Linux) tiene un libro en línea gratuito 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 desde su núcleo de distribución actual (según # 2) y luego revise y desmarque todas las cosas que sabe que no necesita. También es probable que 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 núcleo y / o cargado en el momento del arranque. Su propósito principal es incluir módulos que el núcleo necesitará antes de que pueda acceder a los que están en /lib/modulesel sistema de archivos raíz, por ejemplo, controladores para el dispositivo que contiene ese sistema de archivos. Las distribuciones siempre las 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 el interior de initramfs.

    Esto funciona bien y no representa ningún tipo de desventaja, pero probablemente sea una complicación innecesaria al construir su propio núcleo. 2 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 está encendido) estén integrados en el núcleo. En menuconfig, esta es la diferencia entre una Mopción (= módulo) y una 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, necesitará controladores para aquellos integrados. [Si alguien puede pensar en otra cosa que sea imprescindible, deje un comentario y lo incorporaré aquí].

    Si desea utilizar un initramfs, deberá seleccionar las opciones apropiadas en Configuración general . Hay una guía esquemática para crear uno integrado en el núcleo[src]/Documentation/filesystems/ramfs-rootfs-initramfs.txt , pero tenga en cuenta que las distribuciones no hacen esto; usan un archivo cpio externo comprimido. Sin embargo, ese documento contiene una discusión sobre 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 makeen el [src]directorio. Si está en un sistema multinúcleo, puede agregar -j Npara acelerar las cosas, ¿dónde Nestá el número de núcleos que desea dedicar + 1. No hay testo check. Una vez hecho eso, puedes hacerlo make modules. En una caja rápida, todo esto debería tomar <10 minutos.

    Si todo va bien, make INSTALL_MOD_STRIP=1 modules_install. Esto creará un directorio que /lib/modulescoincida con el número de versión del núcleo 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 núcleo de la misma versión de la que depende , porque estos módulos los reemplazarán. 3 INSTALL_MOD_STRIP=1 es opcional, para el significado ver aquí .

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

    System.map-[VERSION]
    

    En este caso, [VERSION]es exactamente el mismo que el nombre del directorio en el /lib/modulescreado pormake modules_install , que incluirá la cadena "versión local", por ejemplo, System.map-3.13.3-mykernel.

  4. Configure el gestor de arranque GRUB 2.

    Si no está utilizando grub(la mayoría de los usuarios de escritorio de Linux lo están), esto obviamente no se aplica a usted. Deberías tener un /etc/grub.d/40_customarchivo con poco contenido. Si no, créelo propiedad de root y chmod 755(debe ser ejecutable). A eso agregue:

    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 la 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 la partición 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 la root=directiva en la linuxlínea, que indica su sistema de archivos raíz (el que tiene /sbin/inity /lib/modules). La versión de UUID de eso es root=UUID=[the UUID].

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

    También se puede simplemente insertar el menuentryen grub.cfgforma directa, pero algunas distribuciones sobrescribirá esto cuando su núcleo se actualiza (mientras que usando /etc/grub.d/la mantendrá incorporado).

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

  5. En cuanto a los encabezados del núcleo et. Alabama.

    Una cosa que probablemente debería hacer es el enlace simbólico ( ln -s -i) /lib/modules/X.X.X/sourcey /lib/modules/X.X.X/buildel /usr/srcdirectorio donde está el árbol de origen (manténgalo). Esto es necesario para que algunas herramientas de espacio de usuario (y los instaladores de controladores de terceros) puedan acceder a la fuente del núcleo en ejecución.

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

    • Deje los que usa su distribución. 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".

    • Uso make headers_install.

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

Referencias

Aquí hay algunos recursos:

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

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

  • Gran parte del libro Linux Kernel in a Nutshell de Greg KH (disponible de forma gratuita como una serie de PDF) gira en torno a la construcción del núcleo.

  • Grub 2 tiene un manual en línea .


1. "Vanilla" se refiere a la fuente oficial original no adulterada que se encuentra en kernel.org. La mayoría de las distribuciones toman esta fuente de vainilla y agregan algunas personalizaciones menores.

2. Tenga en cuenta que hay circunstancias que requieren un initramfs porque se necesita espacio de usuario para montar el sistema de archivos raíz, por ejemplo, si está encriptado o se extiende a través de una matriz RAID compleja.

3. Sin embargo, no eliminará los módulos que ya están allí si no los compiló, lo que significa que puede agregar un módulo más tarde simplemente modificando su configuración y ejecutándose make modules_installnuevamente. Tenga en cuenta que la construcción de algunos módulos puede requerir cambios en el núcleo en sí mismo, en cuyo caso también debe reemplazar el núcleo. Podrá saber cuándo intenta utilizar modprobepara insertar el módulo.

4. Este archivo puede tener un nombre diferente si usó una opción de compresión no estándar. No estoy seguro de cuáles son todas las posibilidades.


3
Votado Es posible que desee agregar una mención localmodconfigy herramientas como el streamline_config.plscript; un enfoque útil para trabajar desde su configuración actual ...
jasonwryan

1
Probablemente esto sea lo suficientemente detallado como para ser una pregunta de tipo canónico según la iniciativa de @ terdon. Considere proporcionar una respuesta a su pregunta sobre meta. O podría, si lo prefieres. Parece que esta puede haber sido la intención, ya que usted hizo la pregunta de todos modos. Creo que incluir métodos específicos de distribución para construir paquetes binarios también sería útil.
Faheem Mitha

1
FYI: initramfsse supone que se usa casi siempre. Por ejemplo, configurar rootfs en LVM + RAID a menudo requiere uno. La raíz encriptada definitivamente lo hace. Incluso las configuraciones RAID razonablemente complicadas lo hacen. El ensamblaje automático en el núcleo de incluso matrices triviales en realidad está en desuso ...
derobert

2
@derobert: Eso plantea la pregunta de que "casi siempre" se está utilizando Linux para ejecutar un servidor empresarial. Mi punto initramfses que si no necesita usar uno, no tiene que hacerlo y esto simplifica el proceso. De todos modos, he agregado una nota al pie sobre la raíz cifrada fs, etc.
goldilocks

Incluya detalles sobre EFI y la funcionalidad efi-stub de linux.
IW16
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.