Debugging del processo di avvio di Alpine

Come discusso nel mio post precedenteAlpine Linux passa attraverso diverse fasi quando si avvia.

Subito dopo aver montato il supporto di avvio, e aver fatto la scansione per gli apkovl (con nlplug-findfs), c'è un'opzione per ottenere una console, impostando $SINGLEMODE su yes.

Impostare SINGLEMODE su yes è facile, si aggiunge semplicemente la parola "singolo" al file cmdline.txt (se su Raspberry Pi) / i vostri parametri del kernel (se non su Raspberry Pi):

modules=loop,squashfs,sd-mod,usb-storage singolo noquiet dwc_otg.lpm_enable=0 console=tty1

Notate che ho anche anteposto la parola quiet a no per disabilitarlo efficacemente - avrete più output durante l'avvio. (NB: questo è in realtà il modo in cui deve essere fatto, come definito nello script di init)

Una volta avviato, questo vi farà entrare in una sessione di shell (con ash, la shell integrata di busybox).

Nota: se avete impostato il parametro kernel root, per specificare un filesystem root da cui avviare, la vostra console è montata prima di la partizione di root è montata - probabilmente per poter eseguire meglio il debug.

Questa modalità singola è molto utile per provare le configurazioni d'avvio e risolvere i problemi d'avvio, e sperimentare con il sistema e le sue capacità (che vengono interamente dall'initramfs e dal kernel).

impossibile accedere all'errore tty

Il seguente errore viene lanciato quando la modalità singola è abilitata:

sh: non può accedere alla tty: controllo del lavoro disattivato

Sembra essere legato alle capacità di sh, e a come viene eseguito - non c'è bisogno di allarmarsi.

La tastiera USB non funziona

All'inizio, la tastiera USB non ha funzionato per me; non sono sicuro di quale sia la ragione di questo. Dopo diversi cicli di accensione ha iniziato a funzionare. Forse non può essere attivata tramite KVM.

In ogni caso, continuate a provare, dovrebbe funzionare. Provate a digitare immediatamente quando arriva l'avviso sh ...

Sul Pi 3B+ la tastiera non funziona; funziona solo su un Pi 3A+. Sospetto che questo sia dovuto all'hub USB interno aggiuntivo sul Pi 3B+ - per favore provate a usare un Pi 3A+ per fare il debug in modalità singola. (Lo so, non è l'ideale per le configurazioni di rete).

C'è un modo più breve per attivare la modalità singola? Sono pigro

Queste sono le vostre opzioni:

s|singolo|1

Quindi dovresti essere in grado di entrare in modalità singola aggiungendo una "s" o un "1" al cmdline.txt. Non testato da me.

 

Come posso uscire dal singlemode?

Tipo

uscire

 

Cosa succede dopo il controllo della modalità singola?

La nostra risposta si riferisce solo alla modalità di avvio RAM ("diskless") di Alpine Linux.

Le seguenti operazioni sono fatte solo dopo il controllo della modalità singola, quindi dovrete eseguirle manualmente se volete:

  • un tmpfs è montato su /sysroot ($sysroot)
  • la posizione di apkovl è impostata - per impostazione predefinita, se non hai specificato il parametro apkovl kernel, nlplug-findfs cercherà di localizzarlo per te sul tuo supporto di avvio
    • c'è, come discusso in precedenza, anche la possibilità di ottenerlo via http, ecc.
  • viene analizzato il parametro pkgs del kernel - si possono specificare qui pacchetti aggiuntivi che il sistema dovrebbe installare
    • questo parametro è utile in colloborazione con alpine_repo - permettendoti di iniettare pacchetti aggiuntivi in Alpine
  • l'apkovl è scompattato
  • se il file /sysroot/etc/.default_boot_services esiste o la posizione apkovl non è un file, allora i servizi di avvio predefiniti saranno impostati e il file sarà rimosso (quindi non sarà persistito nell'apkovl quando si fa il commit di lbu)

if [ -f "$sysroot/etc/.default_boot_services" -o ! -f "$ovl" ]; then
# aggiunge alcuni servizi di avvio per impostazione predefinita
rc_add devfs sysinit
rc_add dmesg sysinit
rc_add mdev sysinit
rc_add hwdrivers sysinit
rc_add modloop sysinit

rc_add hwclock boot
rc_add moduli di avvio
rc_add sysctl boot
rc_add hostname boot
rc_add bootmisc boot
rc_add syslog boot

rc_add mount-ro shutdown
rc_add killprocs shutdown
rc_add savecache shutdown

rc_add firstboot default

rm -f "$sysroot/etc/.default_boot_services"
fi

  • viene eseguito il codice per l'esecuzione di uno splash screen
  • viene controllato se /sysroot/etc/fstab esiste, e condizionatamente a ciò viene eseguito relocate_mount
  • alpine-base è sempre incluso nei pacchetti che stanno per essere installati
  • l'apk è preparato
    • opzionalmente la rete è configurata in modo che apk possa tirare i pacchetti attraverso la rete
    • gli viene anche detto che i pacchetti vengono installati in modalità -initramfs-diskless-boot, e gli viene detto di visualizzare -progress
    • se quiet è impostato, allora viene detto ad apk di rimanere -quiet
  • i pacchetti sono installati nel filesystem di root
  • se viene data l'opzione ssh_key del kernel, openssh viene aggiunto ai pacchetti e come servizio
    • si prega di notare che è ancora necessario passare la chiave - questo avverrà o attraverso un file nel vostro apkovl o qualche altro metodo
    • come tale, l'opzione ssh_key potrebbe essere una sorta di ripiego se avete disattivato ssh e lo volete di nuovo.
  • alla fine il root è passato al nuovo sistema che è costruito dai pacchetti e dall'apkovl

 

Nota, per chiunque si stia chiedendo cosa dovrebbe fare il parametro keep_apk_new del kernel:

if [ "$KOPT_keep_apk_new" != yes ]; then
apkflags="$apkflags -clean-protected"
[ -n "$ovlfiles" ] && apkflags="$apkflags -overlay-from-stdin"
fi

Fate riferimento al file init nella initramfs per ulteriori dettagli.

 

Riferimenti:

 

Siamo in affitto

Se stai cercando di risolvere il tuo problema Alpine Linux, e vuoi una consulenza siamo in affitto.