Tous les arguments du noyau sont-ils vraiment utilisés par le noyau?

11

Pourquoi Linux autorise-t-il 'init = / bin / bash'?

J'ai lu ceci, les réponses disent que c'est KERNEL qui exécute ce programme d'initialisation.

Puis j'ai commencé à me demander, Linux est généralement livré avec un initramfs, qui finira par monter et pivot_root sur le véritable système de fichiers racine. Que signifie donc cet initargument? Le chemin dans les initramfs? Ou comme je l'ai deviné, ce n'est pas lu par le noyau mais par init d'initramfs pour exécuter le vrai init.

De plus, l' root=UUID=xxxxargument est-il vraiment lu par le noyau ou simplement par init d'initramfs pour trouver le vrai système de fichiers racine?

Il semble que je puisse passer n'importe quel argument que je veux en tant qu'arguments du noyau, donc sont-ils tous lus par le noyau ou au moins certains d'entre eux n'ont de sens que pour les programmes de l'espace utilisateur?

炸鱼 薯条 德里克
la source

Réponses:

18

Les paramètres transmis sur la ligne de commande du noyau n'ont pas à être significatifs pour le noyau: la documentation des paramètres du noyau indique

Le noyau analyse les paramètres de la ligne de commande du noyau jusqu'à «-»; s'il ne reconnaît pas un paramètre et ne contient pas de '.', le paramètre est passé à init: les paramètres avec '=' vont dans l'environnement d'init, les autres sont passés comme arguments de ligne de commande à init. Tout après «-» est passé comme argument à init.

Cela ne s'applique pas à initet rootqui sont vraiment des paramètres du noyau, et sont gérés par le noyau. Ils peuvent également être traités par l'espace utilisateur, car ils apparaissent dans /proc/cmdline. (Ainsi, par exemple, systemd prend quieten compte le paramètre du noyau pour réduire sa sortie.)

Lorsque le noyau est démarré avec un initramfs, le rootparamètre n'est pas utilisé directement par le noyau et le initparamètre n'est utilisé qu'en cas d' rdinitéchec. initle démarrage est géré dans kernel_init, qui fonctionne comme suit:

  • s'il y a une "commande d'exécution ramdisk" (soit la valeur donnée à rdinitsur la ligne de commande du noyau, ou /init) qui est accessible, le noyau tente de l'exécuter;
  • si cela échoue, et qu'il y a une «commande d'exécution» (la valeur donnée à initsur la ligne de commande du noyau), le noyau tente de l'exécuter et panique s'il ne le peut pas;
  • en dernier ressort, le noyau tente d'exécuter /sbin/init, /etc/init, /bin/initet /bin/sh; si aucun de ceux-ci ne peut être exécuté, cela panique .

Quand il y a un initramfs, tout cela se passe là-bas, et le volume cible n'est pas monté par le noyau. Ce qui se passe après que le noyau exécute le premier initprogramme (généralement, le /initscript dans les initramfs) dépend du programme, pas du noyau. Les arguments qui ne sont pas passés à initsont toujours disponibles dans /proc/cmdlinesi le /procsystème de fichiers est monté.

Stephen Kitt
la source
Aussi un peu curieux, que se passe-t-il si init-in-the-initramfs est un fichier set-uid-non-root? Un fichier sans bit exécutable? Sera-t-il exécuté en tant que root de toute façon? Que se passe-t-il si ELF est cassé ou ne peut pas trouver ld-linux.soELF ou un script trop récursif ou quoi que ce soit ne peut tout simplement pas être exécuté?
炸鱼 薯条 德里克
3
Je suis sûr que le noyau ne charge pas le programme spécifié dans "init =" à partir des initramfs. Si un initramfs est utilisé, il semble fonctionner normalement avant que le programme init spécifié par l'utilisateur ne soit exécuté (je ne sais pas si c'est le noyau qui fait cela ou le code dans les initramfs).
plugwash
@ 炸鱼 薯条 德里克 Pour spécifier un autre programme au lieu de /initdémarrer à partir d'un disque virtuel, vous pouvez utiliser le rdinit=/path/toparamètre de démarrage.
pizdelect
3

Passer des arguments de noyau personnalisés est une façon de personnaliser un système lors d'une installation de KickStart, par exemple un serveur PXE pourrait définir:

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

labest ensuite utilisé dans la configuration KickStart pour faire des choses différentes de celles des autres versions du système:

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

Ici pour configurer une disposition de système de fichiers différente de celle utilisée sur d'autres types de système. Espérons que des étiquettes différentes soient utilisées pour les personnalisations locales par rapport à celles utilisées par le noyau, étant donné l'espace de noms unique impliqué.

branler
la source