Sie haben sich also entschieden, dieses Ding auszuprobieren, von dem Sie andere sprechen gehört haben, das als „Kompilieren eines benutzerdefinierten Kernels“ bezeichnet wird. Wenn Sie dies als Hobby versuchen oder weil Sie eine neue Fähigkeit erlernen möchten, sehr gut – lesen Sie weiter.
Bevor wir jedoch beginnen, werden wir versuchen, Situationen zu erklären, in denen dieses Bedürfnis auftritt, und wie man damit umgeht. Beachten Sie, dass dies ein umfangreiches Thema ist, das viel mehr Platz benötigt, als wir hier anbieten werden. Sie lernen die Grundlagen, was Sie brauchen, was zu tun ist und was Sie erreichen werden.
Für weitere Informationen ist Google wie immer Ihr Freund; Auch die Dokumentation im Kernel-Quellbaum wird viele Fragen beantworten. Beginnen wir also mit einem letzten Hinweis von vorn:Bei Bedarf werden wir weitere Artikel zum Thema Kernel-Kompilierung für andere Distributionen veröffentlichen.
Wenn Sie Ihren eigenen Kernel kompilieren müssen
Die erste Situation wäre, wenn Sie einen neueren Kernel benötigen, als Ihre Distribution bereitstellt, insbesondere wenn Sie eine stabile Distribution (z Sie möchten das Neueste und Beste ausprobieren.
Eine Warnung jedoch: Wenn Sie einen hochmodernen Kernel ausführen möchten, stellen Sie sicher, dass er mit anderen Schlüsselkomponenten Ihres Systems (wie glibc) kompatibel ist. Denken Sie daran, dass neuere weniger Tests und (wahrscheinlich) mehr Instabilität bedeuten. Die Kernel-Betreuer Ihrer Distribution leisten normalerweise gute Arbeit, indem sie einige neue Funktionen auf ältere, stabilere Kernel zurückportieren. Stellen Sie also sicher, dass Sie wirklich die neuesten Kernel benötigen. Unser Rat ist, diese Kernel (die Langzeit-Kernel würden hier eine Ausnahme machen) nicht auf Produktionssystemen zu verwenden. Wie gesagt, vertrauen Sie den Betreuern Ihrer Distribution.
Die zweite Situation ist, dass Sie das Gefühl haben, einen aufgeblähten Kernel mit vielen unnötigen Komponenten auszuführen. Während der Kernel nur Module lädt, die zu einer vorhandenen Hardware passen, hilft ein geringerer Speicherbedarf des Kernels normalerweise dabei, die Bootzeit zu beschleunigen.
# lspci -vv # lsusb # hwinfo # cat /proc/cpuinfo
Die obigen Befehle helfen Ihnen, Ihre Hardware besser kennenzulernen. Notieren Sie, was Sie gefunden haben, und stellen Sie sicher, dass Sie die obigen ls*-Befehle als root ausführen, um zusätzliche Informationen zu erhalten.
Eine andere Situation wäre, dass Sie beim Testen des Kernels helfen möchten, indem Sie den neuesten Kernel auf Ihrem System ausführen. Es gelten die gleichen Warnungen wie oben:tun Sie dies beim Testen von Systemen, bleiben Sie mit Upstream in Kontakt, falls Sie einen Fehler finden (lkml.org ist die Haupt-Kernel-Mailingliste – hoher Verkehr) und versuchen Sie, so hilfreich wie möglich zu sein, wenn Sie um Informationen gebeten werden .Dies kann nicht genug betont werden:Lesen Sie die Dokumentation, entweder weil Sie sich in einer unangenehmen Situation befinden, einen Fehler melden möchten oder einfach Fragen haben.
Als nächstes möchten Sie vielleicht der coole Junge auf dem Block sein und das Neueste und Beste ausführen, vielleicht einen Blick auf die Quelle werfen (vorausgesetzt, Sie interessieren sich dafür und Sie haben einige C- und ASM-Kenntnisse) und sogar Patches einreichen. Möglicherweise möchten Sie zuerst nachsehen, ob Ihre Distribution nicht bereits ein neueres Kernelpaket anbietet, z. B. können Sie Kernel von Debian Experimental auf einem Testsystem installieren, wenn Sie Ihre sources.list entsprechend ändern. Arbeiten Sie wieder mit den Betreuern zusammen, wenn Sie auf einen Fehler stoßen.
Terminologie
Bevor wir uns weiter mit diesem etwas geheimnisvollen Thema befassen, sollten wir einige grundlegende Begriffe klarstellen (äh); dies ist wichtig, um wichtige Teile des Kernel-Testens und -Kompilierens zu verstehen.
- Kernel – Der Kern des Betriebssystems, verantwortlich für die Verwaltung von Hardwareressourcen (E/A, Netzwerk, CPU, Speicher…). Im Grunde genommen ist es der wesentliche Teil des Betriebssystems, der für die ganze Drecksarbeit verantwortlich ist. Benutzerprogramme kommunizieren mit dem Kernel und fordern CPU-Zeit oder andere Ressourcen durch Systembibliotheken an, die als Vermittler zwischen Userland (siehe unten) und dem Kernel / der Hardware fungieren. Kernel können monolithisch und Mikrokernel sein (weitere Informationen finden Sie bei Interesse unter Kernel-weite Designansätze auf Wikipedia.org . Mikrokernel (wie Minix) verwenden ein Designschema, das den Kern vom Rest des Kernels trennt, und so weiter Der Rest ist in Komponenten unterteilt, von denen jede etwas Bestimmtes tut:E/A, Netzwerk usw. Monolithische Kernel (Linux, BSD, Solaris) umfassen, wie der Name schon sagt, den größten Teil des Kernels in einer Einheit und verfügen über zusätzliche Funktionen (z. B. Treiber ) von Modulen bereitgestellt. Es gibt auch hybride Kernel, eine Kombination aus beiden, ein gutes Beispiel ist der Windows-Kernel.
- Nutzerland – Alles in einem Betriebssystem, das nicht Teil des Kernels ist (Bibliotheken, Anwendungen), wird als Teil des Benutzerlandes bezeichnet. Der Name ist so offensichtlich.
- Modul – Wie zuvor gezeigt, ist ein Kernel-Modul ein Stück Binärsoftware, das dem Kernel im Grunde „beibringt“, wie er mit einem Stück Hardware „spricht“ oder einige Funktionen bereitstellt (z. B. NFS)
- Compiler – Der Compiler ist eine Anwendung, die im Grunde genommen den geschriebenen Code, den Sie von kernel.org heruntergeladen haben, in Binärdateien umwandelt. Der in Linux-Distributionen zu findende Compiler heißt „gcc“, und das steht für GNU Compiler Collection, die auch Komponenten benötigt, die zum Erstellen von Software unerlässlich sind:Dienstprogramme, die in Binutils wie Assembler (as) oder Bibliotheksarchivierer (ar) zu finden sind. Auf Debian-Systemen oder Ubuntu, kann man herausfinden, zu welchem Paket eine Datei gehört, indem man apt-file installiert und ausführt. Apropos, lassen Sie uns sehen, welche Pakete wir für einen erfolgreichen Kernel-Build installieren müssen.
- Vanillekern – dies ist der Name, der für den Upstream-Kernel verwendet wird, wie er auf kernel.org zu finden ist, also ohne distrospezifische Patches.
Bitte beachten Sie, dass jedes Mal, wenn Sie in diesem Dokument einen Befehl sehen, der mit der Eingabeaufforderung ‘$’ beginnt das bedeutet, dass der Befehl als normaler, alltäglicher Benutzer ausgeführt werden muss; immer wenn Sie das ‘#’ sehen prompt, das heißt, der Befehl muss als root ausgeführt werden (wir verwenden sudo, aber das ist nicht zwingend). Das aktuelle Verzeichnis ist, sofern nicht anders angegeben, dasjenige, das Ihren Quellbaum enthält, in diesem Fall linux-2.6.
Was Sie installieren müssen
- gcc – der Compiler ist natürlich unerlässlich
- binutils – dieses Paket enthält den Linker, Assembler und andere Dienstprogramme, die zum Kompilieren von in C geschriebenen Programmen unerlässlich sind.
- gcc-doc – die Handbuch- und Infoseiten für gcc. Nützlich, wenn Sie schmutzig werden und einige Kompilierungs-Flags ändern möchten. Trotzdem nützlich, wenn Sie C-Pakete schreiben oder kompilieren möchten.
- gdb – Der GNU-Debugger. Nicht obligatorisch, aber nützlich, wenn etwas schief geht. Gdb-doc hilft auch.
- libreadline5-dev – zur Verwendung der ncurses-basierten Schnittstelle zur Kernelkonfiguration. Sie können andere Schnittstellen verwenden (siehe unten).
- make – wird als Abhängigkeit installiert, aber ein paar Worte sind angebracht. Ziehen Sie das Handbuch oder die Bücher zu Rate, da dies kein Thema ist, das in so kurzer Zeit leichtfertig erklärt werden sollte. Make ist ein Dienstprogramm, das beim Kompilieren von C/C++-Programmen verwendet wird, und es sieht in einem Makefile nach, das Regeln darüber enthält, wie und in welcher Reihenfolge der Build erfolgen soll, und versucht, diese Anweisungen auszuführen. Lesen Sie die Makefiles im Quellbaum, um einen Einblick zu bekommen.
- git – Git ist ein VCS (Versionskontrollsystem), das tut, was CVS oder Subversion tun, nämlich Sie mit dem neusten Kernelbaum auf dem Laufenden zu halten.
Kernel-Quelle abrufen
Wenn Sie die Quelle von Ihrer Distribution installieren möchten, verwenden Sie
# apt-get install linux-source-<version>
wobei
uname -r
Verwenden Sie dies, wenn Sie Ihren vorhandenen Kernel ändern möchten (Hinzufügen von Treibern, Trimmen usw.). Andernfalls möchten Sie den Vanillekern. Sie können es von www.kernel.org herunterladen (wir empfehlen hier wget oder curl als Download-Manager) oder, wenn Sie das Neueste wollen, verwenden Sie git. Wir empfehlen, die Quelle im Home-Verzeichnis Ihres Benutzers zu speichern, und der Befehl zum Abrufen des neuesten Mainline-Baums lautet (siehe man git ):
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git linux-2.6
In der Vergangenheit fanden wir das Mini-Howto unter http://linux.yyz.us/git-howto.html hilfreich; Besuchen Sie auch kernelnewbies.org . Der obige Befehl erstellt einen Ordner in Ihrem aktuellen Verzeichnis mit dem Namen linux-2.6, der später aktualisiert werden kann, indem Sie ihn mit einer CD kopieren und eine einfache
make clean; git pull
Jetzt, nachdem Sie die Quelle haben, müssen wir den Kernel konfigurieren .
Konfiguration und Aufbau
Wenn Sie eine vorhandene .config-Datei haben (die Datei, die die Optionen für die Kernel-Erstellung enthält – was hineinpasst und was nicht), kopieren Sie sie in linux-2.6 (aus /boot/config-
$ make oldconfig
Ansonsten lesen Sie weiter. Wenn Sie die vorhandene Konfiguration ändern möchten, geben Sie
$ make menuconfig
(Empfehlung:Sie können make config für viele Fragen zu Optionen im Kernel verwenden oder make xconfig , das qt-Bibliotheken benötigt, für ein schöneres, grafisches Menü), und wählen Sie „Load an Alternate Configuration File“ und drücken Sie die Eingabetaste für .config , den Standardnamen der Konfigurationsdatei, oder geben Sie einen alternativen Dateinamen ein, der bereits in linux-2.6 gespeichert ist.
Gehen Sie danach durch die Menüs, um die notwendigen Änderungen vorzunehmen. Die Faustregel lautet hier:„Wenn Sie nicht wissen, was es tut, spielen Sie nicht damit herum“, zumindest bis Sie etwas Erfahrung gesammelt haben. Wählen Sie am Ende im oberen Menü „Alternative Konfigurationsdatei speichern“ , drücken Sie die Eingabetaste für den Standardnamen (.config – empfohlen) und dann „Beenden“ von unten. Wenn Sie ganz von vorne anfangen möchten, vergessen Sie den Schritt „Eine alternative Konfigurationsdatei laden“ und fahren Sie fort. Verwenden Sie bei Ihrer nächsten Kernel-Kompilierung nach dem Bereinigen und Aktualisieren des Baums „make oldconfig“ wie oben, um die alte Konfiguration zu verwenden. OK, jetzt haben wir die auf unsere Bedürfnisse zugeschnittene Konfiguration, die nur darauf wartet, gebaut zu werden. Das Erstellen eines Kernels ist so einfach wie das Konfigurieren (!). Geben Sie einfach make ein und die Ausgabe sollte wie folgt aussehen:
$ make HOSTCC scripts/basic/fixdep HOSTCC scripts/kconfig/conf.o SHIPPED scripts/kconfig/zconf.tab.c SHIPPED scripts/kconfig/zconf.lex.c SHIPPED scripts/kconfig/zconf.hash.c HOSTCC scripts/kconfig/zconf.tab.o HOSTLD scripts/kconfig/conf CHK include/linux/version.h UPD include/linux/version.h CHK include/generated/utsrelease.h UPD include/generated/utsrelease.h CC kernel/bounds.s GEN include/generated/bounds.h CC arch/x86/kernel/asm-offsets.s ...
und nach einer Weile, abhängig von Ihrer Maschinen- und Kernelkonfiguration, wird es fertig sein. Wenn Sie die Dinge etwas beschleunigen möchten, verwenden Sie das Flag -jn für make, wobei n die Anzahl der Prozessoren/Kerne + 1 ist. Seien Sie jedoch vorsichtig, da dies Fehler im Kernel oder der Build-Infrastruktur aufdecken kann. Wenn also etwas schief geht, versuchen Sie es erneut, indem Sie einfach make ohne Flags verwenden. Wenn Sie sich nach dem Lesen des gcc-Handbuchs (und wenn Sie immer noch bei Verstand sind) abenteuerlustig fühlen und einige Hardware-spezifische Flags modifizieren oder den Code optimieren möchten, verwenden Sie die Handbuchseite make, um herauszufinden, wie (hauptsächlich COPTS und CFLAGS ). Allerdings sind Optimierungen größer als -O2 riskant.
Seien Sie vorsichtig und erwarten Sie einen Bruch, der Kernel kann problemlos kompiliert werden, aber er kann sich seltsam verhalten. Denken Sie daran, alle Befehle als normaler Benutzer einzugeben. Es ist nicht erforderlich, als root zu bauen, und die Kernel-Entwickler missbilligen die Idee.
Installation
Lassen Sie uns nun die Module installieren:Dies muss als root erfolgen, da die Module in /lib installiert werden und der normale Benutzer dort keinen Schreibzugriff hat. Also,
# make modules_install
tut genau das, und dies muss vor der Installation des Kernels erfolgen, damit Module und installierter Kernel synchron sind. Verwenden Sie
# make install
um den Kernel nach /boot zu installieren, dann
# depmod
und bereiten Sie die Erstellung eines initramfs ( Initial RAM Filesystem ) vor, das ein temporäres Dateisystem ist, das in frühen Boot-Phasen in den RAM geladen wird und zur Bereitstellung grundlegender Treiber und anderer Einrichtungen verwendet wird, damit das Root-Dateisystem gemountet werden kann. Weitere Informationen finden Sie auf der Initrd-Seite von Wikipedia. Der für die Aufgabe benötigte Befehl ist update-initramfs (dieser wird auch aufgerufen, wenn ein neuer Kernel installiert wird, ausgelöst durch den Paketmanager), der ein initramfs erstellen ( -c ) oder ein vorhandenes aktualisieren ( -u ) kann. Der vollständige Befehl lautet
# update-initramfs -c -k
Die Version ist die, die Sie sehen, nachdem „make modules_install“ beendet ist (die letzte Zeile der Ausgabe ist „DEPMOD“). Wenn Sie die genaue und längere Versionsnummer haben möchten, können Sie den Entwicklern mitteilen, welcher „Git-Moment“ vorliegt. Sie verwendet haben, wählen Sie „General Setup“ → „Automatically append version information to the version string“, nachdem Sie menuconfig. Die Ausgabe auf meinem Ubuntu-System sieht so aus:
update-initramfs: Generating /boot/initrd.img-3.1.0-rc3+ ...
Aktualisieren Sie Ihr Grub so, dass es Ihren neuen Kernel mit
bemerkt# update-grub
Auf meiner Debian-Testmaschine sieht die Ausgabe so aus:
Generating grub.cfg ... Found background image: /usr/share/images/desktop-base/desktop-grub.png Found linux image: /boot/vmlinuz-3.0.0-1-amd64 Found initrd image: /boot/initrd.img-3.0.0-1-amd64 Found linux image: /boot/vmlinuz-3.0.0-rc6-amd64 Found initrd image: /boot/initrd.img-3.0.0-rc6-amd64 Found linux image: /boot/vmlinuz-2.6.39-07727-gbd1bfe4 Found initrd image: /boot/initrd.img-2.6.39-07727-gbd1bfe4 Found linux image: /boot/vmlinuz-2.6.39-2-amd64 Found initrd image: /boot/initrd.img-2.6.39-2-amd64 Found linux image: /boot/vmlinuz-2.6.39-rc7-amd64 Found initrd image: /boot/initrd.img-2.6.39-rc7-amd64 Found linux image: /boot/vmlinuz-2.6.38.5 Found initrd image: /boot/initrd.img-2.6.38.5 Found linux image: /boot/vmlinuz-2.6.38.4-00001-gfaa8ee7 Found initrd image: /boot/initrd.img-2.6.38.4-00001-gfaa8ee7 Found linux image: /boot/vmlinuz-2.6.38.4 Found initrd image: /boot/initrd.img-2.6.38.4 Found linux image: /boot/vmlinuz-2.6.38-2-amd64 Found initrd image: /boot/initrd.img-2.6.38-2-amd64 Found linux image: /boot/vmlinuz-2.6.32-5-amd64 Found initrd image: /boot/initrd.img-2.6.32-5-amd64 Found memtest86+ image: /memtest86+.bin Found memtest86+ multiboot image: /memtest86+_multiboot.bin done
Natürlich wird Ihre Ausgabe nicht genau gleich aussehen, aber die Gliederung sollte gleich sein; Denken Sie schließlich daran:Wenn Sie möchten, bearbeiten Sie /etc/default/grub, um einige Optionen vor update-grub zu ändern, und starten Sie mit gedrückten Daumen Ihren Computer neu, um den neuen Kernel zu testen.
Wenn etwas schief geht
Die häufigsten Situationen, in denen Ihr neuer Kernel unbrauchbar ist, sind, dass Sie ihn überhaupt nicht booten können oder dass er bootet und einen wesentlichen Treiber nicht hat (z. B. Netzwerktreiber). Normalerweise leistet update-grub gute Arbeit beim Schreiben der Grub-Menüdatei, aber Sie sollten es sich trotzdem ansehen. Wenn Sie grub passieren, sind Sie wahrscheinlich übereifrig geworden und haben einen wesentlichen Treiber für das System ausgesondert, wie die festplattenbezogenen Teile (ATA, SATA, SCSI ...) oder vielleicht NFS, wenn Sie ein NFS-gemountetes Root haben. Booten Sie einen funktionierenden Kernel und konfigurieren Sie ihn neu, indem Sie Google und mögliche andere Quellen wie IRC verwenden.
Wahrscheinlich ist jemand in der Vergangenheit bereits auf Ihr Problem gestoßen und Sie haben Chancen, eine Antwort zu finden. Wenn das Problem schwerwiegender ist und Sie sicher sind, dass Sie etwas über Netiquette gelesen haben und wie Sie an die Kernel-Mailingliste posten, fragen Sie freundlich. Es gibt viele nette und hilfsbereite Menschen da draußen, aber sie neigen dazu, nicht so nett zu sein, wenn Sie Ihre Hausaufgaben nicht gemacht haben und/oder ihre Zeit verschwenden. Wenn Sie ein separates /boot haben, denken Sie daran, dass es normalerweise nicht sehr groß ist und sich schnell mit Kerneln füllen kann. Außerdem neigt /lib/modules dazu, viel Speicherplatz in / anzuhäufen, also räumen Sie von Zeit zu Zeit etwas auf. Denken Sie daran, dass der Kernel ein komplexes Stück Software ist und viele Ursachen die Ursache Ihrer Probleme sein können. Wenn Sie dieser Anleitung keine Probleme bereitet haben, sind Sie bereit für eine fortgeschrittenere Linux-Kernel-Konfiguration.