Was passiert in jedem Schritt des Linux-Kernel-Erstellungsprozesses?

27

Ich habe viele Tutorials darüber gelesen, wie man benutzerdefinierte Kernel erstellt und Ubuntu mit diesen Kerneln bootet, und habe die Anleitungen erfolgreich befolgt und benutzerdefinierte Kernel gebootet, aber ich habe kein Verständnis dafür, was die einzelnen Befehle in den Anleitungen bewirken und womit sie tatsächlich geschehen jeden Befehl.

Das Verfahren beschrieben Ubuntu - Website hat eine Menge Arbeit mit fakeroot, dpkg, make-kpkg, einige Initramfs und andere schrecklichen Sachen , die funktionieren , aber einfach helfen mir nicht verstehen , was los ist.

  • Was ist die Ausgabe makein einem Linux-Kernel-Verzeichnis?
  • Erzeugt es ein "komprimiertes Kernel-Image"?
  • Wie heißt die "komprimierte Kernel-Image" -Datei und wo wird sie abgelegt?
  • Was macht make modulesdas?
  • Sollte make modulesvorher oder nachher gemacht werden make?
  • Baut makemeine Module nicht automatisch auf?
  • Was ist der Prozess (in Englisch nicht nur die Liste der Befehle), um neu erstellte Kernel zur Liste der bootfähigen Kernel hinzuzufügen?
  • Was macht make installdas?
  • Wird make installes meiner Liste bootfähiger Kernel hinzugefügt, damit ich nichts mehr tun muss?
  • Gibt es ein Äquivalent make modules_install?
AnkurVj
quelle
Dies sollte in mehrere Fragen aufgeteilt werden.
Ciro Santilli

Antworten:

34

Von oben...

  • makeKompiliert und verknüpft das Kernel-Image. Dies ist eine einzelne Datei mit dem Namen vmlinuz.
  • make modulesKompiliert individuelle Dateien für jede Frage, die Sie Mwährend der Kernelkonfiguration beantwortet haben . Der Objektcode ist mit Ihrem neu erstellten Kernel verknüpft. (Bei beantworteten Fragen Ysind diese bereits Teil von vmlinuzund bei beantworteten Fragen werden Nsie übersprungen).
  • make installInstalliert Ihren Kernel nach /vmlinuz.
  • make modules_installInstalliert die Kernelmodule auf /lib/modulesoder /lib/modules/<version>.

Das Hinzufügen zur Liste der verfügbaren Kernel übernimmt der Bootloader. Es ist für jeden Bootloader anders, aber es grubist das häufigste bei x86 und amd64, also beschreibe ich das. Es ist eigentlich ganz einfach. Grub sieht in /, /bootund /lib/modulesfür jede Sache , die aussieht wie es könnte ein funktionierenden Kernel und fügt es. Und ja, das ist eine vereinfachte Beschreibung.

Dieses zusätzliche "schreckliche Zeug" in der Ubuntu-Dokumentation ist ein zusätzliches Zeug, um ein debPaket zu erstellen . Wenn Sie es für mehr als sich selbst tun, ist es weitaus besser, es zu verpacken. Sie werden in der Zeit wechseln.

Das Erstellen des Kernels und der Module wird getrennt gehalten, da die Benutzer (dh Kernelentwickler) häufig nur Änderungen an einem Modul vornehmen. Sie können ihre Änderungen anwenden, nur die Module neu erstellen und installieren. Das spart viel Zeit, wenn es 20 Mal am Tag gemacht werden muss. Es wird nie aktualisiert, um einen einzelnen make everythingBefehl zu haben . Führen Sie stattdessen so aus, make && make modules && make install && make modules_install wie es die Dokumentation vorschreibt . Der Build-Prozess bevorzugt Kernel-Entwickler, nicht Sie. Und so sollte es auch sein.

In Wirklichkeit gibt es fast keinen Grund für irgendjemanden außer Kernel-Entwicklern oder Distributions-Packagern, einen Kernel zu kompilieren. In fast jedem Fall wurde die von Ihnen gewünschte Kernelfunktion bereits für Sie erstellt und ist in einem der vorgefertigten Kernel verfügbar. Es gibt Ausnahmen, aber diese sind heutzutage äußerst selten.

Nicht, dass ich Sie davon abhalten würde, Ihren eigenen Kernel zu erstellen, ich ermutige Sie sogar, dies zu tun. Ich denke, es ist von unschätzbarem Wert, Ihren Kernel von Grund auf neu zu erstellen, um zu lernen, wie das alles dort unten funktioniert. Im zweiten Teil, weil vielleicht einen Tag wird die Ausnahme sein , die er braucht. Aber es bringt Ihnen auch viel über den Kernel- und Boot-Prozess im Allgemeinen bei. Du wirst ein besserer Mensch sein, wenn du es getan hast.

Bahamat
quelle
1
Vielen Dank für die verständliche Beschreibung des Prozesses. Ich habe ein paar Zweifel. Meine Kernel-Kompilierung produzierte vmlinux und nicht vmlinuz. Ich denke, der Unterschied liegt in der Komprimierung. Sollte ich das Bild manuell komprimieren? Befindet sich /vmlinuzein Verzeichnis im Stammordner? Wenn ich eine make-Installation durchführe, wird dieses Verzeichnis erstellt und ein neuer Kernel dort abgelegt. Werden make modules_installmeine aktuell installierten Module ersetzt? Angenommen, ich lege mein vmlinux im / boot-Verzeichnis ab, muss ich noch etwas tun (z. B. Grub-Konfigurationsdateien bearbeiten und Grub-Update durchführen oder so?)
AnkurVj
3
Du hast recht, der Unterschied ist die Komprimierung. Der Befehl make bzimageist, was das macht. /vmlinuzist eine Binärdatei, kein Verzeichnis. Ich habe in den letzten 5 Jahren nur gepackte Kernel erstellt, daher kann ich mich nicht genau an das Verhalten modules_installeines direkt installierten Kernels erinnern . Grub findet deinen Kernel /bootohne Hilfe. Ja, Sie sollten immer grub-updatenach der Installation eines neuen Kernels ausgeführt werden.
Bahamat
also hätte ich das machen sollen make bzimagestatt make? Muss ich ein make cleanund make bzimagewieder machen? Durch /vmlinuzmeinen Sie die Datei in dem Root - Verzeichnis oder im Linux - Kernel - Quellverzeichnis erstellt werden?
AnkurVj
1
Es spielt keine Rolle, ob Ihr Kernel komprimiert ist oder nicht. Unkomprimiert nimmt es nur etwas mehr Speicherplatz in Anspruch. Alles, dem ein Präfix vorangestellt /ist, ist ein absoluter Pfad. Ja, das ist eine Datei im Stammverzeichnis.
Bahamat
1
@GuyAvraham Beantwortete Module Ywerden in kompiliert (dh sie sind Teil von vmlinuz). Beantwortete Module Mwerden als ladbare Module übersetzt. Beantwortete Module Nwerden nicht übersetzt. make modules_installgilt nur für die beantworteten M.
Bahamat