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.
-
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 untar.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 🙂 -
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 ygunzip -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).
-
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 unY
con unN
, 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, ingresemake _____
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 comomake 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 requiereqmake
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 prefieromenuconfig
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...
-
-
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 deinitramfs
.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 unaM
(=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 eninitramfs
(ver “Contenido de initramfs”). -
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, dondeN
es la cantidad de núcleos que desea dedicar + 1. No haytest
ocheck
. Una vez hecho esto, puedemake 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 llamadobzImage
, donde[ARCH]
esx86
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 pormake modules_install
, que incluirá la cadena "Versión local", por ejemplo,System.map-3.13.3-mykernel
. -
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 ychmod 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 elset 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 enlinux
línea, que indica su sistema de archivos raíz (el que tiene/sbin/init
y/lib/modules
). La versión UUID de eso esroot=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, ejecutegrub2-mkconfig -o /boot/grub2/grub.cfg
(pero haga una copia de seguridad de sugrub.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 conmenuentry
es una buena idea). Puedes eliminar eso más tarde si todo va bien.También puede simplemente insertar el
menuentry
engrub.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 ideamake clean
(omake 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. -
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).
-
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.