¿Cuál es una manera simple de recompilar el núcleo?

41

Estoy interesado en compilar un nuevo núcleo en Ubuntu 12.04 x86 64 bit.

Encontré esta página wiki que es básicamente un espejo para este blog y hay muchos pasos ( git , etc.) que me parecen inútiles.

Con versiones / distribuciones anteriores, solía crear un .configarchivo y modificarlo Makefilesi era necesario, luego solo lo ejecutaba makey listo.

¿Hay una manera simple de hacer esto en Ubuntu?

usuario827992
fuente
1
Vale la pena echarle un vistazo: wiki.ubuntu.com/Kernel/BuildYourOwnKernel
Colin Ian King

Respuestas:

39

1. Use apt-get sourcepara descargar la versión de Ubuntu del kernel

apt-get source linux-image-$(uname -r)

da una carpeta que contiene, por ejemplo:

linux-3.2.0 linux_3.2.0-26.41.dsc
 linux_3.2.0-26.41.diff.gz   linux_3.2.0.orig.tar.gz

La diferencia en negrita incluye todas las personalizaciones de Ubuntu / Debian.

2. Para construir un kernel de stock con el suyo .config, use el make-kpkgmétodo Debian "anticuado"

Esta es la forma alternativa antigua que se describe en la wiki:

sudo apt-get install kernel-package

Si está compilando un núcleo por primera vez:

sudo apt-get build-dep linux-image-$(uname -r)

Luego, cden el directorio de origen (aquí, linux-3.2.0), y ejecute make oldconfigpara crear un .configarchivo con la configuración de su núcleo en ejecución, o copie una tercera parte .configen este directorio.

Dependiendo de si desea una configuración de texto o gráfica, instale:

(Texto)

sudo apt-get install libncurses5 libncurses5-dev

(Gráfico)

sudo apt-get install qt3-dev-tools libqt3-mt-dev

Y luego corre:

(Texto)

make menuconfig

(Gráfico)

make xconfig

Cuando termine, simplemente ejecute:

fakeroot make-kpkg -j N --initrd --append-to-version=my-very-own-kernel kernel-image kernel-headers

dónde Nes cuántos trabajos ejecutar en paralelo (generalmente la cantidad de CPU que tiene) y my-very-own-kerneles una cadena personalizada para identificar esta compilación.

Cuando termine, la imagen del núcleo y los archivos de encabezado estarán listos como debs en el directorio principal; puede instalarlos con sudo dpkg -i, que también se encargará de agregar entradas GRUB, etc.

ish
fuente
por qué no te dicen nada acerca de esta diferencia, para mí una diferencia es solo una diferencia, puede contener todo.
user827992
No sé, tendrías que preguntarles (google para Canonical Kernel Team). Te acabo de decir cómo construirlo;)
ish
1
ok, última pregunta, ¿cómo aplicar este diff comprimido? : DI tengo que ir en el linux-3.2.0directorio y ejecutar patch -p1 <../patch.diff?
user827992
1
No hay necesidad de aplicar el diff; apt-get source ...ya lo hice por ti!
ish
2
-1 Lo llamas "anticuado", lo llamo obsoleto. fakeroot debian/rules editconfigs, fakeroot debian/rules clean, fakeroot debian/rules binaryEs la forma correcta, sin problemas.
Aleksandr Dubinsky
19

Aquí están los pasos. Este procedimiento se basa en nixCraft Es Cómo: Compilar kernel de Linux 2.6 --pero modernizado considerablemente.

Descargue y extraiga el código fuente del kernel que desea construir.

Puede obtener el código fuente del kernel ascendente en kernel.org . Aquí se utilizará la versión 3.16.1 (el último kernel estable a partir de este escrito). Por lo tanto, es posible que deba modificar estos comandos si está utilizando una versión diferente.

El código fuente del núcleo se proporciona actualmente en. alquitrán . xz archives, así que haga clic en el enlace "tar.xz" según la versión que desee:

captura de pantalla de kernel.org, que muestra los archivos fuente del kernel disponibles para descargar

Después de cdacceder al directorio donde descargó el archivo, puede extraerlo con tar:

tar xf linux-3.16.1.tar.xz

Instale las herramientas de compilación necesarias y realice la configuración del kernel.

Para llegar de Ubuntu cadena de herramientas ( gcc, make, etc.) instalar la build-essentialInstalar build-essential metapaquete:

sudo apt-get update
sudo apt-get install build-essential

