passare da una versione diversa del kernel senza riavvio


11

Voglio passare da una versione diversa del kernel installata sul mio sistema senza riavviare.

Vale a dire se ho il 3.0.0-16-generickernel attualmente in esecuzione e ho un kernel più vecchio 3.0.0-14-genericanche lì, quindi potrei essere in grado di passare a 3.0.0-14-generic(l'altro kernel) senza riavviare.

(Devo eseguire il debug del kernel live e apportare modifiche, quindi per farlo non posso riavviare)

Risposte:


8

Non c'è modo di scambiare due kernel completi. Sono sicuro che puoi capire il significato di un kernel monolitico come Linux e perché ciò rende impossibile semplicemente sostituirlo.

Il più vicino che puoi ottenere è un processo di patch live con Ksplice . Converte gli aggiornamenti del kernel in spessori magici che possono tappare buchi in un kernel in esecuzione, permettendoti di mantenere il computer a tempo indeterminato senza bisogno di riavviare. Per i tuoi scopi, ti consente anche di ripristinare le modifiche.

È gratuito per le edizioni Ubuntu Desktop in modo da poter giocare con esso ma devi pagare un abbonamento per i server (dove questo genere di cose è più necessario).


Ho appena visto la tua modifica. Ksplice probabilmente non ti aiuterà se stai hackerando manualmente e costruendo i tuoi kernel per il debug poiché "il servizio" è che forniscono gli aggiornamenti speciali e non sono qualcosa che puoi generare da solo.

Se stai solo costruendo cose contro un kernel ufficiale, potrebbe ancora funzionare.


Un'altra idea: virtualizzazione. Potresti creare il tuo nuovo kernel e scambiare cose nella tua VM e riavviare. Ci vorrà ancora del tempo necessario per riavviare, ma potresti rendere la VM molto più leggera della tua macchina di sviluppo (basala su Ubuntu Server, elimina il server X se non ti serve, ecc.).


1
ma voglio passare tra due kernel diversi nella mia directory / boot
coder

1
Sì, non sarai in grado di passare arbitrariamente tra due kernel. Ho aggiunto un'altra modifica con un'altra idea che potrebbe funzionare per te.
Oli

2

Come menzionato da Oli , il tuo colpo migliore è probabilmente la virtualizzazione.

Detto questo, se stai armeggiando con l'hardware, la virtualizzazione potrebbe non tagliarla per te, nel qual caso, potresti usare kexecper scambiare il kernel in esecuzione senza un riavvio completo.

Tratto dalla pagina ArchWikikexec :

kexec -l /boot/new-kernel --initrd=/boot/new-initrd --reuse-cmdline
kexec -e

Nota che quanto sopra riavvierà comunque tutti i servizi , incluso il tuo sistema init, il display server, la rete, ecc. Tuttavia, se usi un sistema init abbastanza veloce, come systemd, puoi avviare il tuo nuovo kernel in 2-3 secondi, poiché stai bypassando il BIOS / UEFI e il bootloader.


Una descrizione simile è disponibile nella pagina Wiki di RapidReboot Ubuntu .


0

Penso che queste risposte debbano essere aggiornate.

C'è kpatch ora , che è più nativo di Ksplice et al.

Tuttavia, per ovvi motivi, non può cambiare le strutture di dati nel kernel, quindi è utile soprattutto per gli hotpatch di sicurezza.

Il problema generale è sempre: i processi in esecuzione mantengono ancora le strutture dei dati del kernel, aspettandosi che le funzioni del kernel le aspettino e le restituiscano. E senza quei processi fatti per questo, non è davvero possibile sapere, se è così. Quindi non è possibile modificarli, fino a quando tutti i processi che li utilizzano non vengono riavviati. Richiederebbe l'applicazione di patch live a tutti quei programmi.
E non ho nemmeno menzionato le modifiche del driver, quando l'hardware è in uno stato speciale. (Stesso problema con kexec .)

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.