GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie man einen Linux-Kernel im 21. Jahrhundert kompiliert

Beim Computing ist ein Kernel die Low-Level-Software, die die Kommunikation mit der Hardware und die allgemeine Systemkoordination übernimmt. Abgesehen von einer anfänglichen Firmware, die in die Hauptplatine Ihres Computers integriert ist, sorgt der Kernel beim Starten Ihres Computers dafür, dass er über eine Festplatte, einen Bildschirm, eine Tastatur und eine Netzwerkkarte verfügt. Es ist auch die Aufgabe des Kernels, sicherzustellen, dass jeder Komponente die gleiche Zeit (mehr oder weniger) gegeben wird, damit Ihre Grafik und Ihr Audio und Ihr Dateisystem und Ihr Netzwerk reibungslos laufen, auch wenn sie gleichzeitig laufen.

Die Suche nach Hardwareunterstützung geht jedoch weiter, denn je mehr Hardware veröffentlicht wird, desto mehr Dinge muss ein Kernel in seinen Code aufnehmen, damit die Hardware wie erwartet funktioniert. Es ist schwierig, genaue Zahlen zu erhalten, aber der Linux-Kernel gehört sicherlich zu den Top-Kernels für Hardware-Kompatibilität. Linux betreibt unzählige Computer und Mobiltelefone, Embedded-System-on-a-Chip (SoC)-Boards für Hobby- und Industrieanwendungen, RAID-Karten, Nähmaschinen und vieles mehr.

Verwandte Inhalte

Damals im 20. Jahrhundert (und sogar in den frühen Jahren des 21. Jahrhunderts) war es für einen Linux-Benutzer nicht unvernünftig zu erwarten, dass er beim Kauf einer ganz neuen Hardware den allerneuesten Kernel-Quellcode herunterladen musste, Kompilieren Sie es und installieren Sie es, damit sie Support für das Gerät erhalten. In letzter Zeit dürfte es Ihnen jedoch schwer fallen, einen Linux-Benutzer zu finden, der seinen eigenen Kernel kompiliert, außer zum Spaß oder zum Profit durch hochspezialisierte kundenspezifische Hardware. Es ist heutzutage im Allgemeinen nicht erforderlich, den Linux-Kernel selbst zu kompilieren.

Hier sind die Gründe dafür, plus ein kurzes Tutorial, wie man einen Kernel kompiliert, wenn es nötig ist.

Aktualisieren Sie Ihren bestehenden Kernel

Egal, ob Sie einen brandneuen Laptop mit einer schicken neuen Grafikkarte oder einem neuen WiFi-Chipsatz haben oder gerade einen neuen Drucker nach Hause gebracht haben, Ihr Betriebssystem (entweder GNU+Linux oder einfach Linux genannt, was auch der Name des Kernels ist ) benötigt einen Treiber, um Kommunikationskanäle zu dieser neuen Komponente (Grafikkarte, WiFi-Chip, Drucker oder was auch immer) zu öffnen. Es kann manchmal trügerisch sein, wenn Sie ein neues Gerät anschließen und Ihr Computer erscheint es anzuerkennen. Aber lassen Sie sich davon nicht täuschen. Manchmal ist das so alles, was Sie brauchen, aber manchmal verwendet Ihr Betriebssystem nur generische Protokolle, um ein angeschlossenes Gerät zu prüfen.

Beispielsweise kann Ihr Computer Ihren neuen Netzwerkdrucker identifizieren, aber manchmal liegt das nur daran, dass die Netzwerkkarte im Drucker so programmiert ist, dass sie sich gegenüber einem Netzwerk identifiziert, damit sie eine DHCP-Adresse erhalten kann. Dies bedeutet nicht unbedingt, dass Ihr Computer weiß, welche Anweisungen an den Drucker gesendet werden müssen, um eine Seite mit gedrucktem Text zu erstellen. Tatsächlich könnten Sie argumentieren, dass der Computer nicht einmal wirklich „weiß“, dass das Gerät ein Drucker ist; es kann nur anzeigen, dass es ein Gerät im Netzwerk unter einer bestimmten Adresse gibt, und das Gerät identifiziert sich selbst mit der Zeichenfolge p-r-i-n-t-e-r . Die Konventionen der menschlichen Sprache sind für einen Computer bedeutungslos; Was es braucht, ist ein Treiber.

