Ändern Sie die Kernel-Parameter zur Laufzeit

10

Beim Versuch, einen obskuren Hardwarefehler zu beheben, wurde vorgeschlagen, das Problem durch Hinzufügen einiger Parameter zum Kernel zu beheben.

Das kann ich natürlich, aber ich habe mich gefragt, ob ich diese Änderungen an einem laufenden Kernel vornehmen kann. Insbesondere weiß ich das procfsund sysfsbiete eine Möglichkeit, Änderungen am laufenden Kernel vorzunehmen, bin mir jedoch nicht sicher, wie Kernel-Parameternamen Dateipfaden zugeordnet werden sollen. (Ich gehe auch davon aus, dass nicht alle Einstellungen zur Laufzeit geändert werden können und diese bestimmten Parameter möglicherweise nach dem Start des Systems nicht mehr konfigurierbar sind.)

Die spezifischen Parameter, an denen ich interessiert bin, sind

i8042.nomux=1 i8042.reset

Ich bin mir besonders unsicher, ob es möglich ist, den Rücksetzbefehl auf einem laufenden System auszugeben.

Wenn diese Parameter sind zur Laufzeit modifizierbar, wo ich sie finden?

MathematicalOrchid
quelle

Antworten:

16

Es gibt drei Arten von Dingen, die als Kernel-Parameter bezeichnet werden können.

Core - Kernel - Parameter sind Optionen auf der Kernel - Kommandozeile übergeben. Sie können nur beim Booten übergeben werden. Sie sind dokumentiert in kernel-parameters.txt(diese Datei listet auch Modulparameter auf; Kernkernparameter sind diejenigen ohne a .). Einige dieser Parameter spielen nur beim Booten eine Rolle (z root. B. ). Für diejenigen, die während der gesamten Lebensdauer des Systems verwendet werden, gibt es möglicherweise einen Mechanismus, um sie zur Laufzeit zu ändern. Es gibt keine allgemeine Regel.

Modulparameter sind wie Kernelparameter, geben jedoch eine bestimmte Komponente des Kernels an, normalerweise einen bestimmten Treiber. Trotz des Namens gelten diese Parameter unabhängig davon, ob der entsprechende Treiber direkt im Kernel oder als Modul kompiliert wird. Wenn die Komponente im Haupt-Kernel-Image enthalten ist, müssen Sie COMPONENT_NAME.PARAMETER_NAME=VALUEdie Kernel-Befehlszeile übergeben. Wenn die Komponente als Modul geladen wird, müssen Sie passieren PARAMETER_NAME=VALUEzu insmod.

Einige Modulparameter sind über sysfs sichtbar . Das Verzeichnis /sys/module/MODULE_NAME/parametersenthält eine Datei pro Parameter. Wenn Sie diese Datei lesen, erhalten Sie den aktuellen Wert des Parameters. Durch Schreiben in diese Datei wird der Parameter festgelegt, sofern er geändert werden kann. Die meisten Parameter können nicht geändert werden (daher ist die Datei schreibgeschützt). Das Verzeichnis /sys/module/kernel/parameterslistet einige der Kernel-Kernparameter auf.

Modulparameter werden willkürlich dokumentiert; Einige von ihnen sind in aufgeführt kernel-parameters.txt, und die Datei enthält Referenzen für einige Module. Wenn Sie die Dokumentation nicht finden können, suchen Sie die Quelle . Modulparameter werden durch das erklärt module_paramMakro oder einer seiner Begleiter module_param_named, module_param_cbusw. Der letzte Parameter dieser Makros bestimmt die Dateiberechtigungen (zB 0600oder S_IRUSR | S_IWUSRwürde rw-------also lesbar und beschreibbar root und unzugänglich von jemand anderem). Wenn die Berechtigung 0 ist, wird der Eintrag in sysfs überhaupt nicht angezeigt.

i8042.nomuxund i8042.resetsind Parameter des i8042Treibers . Beim Quellcode haben beide die Berechtigung 0, sodass diese beiden Parameter zur Laufzeit nicht geändert oder sogar abgefragt werden können. Sie können die Parameter nur einstellen, wenn der Treiber gestartet wird. Wenn der Treiber als Modul kompiliert ist, können Sie beim Entladen und erneuten Laden des Moduls beim erneuten Laden verschiedene Parameter angeben. Wenn sich der Treiber direkt im Kernel befindet oder die Konfiguration Ihres Systems das Entladen des Moduls effektiv unmöglich macht, müssen Sie einen Neustart durchführen.

Schließlich ist eine andere Art von Parametern im Kernel sysctl . Diese Einstellungen können mit dem sysctlBefehl oder über angezeigt und geändert werden /proc/sys. Ich denke, die Trennung zwischen sysctl- und Kernel-Parametern ist größtenteils historisch; Hardware-bezogene Einstellungen sind traditionell Kernel-Parameter, während Software-bezogene Einstellungen traditionell sysctl sind, aber die Unterscheidung kann manchmal unscharf sein.

Gilles 'SO - hör auf böse zu sein'
quelle
Ich habe einen Blick darauf geworfen /sys/module/i8042/parameters, aber die einzige vorhandene Datei ist debug.
MathematicalOrchid
2
@MathematicalOrchid Oh, richtig. Ich habe meine Antwort korrigiert. Ich habe keine Ahnung, warum ich glaubte, dass 0 schreibgeschützt bedeutet. 0 bedeutet eigentlich keinen Eintrag, was Sie beobachten. Die zutreffende Schlussfolgerung ist dieselbe, der Parameter kann nur eingestellt werden, wenn der Treiber geladen ist.
Gilles 'SO - hör auf böse zu sein'
2

Ich denke, die Liste der Parameter, die zur Laufzeit geändert werden können, kann mit dem Befehl "sudo sysctl -a" gefunden werden. Ich habe i8042.nomux in meinem System nicht gesehen. Nicht sicher warum. Möglicherweise können Sie es in Ihrem überprüfen. Wenn Sie den Parameter sehen, können Sie ihn zur Laufzeit ändern.

Chandrasekar
quelle
Ich sehe es auch nicht in der Liste - was wahrscheinlich nur bedeutet, dass es nicht dynamisch geändert werden kann. (Wer muss PS / 2 wirklich neu konfigurieren, sobald das System bereits gestartet ist?) Aber das beantwortet meine Frage, also danke!
MathematicalOrchid
Es ist komplizierter: Es gibt verschiedene Arten von Parametern. Die sysctl-Einstellungen sind eigentlich keine "Kernel-Parameter" im Linux-Sinne (obwohl sie Parameter des Kernels sind. Bei dieser Frage geht es um Treiberparameter, bei denen es sich um Kernel-Parameter handelt (insbesondere um Modulparameter). Einzelheiten finden Sie in meiner Antwort.
Gilles ' Also hör auf böse zu sein '