Construir un Kernel Personalizado

John Soros, Alessio, Brandon Nielsen Versión unspecified Last review: 2023-12-23
Este documento proporciona instrucciones para usuarios avanzados que desean reconstruir el kernel desde alguna fuente.

Cuando compila o ejecuta un kernel personalizado, no se debe esperar soporte del equipo de kernel de Fedora.

Algunas razones comunes para compilar un kernel personalizado son:

  • Aplicar parches para pruebas que se generaron o se obtuvieron de otra fuente

  • Para reconfigurar un kernel existente

  • Para obtener más información sobre el kernel y el desarrollo del kernel

Obtener las Dependencias

La manera más fácil de instalar todas las dependencias compiladas para el kernel es usar el archivo de especificaciones del kernel Fedora:

sudo dnf install fedpkg
fedpkg clone -a kernel
cd kernel
sudo dnf builddep kernel.spec

Si usted desea usar make xconfig, necesitará algunos paquetes adicionales:

sudo dnf install qt3-devel libXi-devel gcc-c++

Arranque Seguro

Asegúrese de agregar el usuario que realiza la compilación a /etc/pesign/users y ejecute el script de autorización del usuario:

sudo /usr/libexec/pesign/pesign-authorize

Cree una nueva Machine Owner Key (Clave de Propietario de la Máquina) (MOK) para importar a UEFI:

openssl req -new -x509 -newkey rsa:2048 -keyout "key.pem" \
        -outform DER -out "cert.der" -nodes -days 36500 \
        -subj "/CN=<your name>/"

Importe el nuevo certificado a su base de datos UEFI:

Se le pedirá que autorice la importación en el próximo arranque.
mokutil --import "cert.der"

Cree un archivo de clave PKCS #12:

openssl pkcs12 -export -out key.p12 -inkey key.pem -in cert.der

Usted puede después importar el certificado y la clave a la base de datos nss:

certutil -A -i cert.der -n "<MOK certificate nickname>" -d /etc/pki/pesign/ -t "Pu,Pu,Pu"
pk12util -i key.p12 -d /etc/pki/pesign

Una vez que el certificado y la clave están importados en su base de datos nss, usted puede compilar el kernel con la clave seleccionada añadiendo %define pe_signing_cert <MOK certificate nickname> al archivo kernel.spec o llamando a rpmbuild directamente con la bandera --define "pe_signing_cert <MOK certificate nickname>".

Mientras el bugzilla bug #1651020 esté abierto usted podría necesitar editar la línea que empieza con %pesign en el archivo de especificaciones del kernel y sustituirla con pesign -c %{pe_signing_cert} --certdir /etc/pki/pesign/ -s -i $KernelImage -o vmlinuz.signed.

Está también recomendado que instale ccache, que puede ayudar a acelerar las reconstrucciones:

sudo dnf install ccache

Compilar un Kernel desde el dist-git de Fedora

Primero, se requiere verificar desde Fedora kernel dist-git:

git clone https://src.fedoraproject.org/rpms/kernel.git

El kernel, como cualquier otro paquete Fedora, tiene una rama por cada versión Fedora. rawhide corresponde a Rawhide y cada versión Fedora tiene una rama llamada f<version>.

  1. Por ejemplo, para construir un kernel Fedora 28, usted necesitaría primero cambiar a la rama con:

    git switch f28
  2. Para evitar conflictos con los kernels existentes, puede establecer un buildid personalizado cambiando # define buildid .local a %define buildid .<your_custom_id_here> en kernel.spec.

  3. Haga cualquier cambio o personalización que necesite:

    1. Las opciones de configuración de kernel se pueden anular modificando el archivo kernel-local.

    2. Los parches existentes pueden ser añadidos a linux-kernel-test.patch, se recogerán automáticamente durante la reconstrucción.

    3. Los parches también se pueden mantener en archivos separados y añadidos a kernel.spec con Patch2: foo.patch, Patch3: bar.patch, etc. Se deben agregar líneas ApplyOptionalPatch foo.patch, ApplyOptionalPatch bar.patch para aplicar los parches durante el proceso de construcción.

    4. Haga sus propias modificaciones en la fuente del kernel, recupere las fuentes del kernel de su rama dist-git real con fedpkg sources, después haga sus cambios deseados en la fuente del kernel y genere un parche, por ejemplo, con diff -rupN kernel_src_folder kernel_src_folder_patched > mypatch.patch. El parche se puede añadir entonces a linux-kernel-test.patch o al archivo de especificaciones.

  4. Construya los RPMs:

    fedpkg local
  5. Instale el nuevo kernel:

    sudo dnf install --nogpgcheck ./x86_64/kernel-$version.rpm

Construyendo un kernel vanilla upstream

