¿Podemos cambiar en caliente de una instalación de Linux a otra?

¿Podemos cambiar en caliente de una instalación de Linux a otra?

Tengo varias instalaciones independientes de Linux en mi máquina y reinicio la que sea apropiada. Me pregunto si es posible cambiar de uno a otro sin un reinicio completo haciendo algo como, por ejemplo, copiar sobre fstab con las particiones para la nueva instalación en la lista y luego mount -a.

Obviamente, el kernel no cambiaría, pero está bien, espero cambiar simplemente las particiones que funcionan. También considero obvio que esto debería hacerse desde la línea de comando sin nada en ejecución (si es que eso es posible). ¿O la idea es nula y pura locura desde el principio?

La razón de esto es que normalmente experimento con cambios radicales (como pasar al kernel 'amd64' en Debian) en una instalación 'experimental' separada. Por supuesto, reiniciar para iniciarlo está bien, pero sería genial si pudiera saltar a esa instalación sin reiniciar por completo. Podría pensar en esto como simplemente cambiar la partición raíz sobre la marcha, pero tal vez eso no sea posible en absoluto.

Sí, es posible, como aprendo a continuación. Si no necesita cambiar el kernel, utilice 'chroot'. Si desea simular un reinicio completo, utilice 'kexec'.

Respuesta1

No creo que esto sea posible.

Teóricamente lo que querrás hacer es:

  1. Mueva el sistema al nivel de ejecución "único" usando init 1, donde teóricamente solo tiene init y bash ejecutándose.
  2. Desmonte todas las particiones excepto /. En este punto, su sistema puede dejar de funcionar, dependiendo de si /usr está en la partición raíz.
  3. Monte la raíz de su otro sistema operativo en algún lugar.
  4. pivot_root para cambiar la raíz a la nueva partición.
  5. Dígale a init que inicie el nuevo sistema ejecutando init 5(o 2 o lo que sea apropiado).

El problema es que pivot_root solo cambia la partición raíz para el proceso actual, lo que significa que no afectará a init y cuando le diga a init que inicie el sistema, iniciará el anterior. Necesitaría alguna forma de decirle a init que haga pivot_root, lo cual no creo que sea posible.

Ah, y no entremos en lo que sucede cuando su otro sistema operativo usa un servicio de inicio diferente (por ejemplo, Fedora usa systemd mientras que Ubuntu tiene advenedizo). Necesitaría reemplazar el proceso de inicio (pid 1) en el kernel y esto es realmente imposible.

Respuesta2

Si desea experimentar con diferentes núcleos, deberá reiniciarlos o ejecutarlos en una máquina virtual. Las máquinas virtuales son más convenientes, pero no puedes probar el kernel en tu hardware real.

Si desea tener diferentes configuraciones con diferentes conjuntos de programas instalados, también puede utilizar una máquina virtual. Si desea evitar la sobrecarga de una máquina virtual, puede instalar una distribución en unchroot. A menudo hago esto para tener fácil acceso a programas de 32 bits en una instalación de 64 bits, o para tener las últimas novedades (como Debian inestable) además de una versión estable (como Debian estable). escribí unguía para configurar un chroot para versiones alternativas de Debian/Ubuntu. Ver tambiénEntorno Linux ligero y aislado

Respuesta3

Si ustednoQuiere/necesita cambiar los núcleos, pero solo quiere usar los otros sistemas de archivos, como parece indicar aquí:

Obviamente, el kernel no cambiaría, pero está bien, espero cambiar simplemente las particiones que funcionan.

Entonces quizás sólo necesites (mount y) chroot, que, para usar tus palabras,

Podrías pensar en esto como simplemente cambiar la partición raíz sobre la marcha.

Utilizo chroot todo el tiempo desde sistemas de rescate (como clonezilla) para interactuar con un sistema de archivos que normalmente se usaría en un kernel diferente. No espero poder hacer cosas como cargar nuevos módulos del kernel, pero está bien para leer y escribir archivos (arreglar fstab, ajustar grub.conf, etc.).

Puede utilizar montajes de enlace para hacer que el entorno chroot sea más útil. Utilizo esto todo el tiempo para replicar sistemas de archivos montados dentro de un objetivo chroot:

mount /dev/sda1 /mnt
for d in dev sys proc; do mount -obind /$d /mnt/$d; done
chroot /mnt

información relacionada