Ich möchte versuchen, einen anderen Kernel als den von meiner Distribution bereitgestellten zu verwenden – entweder von woanders oder von mir angepasst. Ist das schwierig oder gefährlich?
Wo fange ich an?
Akzeptierte Antwort:
Das Erstellen eines benutzerdefinierten Kernels kann zeitaufwändig sein – hauptsächlich in der Konfiguration, da moderne Computer das Erstellen in wenigen Minuten erledigen können – aber es ist nicht besonders gefährlich, wenn Sie behalten Ihren aktuellen, funktionierenden Kernel und stellen sicher, dass Sie diesen als Option über Ihren Bootloader belassen (siehe Schritt 6 unten). Auf diese Weise können Sie, wenn Ihr neuer nicht funktioniert, einfach den alten neu starten.
In den folgenden Anweisungen haben Pfade innerhalb des Quellbaums die Form [src]/whatever
, wobei [src]
ist das Verzeichnis, in dem Sie die Quelle installiert haben, z. /usr/src/linux-3.13.3
. Wahrscheinlich möchten Sie diese Dinge tun su root
da der Quellbaum in Bezug auf Schreibrechte sicher bleiben sollte (er sollte root gehören).
Während einige der Schritte optional sind, sollten Sie sie trotzdem lesen, da sie Informationen enthalten, die zum Verständnis des restlichen Prozesses erforderlich sind.
-
Laden Sie den Quell-Tarball herunter und entpacken Sie ihn.
Diese sind auf kernel.org erhältlich. Die neuesten sind auf der Titelseite aufgelistet, aber wenn Sie in
/pub/
schauen Verzeichnis finden Sie ein Archiv, das bis zur Version 1.0 zurückreicht. Wenn Sie keinen besonderen Grund haben, wählen Sie am besten einfach den „Neuesten Stall“. Zum Zeitpunkt des Schreibens dieses Artikels ist dies eine 74 MB großetar.xz
Datei.Sobald der Tarball heruntergeladen ist, müssen Sie ihn irgendwo entpacken. Der normale Ort ist in
/usr/src
. Legen Sie die Datei dort ab und:tar -xJf linux-X.X.X.tar.xz
Beachten Sie, dass einzelne Distributionen normalerweise empfehlen, eines ihrer Quellpakete anstelle von Vanilla Tree zu verwenden. Dies enthält Distributions-spezifische Patches, die für Sie von Bedeutung sein können oder auch nicht. Es stimmt auch mit den Kernel-Include-Headern überein, die zum Kompilieren einiger Userspace-Tools verwendet werden, obwohl sie höchstwahrscheinlich ohnehin identisch sind.
In mehr als 15 Jahren des Erstellens benutzerdefinierter Kernel (hauptsächlich auf Fedora/Debian/Ubuntu) hatte ich nie ein Problem mit der Verwendung der Vanilla-Quelle. Dies macht jedoch keinen großen Unterschied, abgesehen von der Tatsache, dass, wenn Sie den absolut neuesten Kernel möchten, Ihre Distribution ihn wahrscheinlich noch nicht gepackt hat. Der sicherste Weg ist also immer noch, das Distributionspaket zu verwenden, das in
/usr/src
installiert werden sollte . Ich bevorzuge den neuesten Stall, damit ich als Versuchskaninchen fungieren kann, bevor er in die Distributionen eingeführt wird 🙂 -
Beginnen Sie mit einer Grundkonfiguration [optional].
Sie müssen dies nicht tun – Sie können einfach direkt loslegen und eine Konfiguration von Grund auf neu erstellen. Wenn Sie das jedoch noch nie zuvor getan haben, erwarten Sie viel von Versuch und Irrtum. Dies bedeutet auch, dass Sie die meisten Optionen durchlesen müssen (es gibt Hunderte). Verwenden Sie besser Ihre vorhandene Konfiguration, falls verfügbar. Wenn Sie ein Distributions-Quellpaket verwendet haben, enthält es wahrscheinlich bereits eine
[src]/.config
Datei, damit Sie diese verwenden können. Suchen Sie andernfalls nach/proc/config.gz
. Dies ist eine optionale Funktion, die im 2.6-Kernel hinzugefügt wurde. Wenn es existiert, kopieren Sie es in die oberste Ebene des Quellbaums undgunzip -c config.gz > .config
.
Wenn es nicht vorhanden ist, liegt es vielleicht daran, dass diese Option als Modul konfiguriert wurde. Probieren Sie sudo modprobe configs
aus , überprüfen Sie dann /proc
Verzeichnis für config.gz
wieder.
Die Distributionskonfiguration ist nicht sehr ideal in dem Sinne, dass sie fast jeden möglichen Hardwaretreiber enthält. Dies spielt für die Funktionalität des Kernels keine große Rolle, da es sich um Module handelt und die meisten von ihnen nie verwendet werden, aber es erhöht die zum Erstellen erforderliche Zeit erheblich. Es ist auch insofern umständlich, als es erfordert, dass ein initramfs bestimmte Kernmodule enthält (siehe Schritt 4 unten). Es ist jedoch wahrscheinlich ein besserer Ausgangspunkt als die Standardeinstellung.
Beachten Sie, dass sich die Konfigurationsoptionen von einer Kernelversion zur nächsten verschieben und ändern, und wenn Sie eines der make config
ausführen Programme unterhalb Ihrer .config
wird zuerst geparst und aktualisiert, um der neuen Version zu entsprechen. Wenn die Konfiguration von einer weitaus älteren Version stammt, kann dies zu seltsamen Ergebnissen führen, seien Sie also vorsichtig, wenn Sie die Konfiguration vornehmen. AFAIK wird es andersherum (mit einer Konfiguration aus einer neueren Version) überhaupt nicht funktionieren.
-
Erstellen Sie eine
.config
uration.[src]/.config
ist eine Textdatei, die zum Konfigurieren des Kernels verwendet wird. Bearbeiten Sie diese Datei nicht direkt . Das Ändern von Optionen ist oft nicht einfach eine Frage des Ersetzens einesY
mit einemN
, etc; meist gibt es eine Reihe von Abhängigkeiten und Verzweigungsmöglichkeiten. Stattdessen möchten Sie eines der Konfigurationsziele aus dem Kernel-Makefile verwenden (dh geben Siemake _____
ein auf der Befehlszeile aus dem Quellverzeichnis der obersten Ebene):-
make config
ist das einfachste, aber wahrscheinlich nicht nach dem Geschmack der meisten Leute. Es ist eine Abfolge von Fragen – viele von Fragen — und wenn Sie Ihre Meinung ändern, müssen Sie von vorne beginnen. -
make oldconfig
ist wiemake config
außer, wenn Sie bereits eine.config
haben aus einer früheren Version, überspringt Fragen mit Ausnahme derjenigen, die sich auf neue Optionen beziehen. Es kann immer noch viele davon geben und die meisten von ihnen werden für Sie irrelevant sein, also empfehle ich es noch einmal nicht. -
make menuconfig
ist meine (und ich glaube die der meisten anderen) bevorzugte Methode. Es erstellt und führt eine TUI-Schnittstelle aus (farbige Menüs, die auf einem Terminal funktionieren). Dazu benötigen Sie den-dev
Paket für ncurses installiert. Es ist ziemlich selbsterklärend, abgesehen von der Suche, die über/
erreichbar ist; die F1 „Hilfe“ liefert eine Erklärung für die aktuelle Option. Es gibt eine alternative Version,make nconfig
, mit ein paar zusätzlichen Funktionen, wobei F2 „syminfo“ das Äquivalent von menuconfigs F1 ist. -
make xconfig
ist eine vollständige GUI-Schnittstelle. Dies erfordertqmake
und der-dev
Paket für Qt installiert werden, da es sich wiederum um ein Programm handelt, das kompiliert und erstellt wird. Wenn Sie diese zuvor nicht verwendet haben, kann dies ein erheblicher Download sein. Der Grund, warum ichmenuconfig
bevorzuge zur GUI-Version besteht darin, dass Optionshierarchien in der ersteren unter Verwendung aufeinanderfolgender Bildschirme dargestellt werden, in der letzteren jedoch wie ein Akkordeon geöffnet werden.
Eines der ersten Dinge, die Sie tun sollten (aber nicht müssen), ist das Hinzufügen einer Zeichenfolge „Lokale Version“ (unter Allgemeine Einrichtung). ). Der Grund dafür wird in Punkt 5 unten erwähnt.
„Labyrinthisch“ ist eine gute Art, die Optionshierarchie zu beschreiben, und es würde den Rahmen eines Frage-und-Antwort-Spiels wie dieses sprengen, sich ins Detail zu begeben. Wenn Sie sich hinsetzen und alles durchgehen wollen, nehmen Sie sich Stunden Zeit . Greg Kroah-Hartman (langjähriger leitender Entwickler für den Linux-Kernel) hat ein kostenloses Online-Buch über den Kernel (siehe Referenzen unten), das ein Kapitel über die Konfiguration enthält, obwohl es 2006 geschrieben wurde. Mein Rat ist, mit einer vernünftigen Basis zu beginnen aus Ihrem aktuellen Distributions-Kernel (wie unter #2) und gehen Sie dann durch und deaktivieren Sie alle Dinge, von denen Sie wissen, dass Sie sie nicht benötigen. Wahrscheinlich möchten Sie auch einige der „Modul“-Optionen in „Integriert“ ändern, was uns zu meinem nächsten Punkt bringt…
-
-
Über
initramfs
[optional]Ein „initramfs“ ist ein komprimiertes Dateisystem, das in den Kernel eingebaut ist und/oder beim Booten geladen wird. Sein Hauptzweck besteht darin, Module einzuschließen, die der Kernel benötigt, bevor er auf die in
/lib/modules
zugreifen kann auf dem Root-Dateisystem – z. B. Treiber für das Gerät, das dieses Dateisystem enthält. Distributionen verwenden diese immer teilweise, da die Treiber nicht miteinander kompatibel sind und daher nicht alle in den Kernel eingebaut werden können. Stattdessen werden innerhalb desinitramfs
diejenigen ausgewählt, die für das aktuelle System geeignet sind .Das funktioniert gut und stellt keinerlei Nachteil dar, ist aber wahrscheinlich eine unnötige Komplikation beim Bau eines eigenen Kernels. Der Haken ist, wenn Sie kein initramfs verwenden, Sie sicherstellen müssen, dass die Treiber für Ihr Root-Dateisystem (und das Gerät, auf dem es sich befindet) in den Kernel eingebaut sind. In
menuconfig
, das ist der Unterschied zwischen einemM
(=module) Option und ein*
(=eingebaute) Option. Wenn Sie dies nicht richtig machen, schlägt das System früh im Startvorgang fehl. Wenn Sie also z. B. eine SATA-Festplatte und ein ext4-Root-Dateisystem haben, benötigen Sie Treiber für diese eingebauten. [Wenn jemandem etwas anderes einfällt, das ein Muss ist, hinterlassen Sie einen Kommentar und ich werde das hier einbauen].Wenn Sie ein
initramfs
verwenden möchten müssen Sie die entsprechenden Optionen in den Allgemeinen Einstellungen auswählen . Es gibt eine grundlegende Anleitung zum Erstellen eines in den Kernel eingebauten in[src]/Documentation/filesystems/ramfs-rootfs-initramfs.txt
, aber beachten Sie, dass die Distributionen dies nicht tun; Sie verwenden eine externe gzippte cpio-Datei. Dieses Dokument enthält jedoch eine Diskussion darüber, was ininitramfs
hineingehört (siehe „Inhalt von initramfs“). -
Bauen und installieren Sie den Kernel.
Der nächste Schritt ist einfach. Um den Kernel zu erstellen, führen Sie einfach
make
aus im[src]
Verzeichnis. Wenn Sie sich auf einem Multi-Core-System befinden, können Sie-j N
hinzufügen um die Dinge zu beschleunigen, wobeiN
ist die Anzahl der Kerne, die Sie zuweisen möchten + 1. Es gibt keinentest
odercheck
. Sobald das erledigt ist, können Siemake modules
. Auf einer schnellen Box sollte das alles <10 Minuten dauern.Wenn alles gut geht,
make INSTALL_MOD_STRIP=1 modules_install
. Dadurch wird ein Verzeichnis in/lib/modules
erstellt Übereinstimmung mit der Versionsnummer des Kernels plus der Zeichenfolge „Lokale Version“, die in Schritt 3 erwähnt wurde, falls vorhanden. Wenn Sie keine „Lokale Version“-Zeichenfolge verwendet haben, seien Sie vorsichtig, wenn Sie bereits einen Kernel derselben Version haben, auf die Sie angewiesen sind , da diese Module diese ersetzen werden.INSTALL_MOD_STRIP=1
ist optional, Bedeutung siehe hier.Sie können dann
make install
um den Kernel an einem Standardspeicherort zu installieren. Meine Empfehlung ist jedoch, es selbst zu tun, um sicherzustellen, dass keine vorhandenen Dateien überschrieben werden. Suchen Sie in[src]/arch/[ARCH]/boot
für eine Datei namensbzImage
, wobei[ARCH]
istx86
wenn Sie sich auf einem x86- oder x86-64-Computer befinden (und etwas anderes, wenn Sie sich auf etwas anderem befinden). Kopieren Sie das nach/boot
und benennen Sie es in etwas Spezifischeres und Informativeres um (egal was). Machen Sie dasselbe mit[src]/System.map
, aber nach folgendem Schema umbenennen:System.map-[VERSION]
Hier,
[VERSION]
ist genau dasselbe wie der Name des Verzeichnisses in/lib/modules
erstellt vonmake modules_install
, die die Zeichenfolge „Lokale Version“ enthält, z. B.System.map-3.13.3-mykernel
. -
Konfigurieren Sie den GRUB 2-Bootloader.
Wenn Sie
grub
nicht verwenden (die Mehrheit der Linux-Desktop-Benutzer sind), dies gilt offensichtlich nicht für Sie. Sie sollten einen/etc/grub.d/40_custom
haben Datei mit nicht viel drin. Wenn nicht, erstellen Sie es im Besitz von root undchmod 755
(muss ausführbar sein). Fügen Sie dazu hinzu:menuentry 'My new kernel, or whatever' { set root='hd0,1' linux /boot/[name-of-kernel] root=/dev/sda1 [other kernel options] }
Wenn Sie ein initramfs verwenden, sollten Sie auch eine letzte Zeile
initrd /path/to/initramfs
haben . Achten Sie auf dasset root=
Linie. Das Beispiel geht davon aus, dass grub auf der ersten Partition der ersten Festplatte (hd0,1) installiert wurde. Wenn Sie mehrere Laufwerke haben, sollten Sie stattdessen die Partitions-UUID verwenden und diese Zeile ersetzen durch:search --no-floppy --fs-uuid --set=root [the UUID of the partition]
Sofern sich grub nicht in Ihrem Root-Dateisystem befindet, sollte dies auch dem
root=
entsprechen Direktive auflinux
Zeile, die Ihr Root-Dateisystem angibt (dasjenige mit/sbin/init
und/lib/modules
). Die UUID-Version davon istroot=UUID=[the UUID]
.Sie können sich Ihre vorhandene
/boot/grub2/grub.cfg
ansehen für einen Hinweis auf den Gerätenamen. Hier ist eine kurze Anleitung dazu unter Grub 2. Wenn Sie zufrieden sind, führen Siegrub2-mkconfig -o /boot/grub2/grub.cfg
aus (aber sichern Sie Ihre aktuellegrub.cfg
Erste). Sie können diese Datei dann bearbeiten und Ihren Eintrag nach oben verschieben. Es sollte immer noch eine Auflistung für Ihren alten (laufenden) Kernel enthalten, und Ihre Distribution hat möglicherweise einen Mechanismus, der automatisch einen Eintrag für den neuen Kernel dupliziert (weil er in/boot
gefunden wurde; Fedora tut dies daher mit einem eindeutigen Titel mitmenuentry
ist eine gute Idee). Sie können das später entfernen, wenn alles gut geht.Sie können auch einfach den
menuentry
einfügen ingrub.cfg
direkt, aber einige Distributionen überschreiben dies, wenn ihr Kernel aktualisiert wird (während die Verwendung von/etc/grub.d/
wird es integriert behalten).Das ist es. Alles, was Sie jetzt tun müssen, ist ein Neustart. Wenn es nicht funktioniert, versuchen Sie, das Problem aus der Bildschirmausgabe abzuleiten, starten Sie neu, wählen Sie einen alten Kernel und gehen Sie zurück zu Schritt 3 (außer verwenden Sie die
.config
Sie haben es bereits und passen es an). Es kann eine gute Idee sein,make clean
(odermake mrproper
) zwischen den Versuchen aber stellen Sie sicher, dass Sie[src]/.config
kopieren zuerst auf ein Backup, da das gelöscht wird. Dadurch wird sichergestellt, dass die im Erstellungsprozess verwendeten Objekte nicht veraltet sind. -
In Bezug auf Kernel-Header et. al.
Eine Sache, die Sie wahrscheinlich tun sollten, ist Symlink (
ln -s -i
)/lib/modules/X.X.X/source
und/lib/modules/X.X.X/build
nach/usr/src
Verzeichnis, in dem sich der Quellbaum befindet (behalten Sie das). Dies ist notwendig, damit einige Userspace-Tools (und Treiberinstallationsprogramme von Drittanbietern) auf die Quelle für den laufenden Kernel zugreifen können.Ein diesbezügliches Problem sind
.h
Dateien in/usr/include
usw. Diese ändern sich sehr allmählich und sind abwärtskompatibel. Sie haben zwei Möglichkeiten:-
Belassen Sie die von Ihrer Distribution verwendeten. Wenn Sie das gesamte System regelmäßig aktualisieren, wird die Distribution sowieso regelmäßig neue installieren, also ist dies die Option mit dem geringsten Aufwand.
-
Verwenden Sie
make headers_install
.
Da sie abwärtskompatibel sind (was bedeutet, dass „ein Programm, das mit älteren Kernel-Headern gegen eine C-Bibliothek gebaut wurde, auf einem neueren Kernel laufen sollte“), müssen Sie sich darüber nicht allzu viele Gedanken machen. Das einzige mögliche Problem wäre, wenn Sie einen benutzerdefinierten Kernel erstellen und ihn für eine Weile behalten, währenddessen die Distribution das „kernel-headers“-Paket auf ein neueres aktualisiert Version, die zum Erstellen Ihres Kernels verwendet wird, und Es stellt sich heraus, dass es eine Inkompatibilität gibt (die nur für Software gilt, die nachträglich aus dem Quellcode kompiliert wurde).
-
Referenzen
Hier sind einige Ressourcen:
-
[src]/README
enthält eine kurze Anleitung zum Erstellen und Installieren. -
Die
[src]/Documentation
Verzeichnis enthält viele Informationen, die bei der Konfiguration hilfreich sein können. -
Ein Großteil von Greg K-Hs Buch „Linux Kernel in a Nutshell“ (dort kostenlos als eine Reihe von PDFs erhältlich) dreht sich um das Erstellen des Kernels.
-
Grub 2 hat ein Online-Handbuch.