¿Qué sucede en cada paso del proceso de construcción del kernel de Linux?

27

He leído muchos tutoriales sobre cómo construir núcleos personalizados y arrancar Ubuntu usando esos núcleos, y seguí con éxito las guías y los núcleos personalizados arrancados, pero no entiendo qué hace cada uno de los comandos en las guías y qué está sucediendo realmente con cada comando

El procedimiento descrito en el sitio de Ubuntu hace un montón de trabajo con fakeroot, dpkg, make-kpkg, algunos initramfs, y otras cosas horribles que las obras, sino que simplemente no ayuda a entender lo que está pasando.

  • ¿Cuál es la salida de makeun directorio de kernel de Linux?
  • ¿Crea una "imagen del núcleo comprimido"?
  • ¿Cuál es el nombre del archivo de "imagen comprimida del núcleo" y dónde está ubicado?
  • ¿Qué make moduleshacer?
  • ¿Debe make moduleshacerse antes o después make?
  • ¿No makeconstruye mis módulos automáticamente?
  • ¿Cuál es el proceso (en inglés, no solo la lista de comandos) de agregar núcleos recién creados a la lista de núcleos de arranque?
  • ¿Qué make installhacer?
  • ¿Lo make installagregaré a mi lista de núcleos de arranque para que no tenga que hacer nada más?
  • ¿Hay un equivalente make modules_install?
AnkurVj
fuente
Esto debería dividirse en múltiples preguntas.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

34

Desde la parte superior...

  • makecompila y vincula la imagen del núcleo. Este es un archivo único llamado vmlinuz.
  • make modulescompila archivos individuales para cada pregunta que respondió Mdurante la configuración del kernel. El código objeto está vinculado a su núcleo recién construido. (Para las preguntas respondidas Y, estas ya son parte de vmlinuz, y para las preguntas respondidas Nse omiten).
  • make installinstala tu kernel integrado en /vmlinuz.
  • make modules_installinstala los módulos del kernel en /lib/moduleso /lib/modules/<version>.

En cuanto a agregarlo a la lista de núcleos disponibles, el gestor de arranque se encarga de eso. Es diferente para cada gestor de arranque, pero grubes el más común en x86 y amd64, así que lo describiré. En realidad es bastante simple. Grub busca y /, para cualquier cosa que parezca que podría ser un núcleo en funcionamiento, lo agrega. Y sí, esta es una descripción demasiado simplificada./boot/lib/modules

Esas "cosas horribles" adicionales en la documentación de Ubuntu son cosas adicionales para crear un debpaquete. Cuando lo hace por más que usted, es mucho mejor empaquetarlo. Cambiarás a tiempo.

La construcción del kernel y los módulos se mantiene separada porque para las personas que lo necesitan (es decir, los desarrolladores del kernel) a menudo solo realizan cambios en un módulo. Pueden aplicar sus cambios, reconstruir e instalar solo los módulos. Esto ahorra mucho tiempo cuando tiene que hacerse 20 veces al día. Nunca se actualizará para tener un solo make everythingcomando. En su lugar, ejecuta make && make modules && make install && make modules_install como la documentación dice hacer . El proceso de compilación favorece a los desarrolladores del kernel, no a ti. Y así es como debe ser.

En realidad, casi no hay razón para que nadie, excepto los desarrolladores del núcleo o los empaquetadores de distribución, compilen un núcleo. En casi cualquier circunstancia, la característica del núcleo que desea ya se ha creado para usted y está disponible en uno de los núcleos preempaquetados. Hay excepciones, pero son extremadamente raras en estos días.

No es que te esté desanimando de construir tu propio núcleo, en realidad te animo a que lo hagas. Creo que construir su núcleo desde cero es una práctica invaluable para aprender cómo funciona todo allí. En parte, porque quizás algún día serás la excepción que necesita. Pero también le enseña mucho sobre el proceso de kernel y arranque en general. Serás una mejor persona por haberlo hecho.

bahamat
fuente
1
Muchas gracias por la descripción del proceso legible para los humanos. Tengo algunas dudas Mi compilación del kernel produjo vmlinux y no vmlinuz. Creo que la diferencia es la compresión. ¿Debo comprimir la imagen manualmente? ¿Hay /vmlinuzun directorio en la carpeta raíz? cuando haga una instalación, ¿se creará este directorio y se colocará un nuevo núcleo allí? ¿ make modules_installReemplazará mis módulos instalados actualmente? Supongamos que coloco mi vmlinux en el directorio / boot, ¿necesito hacer algo más (como editar archivos de configuración de grub y hacer grub-update o algo después?)
AnkurVj
3
Tienes razón, la diferencia es la compresión. El comando make bzimagees lo que hace eso. /vmlinuzes un archivo binario, no un directorio. He estado haciendo solo kernels empaquetados durante los últimos 5 años, por lo que no recuerdo exactamente el comportamiento de modules_installun kernel instalado directamente. Grub encontrará tu kernel /bootsin ayuda. Sí, siempre debe ejecutar grub-updatedespués de instalar un nuevo núcleo.
bahamat
entonces debería haberlo hecho en make bzimagelugar de make? ¿Necesito hacer una make cleany make bzimageotra vez? Por /vmlinuzqué se refiere el archivo se creará en el directorio raíz o en el directorio de origen del núcleo de Linux?
AnkurVj
1
Realmente no importa si su núcleo está comprimido o no. Sin comprimir, solo ocupa un poco más de espacio en disco. Cualquier cosa con el prefijo /es una ruta absoluta, así que sí, es un archivo en la raíz.
bahamat
1
Los módulos @GuyAvraham respondidos Yse compilan en (es decir, son parte de vmlinuz). Los módulos respondidos Mse compilan como módulos cargables. Los módulos respondidos Nno se compilan. make modules_installsolo se aplica a los respondidos M.
bahamat