Wie erstelle ich einen benutzerdefinierten Kernel mit localmodconfig, der die Hardware mehrerer Computer unterstützt?

9

Wenn Sie einen Server so konfigurieren, dass eine einzelne Aufgabe wie eine Appliance ausgeführt wird, muss möglicherweise ein benutzerdefinierter Kernel erstellt werden. Zum Beispiel, um Speicherplatz zu sparen.

Das Ubuntu Core 13.10 amd64-Root-Dateisystem ist ein 38-MB- Download, bei dem das Metapaket "linux-image-generic" einschließlich der erforderlichen Abhängigkeiten 79 MB Archive herunterlädt und die Größe eines generischen Kernel-image-xyz-Pakets immer noch 14 MB beträgt .

Zum Erstellen eines Kernels, der aus Modulen entfernt ist, die Ihre Hardware nicht verwendet, ist der make localmodconfigBefehl das richtige Werkzeug für den Job. Ihre virtuelle Maschine, auf der Ihre Build- und Testumgebung ausgeführt wird, lädt jedoch andere Module als Ihre Zielbereitstellungshardware. Und / oder nach einer Weile wird Ihre Bereitstellungshardware möglicherweise eol und es wird andere Hardware verwendet. Und in der Häufigkeit, in der Kernel-Updates veröffentlicht werden, kann es zu umständlich werden, einen benutzerdefinierten Kernel für jede unterschiedliche Hardwarekonfiguration zu erstellen.

Wie kann man schnell einen benutzerdefinierten Linux-Kernel erstellen, der auf einigen verschiedenen Hardware-Boxen ausgeführt wird?

Pro Backup
quelle

Antworten:

11

Der make localmodconfigBefehl ist immer noch das richtige Werkzeug für den Job. In der Tat make localmodconfigläuftscripts/kconfig/streamline_config.pl .

Dateieingabe

Beim Lesen des streamline_config.pl(Perl-) Quellcodes gibt es eine undokumentierte Funktion my $lsmod_file = $ENV{'LSMOD'};, die anstelle der Ausgabe des lsmodBefehls die Dateieingabe für die Erkennung geladener Module ermöglicht .

Live-CD

Weil localmodconfig die Ausgabe verwendet lsmod, um die geladenen Module zu erkennen. Wir führen eine Ubuntu Live-CD auf jedem der verschiedenen Hardware-Setups aus, öffnen ein Terminal ( Ctrl+ Alt+ T), führen es aus lsmodund speichern seine Ausgabe.

Ausgabe verketten

Durch Verketten der lsmodAusgabedateien beim Entfernen aufeinanderfolgender Kopfzeilen können Sie schnell eine Eingabedatei erstellen, die alle erforderlichen Kernelmodule abdeckt. Wir möchten die Modulliste von Hand überprüfen und ein manuelleres Rezept verwenden:

  1. $ cd linux-3.11.0/
    oder gehen Sie in das Verzeichnis, in dem Sie Ihren Befehl make ausführen

  2. $ lsmod > lsmod.txt
    Erstellt eine Textdatei mit Ihren geladenen Modulen

  3. $ nano lsmod.txt
    öffnet den Nano-Texteditor, natürlich können Sie Ihre Lieblingseditor-Anwendung verwenden

  4. Hängen Sie die gewünschten Module, die noch nicht vorhanden sind, am Ende dieser Datei an (siehe Beispiel am Ende dieser Antwort) und speichern Sie sie, wenn Sie bereit sind.
    Hinweis: Verwenden Sie Leerzeichen und keine Tabulatoren, um die Positionen der Spaltentabellen anzupassen.

  5. $ make LSMOD="lsmod.txt" localmodconfig
    Dadurch wird localmodconfig angewiesen, Ihre Datei lsmod.txt als Eingabe für die Erkennung geladener Module zu verwenden

In Bezug auf Steven Rostedt - den Autor von steamline_config.pl - für den Vorschlag einer kürzeren Notation in Schritt 5.


Beispiel für das Anhängen und nicht das Anhängen an lsmod.txt (Schritt 4):

Da die Intel D33217CK-Hauptplatine über Intel-Wärmesensoren verfügt, die wir gerne lesen würden, fügen wir folgende Zeilen hinzu:

x86_pkg_temp_thermal   13810  0
intel_powerclamp       14239  0

Wir möchten jedoch keine virtuellen Maschinen auf dieser Hardware ausführen. Deshalb überspringen wir die folgenden Zeilen:

kvm_intel             128218  0
kvm                   364766  1 kvm_intel

Es hat einen Gibabit-Ethernet-Adapter von Apple (Broadcom) an seinen Thunderbolt-Port angeschlossen, daher fügen wir Folgendes hinzu:

tg3                   152066  0
ptp                    18156  1 tg3
pps_core               18546  1 ptp

Wir denken, wir brauchen keine Volumenspiegelung und fügen daher nicht hinzu:

dm_mirror              21715  0
dm_region_hash         15984  1 dm_mirror
dm_log                 18072  2 dm_region_hash,dm_mirror

Außerdem benötigen wir keine Grafikausgabe (Text reicht auf einem Headless-Server aus), daher enthalten wir nicht:

i915                  589697  3
i2c_algo_bit           13197  1 i915
drm_kms_helper         46867  1 i915
drm                   242354  4 i915,drm_kms_helper

Für eine andere Maschine benötigen wir zusätzlich diesen Realtek-Ethernet-Treiber:

r8169                  61434  0
mii                    13654  1 r8169
Pro Backup
quelle