Werden alle Kernel-Argumente wirklich vom Kernel verwendet?

11

Warum erlaubt Linux 'init = / bin / bash'?

Ich habe das gelesen, Antworten sagen, dass es KERNEL ist, der dieses Init-Programm ausführt.

Dann begann ich mich zu fragen, ob Linux normalerweise mit einem initramfs geliefert wird, das schließlich in ein echtes Root-Dateisystem eingebunden und pivot_root wird. Was bedeutet dieses initArgument? Der Pfad in den initramfs? Oder wie ich vermutet habe, wird es nicht vom Kernel gelesen, sondern von init von initramfs, um das echte init auszuführen.

Auch das root=UUID=xxxxArgument, wird das wirklich vom Kernel oder nur von init von initramfs gelesen, um das echte Root-Dateisystem zu finden?

Es scheint, als könnte ich jedes gewünschte Argument als Kernel-Argumente übergeben. Werden sie also alle vom Kernel gelesen oder sind zumindest einige von ihnen nur für Userspace-Programme von Bedeutung?

炸鱼 薯条 德里克
quelle

Antworten:

18

Über die Kernel-Befehlszeile übergebene Parameter müssen für den Kernel nicht aussagekräftig sein: In der Dokumentation zu den Kernel-Parametern heißt es

Der Kernel analysiert Parameter von der Kernel-Befehlszeile bis zu "-". Wenn ein Parameter nicht erkannt wird und kein '.' enthält, wird der Parameter an init übergeben: Parameter mit '=' gehen in die Umgebung von init, andere werden als Befehlszeilenargumente an init übergeben. Alles nach "-" wird als Argument an init übergeben.

Dies gilt nicht für initund rootwas wirklich Kernel - Parameter sind, und werden vom Kernel abgewickelt. Sie können auch vom User-Space bearbeitet werden, da sie in erscheinen /proc/cmdline. (So quietberücksichtigt beispielsweise systemd den Kernel-Parameter, um seine Ausgabe zu reduzieren.)

Wenn der Kernel mit einem initramfs gebootet wird, das rootwird der Parameter nicht verwendet , direkt vom Kernel und der initParameter wird nur verwendet, wenn rdinitnicht. initDer Start wird in behandelt kernel_init, was wie folgt funktioniert:

  • Wenn ein "Ramdisk Execute-Befehl" (entweder der in rdinitder Kernel-Befehlszeile angegebene Wert oder /init) verfügbar ist, versucht der Kernel, diesen auszuführen.
  • Wenn dies fehlschlägt und ein "Ausführungsbefehl" (der Wert, der in initder Kernel-Befehlszeile angegeben wird) angezeigt wird, versucht der Kernel, dies auszuführen, und gerät in Panik, wenn dies nicht möglich ist.
  • als letztes Mittel , versucht der Kernel zu laufen /sbin/init, /etc/init, /bin/init, und /bin/sh; Wenn keines davon ausgeführt werden kann, gerät es in Panik .

Wenn es ein initramfs gibt, geschieht dies alles dort und das Zieldatenträger wird nicht vom Kernel gemountet. Was passiert, nachdem der Kernel das erste initProgramm ausgeführt hat (normalerweise das /initSkript in den initramfs), hängt vom Programm ab, nicht vom Kernel. Argumente, an die nicht übergeben wird, initsind weiterhin verfügbar, /proc/cmdlinewenn das /procDateisystem bereitgestellt ist.

Stephen Kitt
quelle
Auch ein bisschen neugierig, was ist, wenn init-in-the-initramfs eine set-uid-non-root-Datei ist? Eine Datei ohne ausführbares Bit? Wird es trotzdem als root ausgeführt? Was ist, wenn ELF defekt ist oder ld-linux.soELF oder ein rekursionssicheres Skript nicht gefunden werden kann oder etwas einfach nicht ausgeführt werden kann?
4 薯条 德里克
3
Ich bin mir ziemlich sicher, dass der Kernel das in "init =" angegebene Programm nicht aus dem initramfs lädt. Wenn ein Initramfs verwendet wird, scheint es normal zu laufen, bevor das benutzerdefinierte Init-Programm ausgeführt wird (nicht sicher, ob es der Kernel ist, der dies tut, oder Code in den Initramfs).
Plugwash
@ 炸鱼 薯条 德里克 Um ein alternatives Programm anzugeben, anstatt /initbeim Booten von einer Ramdisk, können Sie den rdinit=/path/toBoot-Parameter verwenden.
pizdelect
3

Das Übergeben von benutzerdefinierten Kernelargumenten ist eine Möglichkeit, ein System während einer KickStart-Installation anzupassen. Beispielsweise könnte ein PXE-Server Folgendes festlegen:

linuxefi /c7/vmlinuz ks=http://.../ks/c7 lab ksdevice=eth0 net.ifnames=0 biosdevname=0

Wo labwird dann in der KickStart-Konfiguration verwendet, um andere Dinge als für andere Systembuilds zu tun:

%pre
...
case " $(cat /proc/cmdline)" in
   ...
   *\ lab*)
      filesystems_lab
      ;;
   *)
      filesystems_common
      ;;
...

Hier können Sie ein anderes Dateisystemlayout einrichten als bei anderen Systemtypen. Hoffentlich werden für lokale Anpassungen andere Bezeichnungen verwendet als vom Kernel, wenn man den einzelnen Namespace berücksichtigt.

Thrig
quelle