Linux minimale con kernel e BusyBox: / etc / inittab viene ignorato, viene eseguito solo / init


12

Sono riuscito a creare un CD Linux live piccolo e perfettamente funzionante che contiene solo kernel (compilato con opzioni predefinite) e BusyBox (compilato con opzioni predefinite + statico, tutte le applet presenti, incluso /sbin/init). Non ho avuto problemi da creare initrde popolare /dev, /proce non /sysho avuto problemi con il mio /initscript shell.

Di recente ho letto che BusyBox supporta le /etc/inittabconfigurazioni (almeno a un certo livello) e mi piacerebbe molto fare una delle seguenti operazioni:

  • Dimentica il mio /initscript shell e fai affidamento interamente sulla /etc/inittabconfigurazione.
  • Usa sia /initlo script della shell che la /etc/inittabconfigurazione.

Ora il vero problema - sembra che /etc/inittabvenga completamente ignorato quando la mia distribuzione si avvia. I sintomi sono:

  • Quando rimuovo /inite lascio solo /etc/inittabfinisco con il panico del kernel. La mia ipotesi è che il kernel non viene eseguito /sbin/initaffatto o che /sbin/initnon trova (o legge) /etc/inittab.
  • Ho letto che BusyBox dovrebbe funzionare bene anche senza /etc/inittab. Così, ho rimosso sia /inite /etc/inittabe indovinate - Kernel Panic di nuovo.
  • Ho provato ad eseguire /sbin/initdalla mia shell e dopo diverse ipotesi che includevano exec /sbin/init, setsid /sbin/inite exec setsid /sbin/initho finito con il panico del kernel. Sia con che senza / etc / inittab presenti sul file system.

Ecco il contenuto del mio /initscript shell:

#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys
setsid cttyhack /bin/sh

A questo punto non mi interessa quale sia il contenuto di /etc/inittab, purché abbia un modo per sapere che la configurazione lì effettivamente funziona. Ho provato diverse /etc/inittabconfigurazioni, tutte basate sulle informazioni che ho trovato qui .

Come minimo mio / etc / inittab conteneva solo questa riga:

::sysinit:/bin/sh

Ancora una volta - ho finito con il panico del kernel e sembra che sia /etc/inittabstato ignorato.

Qualche suggerimento su come forzare la mia piccola distribuzione live a funzionare bene con BusyBox /etc/inittabè molto apprezzato!

Aggiornare:

  • Giusto per chiarire: non ho problemi di panico nel kernel con il mio attuale /initscript shell sia con che senza /etc/inittab. Funziona tutto bene, la mia /bin/ashconsole funziona benissimo e non ho problemi inaspettati. L'unico problema è che /etc/inittabviene completamente ignorato, come ho descritto sopra.
  • Ho esaminato 3 diverse distribuzioni Linux live: Slax, Finnix e SysResCD. Tutti loro hanno /inite nessuno ha /etc/inittab. Inoltre questo articolo di Wiki conclude il mio sospetto che /sbin/initnon è stato affatto invocato.

Se sei venuto qui, dai un'occhiata a Minimal Linux Live che sembra fare quello che vuole e funziona: github.com/ivandavidov/minimal
Ciro Santilli 21 病毒 审查 六四 事件 法轮功

Ah, l'OP ha scritto Minimal Linux Live! Amico rock.
Ciro Santilli 21 病毒 审查 六四 事件 法轮功

Risposte:


11

OK, ho fatto molte ricerche approfondite e ho scoperto cosa non andava. Iniziamo uno per uno:

  • Quando usiamo lo initramfsschema di avvio, il primo processo che il kernel invoca è lo /initscript. Il kernel non tenterà mai di eseguire /sbin/initdirettamente.
  • /init viene assegnato l'identificatore del processo 1. Questo è molto importante!
  • Il problema ora è che /sbin/initpuò essere avviato solo come PID 1ma stiamo già eseguendo /initcome PID 1.
  • La soluzione è eseguire la riga di comando exec /sbin/initmentre siamo ancora dentro /init. In questo modo il nuovo processo (che è /sbin/init) erediterà il PID dal suo genitore ( /initcon PID 1) e questo è tutto ciò che dobbiamo fare.

Il problema che ho riscontrato con la mia configurazione iniziale (vedi la domanda) era dovuto al fatto che l'ultima cosa che il mio /initscript fa è generare un nuovo /bin/shprocesso a cui è assegnato un PID nuovo di zecca. Da questo punto è impossibile eseguire /sbin/initdirettamente dalla console interattiva perché anche quando eseguiamo la riga di comando exec /sbin/init, il migliore che otteniamo è assegnare lo stesso PID che è già stato assegnato alla shell e questo PID non è sicuramente PID 1.

Per farla breve: esegui la riga di comando exec /sbin/initdirettamente da /inite questo è tutto.

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.