cambiar entre diferentes versiones del kernel sin reiniciar

11

Quiero cambiar entre diferentes versiones de kernel instaladas en mi sistema sin reiniciar.

Es decir, si tengo ' 3.0.0-16-generickernel actualmente ejecutándose y tengo kernel más antiguo 3.0.0-14-generictambién allí, entonces tal vez pueda cambiar a 3.0.0-14-generic(el otro kernel) sin reiniciar.

(Necesito hacer una depuración en vivo del kernel y hacer cambios, así que para hacerlo no puedo reiniciar)

descifrador
fuente

Respuestas:

8

No hay forma de intercambiar dos núcleos completos. Estoy seguro de que puede comprender la importancia de un núcleo monolítico como Linux y por qué eso hace que sea imposible reemplazarlo.

Lo más cercano que puede obtener es un proceso de parcheo en vivo usando Ksplice . Convierte las actualizaciones de Kernel en cuñas mágicas que pueden tapar agujeros en un Kernel en ejecución, lo que le permite mantener la computadora encendida indefinidamente sin necesidad de reiniciar. Para sus propósitos, también le permite revertir los cambios.

Es gratuito para las ediciones de Ubuntu Desktop, por lo que puede jugar con él, pero debe pagar una suscripción para los servidores (donde este tipo de cosas es más necesario).


Acabo de ver tu edición. Ksplice probablemente no va a ayudar si está pirateando y creando manualmente sus propios Kernels para la depuración, ya que "el servicio" es que proporcionan actualizaciones especiales y no son algo que pueda generar por su cuenta.

Si solo está compilando cosas contra un núcleo oficial, aún podría funcionar.


Una idea más: virtualización. Puede construir su nuevo kernel e intercambiar cosas en su VM y reiniciar. Todavía le tomará el tiempo necesario para reiniciarse, pero podría hacer que la VM sea mucho más liviana que su máquina de desarrollo (base en Ubuntu Server, descarte el servidor X si no lo necesita, etc.).

Oli
fuente
1
pero quiero cambiar entre dos núcleos diferentes en mi directorio / boot
codificador
1
Sí, no podrás cambiar arbitrariamente entre dos núcleos. Sin embargo, he agregado otra edición con otra idea que podría funcionar para usted.
Oli
2

Como mencionó Oli , su mejor opción es probablemente la virtualización.

Dicho esto, si está jugando con el hardware, la virtualización podría no ser suficiente para usted, en cuyo caso, podría usar kexecpara intercambiar el kernel en ejecución sin un reinicio completo.

Tomado de la página ArchWikikexec :

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

Tenga en cuenta que lo anterior aún reiniciará todos los servicios , incluidos su sistema de inicio, el servidor de visualización, las redes, etc. Sin embargo, si utiliza un sistema de inicio lo suficientemente rápido systemd, puede arrancar en su nuevo núcleo en 2-3 segundos, ya que estás pasando por alto el BIOS / UEFI y el gestor de arranque.


Se puede encontrar una descripción similar en la página RapidReboot Ubuntu Wiki .

Atila O.
fuente
0

Creo que estas respuestas deben actualizarse.

Hay kpatch ahora , que es más de lo nativo ksplice et al.

Sin embargo, no puede cambiar las estructuras de datos en el núcleo, por razones obvias, por lo que es principalmente útil para parches de seguridad.

El problema general siempre es: los procesos en ejecución aún mantienen las estructuras de datos del núcleo, esperando que las funciones del núcleo las esperen y las devuelvan. Y sin esos procesos realizados para ello, no es realmente posible saber, si ese es el caso. Por lo tanto, no puede cambiarlos hasta que se reinicien todos los procesos que los usan. Requeriría parchear en vivo todos esos programas también.
Y ni siquiera mencioné los cambios de controladores, cuando el hardware está en un estado especial. (Mismo problema que con kexec .)

Evi1M4chine
fuente