Tutti gli argomenti del kernel sono davvero usati dal kernel?


11

Perché Linux consente 'init = / bin / bash'?

Ho letto questo, le risposte dicono che è KERNEL che esegue questo programma init.

Poi ho iniziato a chiedermi, Linux di solito viene fornito con un initramfs, che alla fine monterà e pivot_root sul vero filesystem root. Cosa significa questo initargomento? Il percorso negli initramfs? O come immaginavo, non viene letto dal kernel ma da init di initramfs per eseguire il vero init.

Inoltre, l' root=UUID=xxxxargomento è davvero letto dal kernel o semplicemente da init di initramfs per trovare il vero filesystem di root?

Sembra che posso passare qualsiasi argomento che voglio come argomenti del kernel, quindi sono tutti letti dal kernel o almeno alcuni di essi sono significativi solo per i programmi di spazio utente?

Risposte:


18

I parametri passati sulla riga di comando del kernel non devono essere significativi per il kernel: la documentazione dei parametri del kernel dice

Il kernel analizza i parametri dalla riga di comando del kernel fino a “-”; se non riconosce un parametro e non contiene un '.', il parametro viene passato a init: i parametri con '=' vanno nell'ambiente di init, altri vengono passati come argomenti della riga di comando a init. Tutto dopo "-" viene passato come argomento a init.

Questo non si applica a inite rootche in realtà sono i parametri del kernel, e sono curati dal kernel. Possono anche essere influenzati dallo spazio utente, poiché appaiono in /proc/cmdline. (Quindi ad esempio systemd prende quietin considerazione il parametro kernel per ridurne l'output.)

Quando il kernel viene avviato con un initramfs, il rootparametro non viene utilizzato direttamente dal kernel e il initparametro viene utilizzato solo se rdinitfallisce. initl'avvio viene gestito kernel_init, che funziona come segue:

  • se c'è un "comando di esecuzione ramdisk" (o il valore dato rdinitsulla riga di comando del kernel, o /init) che è accessibile, il kernel tenta di eseguirlo;
  • se fallisce, e c'è un "comando di esecuzione" (il valore dato initsulla riga di comando del kernel), il kernel tenta di eseguirlo, e se non ci riesce va in panico;
  • come ultima risorsa, il kernel cerca di correre /sbin/init, /etc/init, /bin/init, e /bin/sh; se nessuno di questi può essere eseguito, è nel panico .

Quando c'è un initramfs, tutto ciò accade lì, e il volume di destinazione non è montato dal kernel. Ciò che accade dopo che il kernel ha eseguito il primo initprogramma (in genere, lo /initscript in initramfs) dipende dal programma, non dal kernel. Gli argomenti a cui non si passa initsono ancora disponibili /proc/cmdlinese /procè installato il file system.


Anche un po 'curioso, cosa succede se init-in-the-initramfs è un file set-uid-non-root? Un file senza bit eseguibile? Sarà comunque eseguito come root? Che cosa succede se ELF non funziona o non riesce a trovare ld-linux.soELF o script di ricorsione troppo approfonditi o qualcosa che non può essere eseguito?
炸鱼 薯条 德里克

3
Sono abbastanza sicuro che il kernel non carica il programma specificato in "init =" da initramfs. È in uso un initramfs, quindi sembra funzionare normalmente prima dell'esecuzione del programma init specificato dall'utente (non sono sicuro che sia il kernel che lo fa o il codice in initramfs).
lavaggio:

@ 炸鱼 薯条 德里克 Per specificare un programma alternativo anziché /initdurante l'avvio da un ramdisk, è possibile utilizzare il rdinit=/path/toparametro boot.
seleziona il

3

Passare argomenti del kernel personalizzati è un modo per personalizzare un sistema durante un'installazione di KickStart, ad esempio un server PXE potrebbe impostare:

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

dove labviene quindi utilizzato nella configurazione di KickStart per fare cose diverse rispetto ad altre build di sistema:

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

Qui per impostare un layout di file system diverso da quello utilizzato su altri tipi di sistema. Si spera che per le personalizzazioni locali vengano utilizzate etichette diverse da quelle utilizzate dal kernel, dato il singolo spazio dei nomi in questione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.