Kernel-Entwickler, Hardware-Hersteller, Support-Techniker und Bastler wissen alle, dass ständig neue Hardware veröffentlicht wird. Viele von ihnen steuern Treiber bei, die direkt an das Kernel-Entwicklungsteam zur Aufnahme in Linux übermittelt werden. Beispielsweise werden Nvidia-Grafikkartentreiber oft in das Nouveau-Kernelmodul geschrieben, und da Nvidia-Karten weit verbreitet sind, ist der Code normalerweise in jedem Kernel enthalten, der für die allgemeine Verwendung verteilt wird (z. B. der Kernel, den Sie erhalten, wenn Sie Fedora oder Ubuntu herunterladen. Wo Nvidia ist weniger verbreitet, zum Beispiel in eingebetteten Systemen wird das Nouveau-Modul normalerweise ausgeschlossen.Ähnliche Module gibt es für viele andere Geräte:Drucker profitieren von Foomatic und CUPS, drahtlose Karten haben b43-, ath9k-, wl-Module und so weiter.

Distributionen neigen dazu, so viel wie möglich in ihre Linux-Kernel-Builds aufzunehmen, weil sie möchten, dass Sie ein Gerät anschließen und sofort verwenden können, ohne dass eine Treiberinstallation erforderlich ist. Zum größten Teil passiert das, besonders jetzt, da viele Gerätehersteller jetzt die Entwicklung von Linux-Treibern für die von ihnen verkaufte Hardware finanzieren und diese Treiber direkt an das Kernel-Team zur allgemeinen Verteilung senden.

Manchmal führen Sie jedoch einen Kernel aus, den Sie vor sechs Monaten installiert haben, zusammen mit einem aufregenden neuen Gerät, das erst vor einer Woche in den Handel gekommen ist. In diesem Fall hat Ihr Kernel möglicherweise keinen Treiber für dieses Gerät. Die gute Nachricht ist, dass sehr oft ein Treiber für dieses Gerät in einer sehr neuen Version des Kernels vorhanden ist, was bedeutet, dass Sie nur aktualisieren müssen, was Sie ausführen.

Im Allgemeinen geschieht dies über einen Paketmanager. Zum Beispiel auf RHEL, CentOS und Fedora:

$ sudo dnf update kernel

Holen Sie sich bei Debian und Ubuntu zuerst Ihre aktuelle Kernel-Version:

$ uname -r
4.4.186

Nach neueren Versionen suchen:

$ sudo apt update
$ sudo apt search linux-image

Installieren Sie die neueste Version, die Sie finden. In diesem Beispiel ist die neueste verfügbare Version 5.2.4:

$ sudo apt install linux-image-5.2.4

Nach einem Kernel-Upgrade müssen Sie neu starten (es sei denn, Sie verwenden kpatch oder kgraft). Wenn sich der benötigte Gerätetreiber dann im neuesten Kernel befindet, funktioniert Ihre Hardware wie erwartet.

Installieren Sie ein Kernelmodul

Manchmal erwartet eine Distribution nicht, dass ihre Benutzer ein Gerät oft verwenden (oder zumindest nicht genug, dass der Gerätetreiber im Linux-Kernel sein muss). Linux verfolgt einen modularen Ansatz für Treiber, sodass Distributionen separate Treiberpakete liefern können, die vom Kernel geladen werden können, obwohl der Treiber nicht in den Kernel selbst kompiliert ist. Dies ist nützlich, obwohl es kompliziert werden kann, wenn ein Treiber nicht in einem Kernel enthalten ist, aber während des Bootens benötigt wird oder wenn der Kernel unter dem modularen Treiber aktualisiert wird. Das erste Problem wird mit einer initrd gelöst (anfängliche RAM-Disk) und ist für diesen Artikel nicht relevant, und das zweite wird durch ein System namens kmod gelöst .

Das kmod-System sorgt dafür, dass beim Update eines Kernels auch alle daneben installierten modularen Treiber aktualisiert werden. Wenn Sie einen Treiber manuell installieren, verpassen Sie die Automatisierung, die kmod bietet, also sollten Sie sich für ein kmod-Paket entscheiden, wann immer es verfügbar ist. Während beispielsweise Nvidia-Treiber als Nouveau-Treiber in den Kernel integriert sind, werden die offiziellen Nvidia-Treiber nur von Nvidia vertrieben. Sie können Treiber der Marke Nvidia manuell installieren, indem Sie auf die Website gehen und die Datei .run herunterladen -Datei und Ausführen des bereitgestellten Shell-Skripts, aber Sie müssen denselben Vorgang wiederholen, nachdem Sie einen neuen Kernel installiert haben, da nichts Ihrem Paketmanager mitteilt, dass Sie einen Kernel-Treiber manuell installiert haben. Da Nvidia Ihre Grafik steuert, bedeutet die manuelle Aktualisierung des Nvidia-Treibers normalerweise, dass Sie das Update von einem Terminal aus durchführen müssen, da Sie ohne einen funktionierenden Grafiktreiber keine Grafik haben.

Wenn Sie jedoch die Nvidia-Treiber als kmod-Paket installieren, aktualisiert die Aktualisierung Ihres Kernels auch Ihren Nvidia-Treiber. Auf Fedora und Verwandten:

$ sudo dnf install kmod-nvidia

Auf Debian und Verwandten:

$ sudo apt update
$ sudo apt install nvidia-kernel-common nvidia-kernel-dkms nvidia-glx nvidia-xconfig nvidia-settings nvidia-vdpau-driver vdpau-va-driver

Dies ist nur ein Beispiel, aber wenn Sie Nvidia-Treiber im wirklichen Leben installieren, müssen Sie auch den Nouveau-Treiber auf die schwarze Liste setzen. Die besten Schritte finden Sie in der Dokumentation Ihrer Distribution.

Laden Sie einen Treiber herunter und installieren Sie ihn

Nicht alles ist im Kernel enthalten und nicht alles andere ist als Kernelmodul verfügbar. In einigen Fällen müssen Sie einen speziellen Treiber herunterladen, der vom Hardwarehersteller geschrieben und gebündelt wurde, und in anderen Fällen haben Sie den Treiber, aber nicht das Frontend, um die Treiberoptionen zu konfigurieren.

Zwei gängige Beispiele sind HP-Drucker und Wacom-Illustrationstabletts. Wenn Sie einen HP-Drucker erwerben, verfügen Sie wahrscheinlich über generische Treiber, die mit Ihrem Drucker kommunizieren können. Vielleicht kannst du sogar drucken. Der generische Treiber ist jedoch möglicherweise nicht in der Lage, spezielle Optionen speziell für Ihr Modell bereitzustellen, wie z. B. doppelseitiges Drucken, Sortieren, Auswahl von Papierfächern usw. HPLIP (das HP Linux Imaging and Printing System) bietet Optionen zum Verwalten von Aufträgen, zum Anpassen von Druckoptionen, zum Auswählen von Papierfächern, sofern zutreffend, und so weiter.

HPLIP ist normalerweise in Paketmanagern gebündelt; suchen Sie einfach nach "hplip."

In ähnlicher Weise sind Treiber für Wacom-Tablets, das führende Illustrationstablett für digitale Künstler, normalerweise in Ihrem Kernel enthalten, aber Optionen zur Feinabstimmung von Einstellungen wie Druckempfindlichkeit und Tastenfunktionen sind nur über das standardmäßig enthaltene grafische Bedienfeld zugänglich GNOME, aber als Extrapaket kde-config-tablet installierbar auf KDE.

Es gibt wahrscheinlich einige Grenzfälle, die keine Treiber im Kernel haben, aber kmod-Versionen von Treibermodulen als RPM- oder DEB-Datei anbieten, die Sie herunterladen und über Ihren Paketmanager installieren können.

Patching und Kompilierung Ihres eigenen Kernels

Selbst in der futuristischen Utopie des 21. Jahrhunderts gibt es Anbieter, die Open Source nicht genug verstehen, um installierbare Treiber bereitzustellen. Manchmal stellen solche Unternehmen Quellcode für einen Treiber bereit, erwarten aber, dass Sie den Code herunterladen, einen Kernel patchen, kompilieren und manuell installieren.

Diese Art von Verteilungsmodell hat die gleichen Nachteile wie die Installation von gepackten Treibern außerhalb des kmod-Systems:Eine Aktualisierung Ihres Kernels beschädigt den Treiber, da er jedes Mal manuell in Ihren Kernel integriert werden muss, wenn der Kernel gegen einen neuen ausgetauscht wird.

Dies ist glücklicherweise selten geworden, weil das Linux-Kernel-Team hervorragende Arbeit geleistet hat, indem es Unternehmen lautstark dazu aufgerufen hat, mit ihnen zu kommunizieren, und weil Unternehmen endlich akzeptieren, dass Open Source nicht in absehbarer Zeit verschwinden wird. Aber es gibt immer noch neue oder hyperspezialisierte Geräte, die nur Kernel-Patches bereitstellen.

Offiziell gibt es verteilungsspezifische Einstellungen dafür, wie Sie einen Kernel kompilieren sollten, um Ihren Paketmanager in die Aktualisierung eines so wichtigen Teils Ihres Systems einzubeziehen. Es gibt zu viele Paketmanager, um sie alle abzudecken; Als Beispiel sehen Sie hier, was hinter den Kulissen passiert, wenn Sie Tools wie rpmdev verwenden auf Fedora oder build-essential und devscripts auf Debian.

Finden Sie zunächst, wie üblich, heraus, welche Kernel-Version Sie verwenden:

$ uname -r

In den meisten Fällen ist es sicher, Ihren Kernel zu aktualisieren, wenn Sie dies noch nicht getan haben. Schließlich ist es möglich, dass Ihr Problem in der neuesten Version behoben wird. Wenn Sie das versucht haben und es nicht funktioniert hat, sollten Sie den Quellcode des Kernels herunterladen, den Sie ausführen. Die meisten Distributionen bieten dafür einen speziellen Befehl, aber um es manuell zu machen, finden Sie den Quellcode auf kernel.org.

Sie müssen auch jeden Patch herunterladen, den Sie für Ihren Kernel benötigen. Manchmal sind diese Patches spezifisch für die Kernel-Version, wählen Sie sie also sorgfältig aus.

Es ist Tradition, oder zumindest damals, als die Leute regelmäßig ihre eigenen Kernel kompilierten, den Quellcode und die Patches in /usr/src/linux zu platzieren .

Entpacken Sie die Kernel-Quelle und die Patch-Dateien nach Bedarf:

$ cd /usr/src/linux
$ bzip2 --decompress linux-5.2.4.tar.bz2
$ cd  linux-5.2.4
$ bzip2 -d ../patch*bz2

Die Patch-Datei enthält möglicherweise Anweisungen zur Durchführung des Patches, aber häufig sind sie so konzipiert, dass sie von der obersten Ebene Ihres Baums ausgeführt werden:

$ patch -p1 < patch*example.patch

Sobald der Kernel-Code gepatcht ist, können Sie Ihre alte Konfiguration verwenden, um die gepatchte Kernel-Konfiguration vorzubereiten:

$ make oldconfig

Die make oldconfig Der Befehl dient zwei Zwecken:Er erbt die Konfiguration Ihres aktuellen Kernels und erlaubt Ihnen, neue Optionen zu konfigurieren, die durch den Patch eingeführt wurden.

Möglicherweise müssen Sie make menuconfig ausführen Befehl, der eine ncurses-basierte, menügesteuerte Liste möglicher Optionen für Ihren neuen Kernel startet. Das Menü kann überwältigend sein, aber da es mit Ihrer alten Konfiguration als Grundlage beginnt, können Sie das Menü durchsuchen und Module für Hardware deaktivieren, von der Sie wissen, dass Sie sie nicht haben und die Sie voraussichtlich nicht benötigen werden. Alternativ können Sie, wenn Sie wissen, dass Sie ein Stück Hardware haben und sehen, dass es nicht in Ihrer aktuellen Konfiguration enthalten ist, es entweder als Modul oder direkt in den Kernel einbauen. Theoretisch ist dies nicht erforderlich, da Ihr aktueller Kernel Sie vermutlich bis auf den fehlenden Patch gut behandelt hat und der von Ihnen angewendete Patch wahrscheinlich alle erforderlichen Optionen aktiviert hat, die von dem Gerät benötigt werden, das Sie überhaupt dazu veranlasst hat, Ihren Kernel zu patchen .

Als nächstes kompilieren Sie den Kernel und seine Module:

$ make bzImage
$ make modules

Dies lässt Sie mit einer Datei namens vmlinuz zurück , die eine komprimierte Version Ihres bootfähigen Kernels ist. Speichern Sie Ihre alte Version und platzieren Sie die neue in Ihrem /boot Verzeichnis:

$ sudo mv /boot/vmlinuz /boot/vmlinuz.nopatch
$ sudo cat arch/x86_64/boot/bzImage > /boot/vmlinuz
$ sudo mv /boot/System.map /boot/System.map.stock
$ sudo cp System.map /boot/System.map

Bisher haben Sie einen Kernel und seine Module gepatcht und gebaut, Sie haben den Kernel installiert, aber Sie haben keine Module installiert. Das ist der letzte Build-Schritt:

$ sudo make modules_install

Der neue Kernel ist vorhanden und seine Module sind installiert.

Der letzte Schritt besteht darin, Ihren Bootloader zu aktualisieren, damit der Teil Ihres Computers, der vor dem Kernel geladen wird, weiß, wo er Linux findet. Der GRUB-Bootloader macht diesen Vorgang relativ einfach:

$ sudo grub2-mkconfig

Real-World-Compiling

Natürlich führt jetzt niemand diese manuellen Befehle aus. Schlagen Sie stattdessen in Ihrer Distribution nach, um Anweisungen zum Modifizieren eines Kernels mit dem Entwickler-Toolset zu erhalten, das die Betreuer Ihrer Distribution verwenden. Dieses Toolset erstellt wahrscheinlich ein neues installierbares Paket mit allen integrierten Patches, benachrichtigt den Paketmanager über das Upgrade und aktualisiert Ihren Bootloader für Sie.

Kernel

Betriebssysteme und Kernel sind mysteriöse Dinge, aber es braucht nicht viel, um zu verstehen, auf welchen Komponenten sie aufgebaut sind. Wenn Sie das nächste Mal eine Technologie erhalten, die unter Linux nicht zu funktionieren scheint, atmen Sie tief durch, untersuchen Sie die Treiberverfügbarkeit und gehen Sie den Weg des geringsten Widerstands. Linux ist einfacher denn je – und dazu gehört auch der Kernel.


Linux
  1. So aktualisieren Sie den Kernel auf dem Linux-Desktop

  2. Linux – Wie finde ich die Implementierungen von Linux-Kernel-Systemaufrufen?

  3. Wie stellen Sie die Hardwareuhr unter Linux programmgesteuert ein?

  4. So bereinigen Sie Caches, die vom Linux-Kernel verwendet werden

  5. Wie kann ich einen Speicherblock aus dem Linux-Kernel reservieren?

So aktualisieren Sie den Linux-Kernel auf CentOS 7

Wie man einen Kernel kompiliert – Der Debian-Weg

So installieren Sie den neuesten Linux-Kernel auf CentOS 7

So zeigen Sie Hardwareinformationen unter Linux an

So kompilieren Sie den Linux-Kernel aus der Quelle, um einen benutzerdefinierten Kernel zu erstellen

Wie lädt Linux das 'initrd'-Image?