Algunas veces un desarrollador de Fedora le puede pedir que intente compilar e instalar un kernel upstream (posiblemente con un parche añadido) para probarlo. Si hay varias iteraciones, puede ser más rápido para usted hacer esto que para el desarrollador cambiar varios RPMs.

Se está realizando un esfuerzo para empaquetar los kernels vanilla. Vea si esto se ajusta a sus necesidades primero

Obtener las Fuentes

Clone el árbol del kernel desde kernel.org. Si usted no sabe que árbol necesita, debería obtener el árbol de Linus:

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux

También puede que desee el árbol estable (versiones 4.y.z), que se pueden añadir con:

git remote add -f stable git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git

Aplicar parches

Para aplicar archivos de parche, puede usar git-am:

git am -3 <patch file>

Configurar el kernel

Si el desarrollador le ha apuntado un archivo de configuración específico para utilizar, guárdelo en el directorio linux con el nombre de archivo .config

De lo contrario, deberá elegir un archivo de configuración para empezar. El kernel Linux tiene miles de opciones de configuración, por lo que no querrá empezar desde cero a menos que sepa lo que está haciendo.

Arrancar desde una configuración de kernel instalada

Si desea modificar la configuración de un kernel que ya tiene instalado, usted puede empezar con su configuración que está almacenada en /boot/. Por ejemplo, para arrancar con la configuración del kernel corriendo en este momento:

cp /boot/config-`uname -r`* .config

Arrancar desde dist-git

Si desea usar la configuración para un kernel que no tiene instalado, puede obtener la configuración desde el repositorio dist-git de Fedora. Por ejemplo, para arrancar con la última configuración Rawhide:

cd <dist-git directory>
git checkout rawhide
./generate_all_configs.sh # Ensure the latest configuration files are generated
cp kernel-<arch>.config <linux kernel directory>.config

Las versiones de depuración de los archivos de configuración están en kernel-<arch>-debug.config si usted quisiera compilar un kernel con las opciones de depuración habilitadas.

Cambiar la configuración

Hay varias maneras de cambiar la configuración. Puede ejecutar make help y mirar en las Configuration targets la lista completa, pero make menuconfig es un buen sitio para empezar. Puede también solo editar el archivo .config directamente.

Una opción de configuración que puede que desee establecer es CONFIG_MODULE_COMPRESS, que comprime los módulos (con gzip de forma predeterminada) cuando los instala. Sin este ajuste, los módulos pueden ser muy grandes.

Construir el kernel

Una vez que usted ha configurado el kernel, está listo para construirlo. Antes de hacerlo, querrá cambiar la EXTRAVERSION en el Makefile por algo que reconocerá más tarde. Por ejemplo, si lee EXTRAVERSION = -rc5 cámbielo a EXTRAVERSION = -rc5-dave:

$EDITOR Makefile

Ahora está preparado para construir el kernel:

make oldconfig
make bzImage
make modules

Instalar el kernel

Instalar el kernel es tan sencillo como:

sudo make modules_install
sudo make install

Compilar

Si le han pedido que pruebe varias cosas, el procedimiento cuando ya haya construido el árbol una vez es prácticamente el mismo. Se recomienda ejecutar make clean entre construcciones. Esto dejará .config en sitio, de modo que puede saltar el paso de arriba e ir directamente a la parte de make bzImage de los pasos de arriba. Ya que instalamos ccache en el primer paso, las construcciones siguientes deben ir un poco más rápido puesto que el compilador tocará archivos que no han cambiado desde la última vez que se construyeron.

Limpiar

Una vez que ha probado el kernel y ha vuelto a arrancar desde uno de sus kernels instalados desde un RPM, puede limpiar los archivos que el procedimiento anterior instaló.

Cuando ejecute los siguientes comandos, ¡compruebe que tiene la versión correcta del kernel!

Como cambió EXTRAVERSION en el Makefile para añadir una 'tag', todos los archivos que instaló tendrán esto como parte del nombre de archivo. Así que debería ser capaz de usar comodines para borrarlos con seguridad utilizando comandos similares a los de abajo (solo reemplace 'dave' con cualquier etiqueta que usted haya elegido):

rm -f /boot/config-*dave* /boot/initramfs-*dave* /boot/vmlinuz-*dave* /boot/System.map-*dave*
rm -rf /lib/modules/*dave*

Finalmente, necesitará eliminar el kernel como una opción de su cargador de arranque. Asumiendo que su sistema está ejecutando grub2, esto se puede hacer eliminando las entradas de la especificación del cargador de arranque y reconstruyendo la configuración grub:

rm -f /boot/loader/entries/*dave*
grub2-mkconfig -o /boot/grub2/grub.cfg