Dos maneras bastante fáciles de usar para configurar lo que sucede en su núcleo son proporcionados por los makeobjetivos xconfigy menuconfig.

xconfigejecuta una utilidad de configuración gráfica, mientras menuconfigestá basada en texto (es decir, su interfaz aparece completamente dentro de su terminal). Cada uno requiere algún software adicional no proporcionado por build-essentialInstalar build-essential .

Para configurar gráficamente , instale libqt4-devInstalar libqt4-dev y pkg-configInstalar pkg-config y ejecutemake xconfig:

sudo apt-get install libqt4-dev pkg-config
make xconfig

Para configurar en el terminal , instalelibncurses5-dev(gracias a Hannu por esta información) y ejecutemake menuconfig:

sudo apt-get install libncurses5-dev
make menuconfig

Construye el kernel configurado.

Primero ejecute esto para compilar el núcleo y crear vmlinuz:

make

vmlinuzes "el núcleo". Específicamente, es la imagen del kernel la que GRUB o cualquier otro cargador de arranque que utilices descomprimirá y cargará en la memoria .

Luego construya los módulos del núcleo cargables :

make modules

Instale su kernel recién construido.

Suponiendo que esos makecomandos se completaron con éxito, es hora de instalar el nuevo núcleo. Primero instale los módulos:

sudo make modules_install

Luego instale el núcleo en sí:

sudo make install

Eso coloca vmlinuz-3.16.1(una copia de vmlinuz), config-3.16.1(un archivo de texto que almacena los parámetros de configuración del núcleo) y System.map-3.16.1(la tabla de búsqueda de símbolos del núcleo ) en /boot. Para más detalles, vea esta publicación comp.os.linux.misc de Hadron y man installkernel.

Configuración final, para que el núcleo se pueda iniciar y arrancar el sistema:

Esta sección se basa en parte en la información en Kernel / Compile .

Con el núcleo ahora donde debe estar, necesita:

Genera tus initramfs conmkinitramfs:

cd /boot
sudo mkinitramfs -ko initrd.img-3.16.1 3.16.1

Cuando actualice la configuración del gestor de arranque GRUB2, que ha sido el predeterminado en Ubuntu desde la 9.10, debería detectar automáticamente el nuevo núcleo y agregar una opción para iniciarlo.

sudo update-grub

Prueba tu núcleo.

Ahora puede reiniciar para probar su nuevo núcleo. Es posible que deba mantener presionada Shifto presionar Escdurante el inicio para ver el menú de inicio de GRUB donde puede seleccionar entre los diferentes núcleos que están instalados.

Para hacer que su kernel (u otro) sea el predeterminado, consulte ¿Cómo cambio el orden de arranque de GRUB?

Principiante
fuente
Paso 3, make menuconfigrequiereapt get install libncurses5-dev
Hannu
@ Hannu gracias, me olvidé por completo de mencionar eso. Los usuarios del sistema de 64 bits pueden requerir "ia32-libs" también para la ejecución de programas de 32 bits.
Novato
Podría ser mejor encontrar un paquete independiente de la versión también ... No estoy seguro de que haya alguno.
Hannu
@EliahKagan Gracias. ¿Está bien ahora o debería eliminarlo por completo? No tengo ningún problema en hacer eso.
Novato
1
-1 Esto no produce un kernel de Ubuntu . Ni siquiera produce archivos .deb. Esta es una receta para los problemas.
Aleksandr Dubinsky
3

Las instrucciones rápidas para construir un kernel de Ubuntu (en lugar de vanilla) se pueden encontrar aquí: https://wiki.ubuntu.com/Kernel/BuildYourOwnKernel .

No copiaré toda la wiki, pero enumeraré los pasos mínimos para compilar la versión del kernel de Ubuntu que tienes instalada actualmente. (Para obtener la versión más reciente, clone el repositorio de kernel git de la próxima versión de Ubuntu). Probado en Ubuntu 16.04.

# Get source code
apt-get source linux-image-$(uname -r)

# Install dependencies
sudo apt-get build-dep linux-image-$(uname -r)

# Compile
cd linux-4.4.0
fakeroot debian/rules clean
fakeroot debian/rules binary

# Install (obviously the versions will be different)
cd ..
sudo dpkg -i linux-image-4.4.0-38-generic_4.4.0-38.57_amd64.deb linux-headers-4.4.0-38_4.4.0-38.57_all.deb linux-headers-4.4.0-38-generic_4.4.0-38.57_amd64.deb
Aleksandr Dubinsky
fuente