GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo usar systemd-nspawn para la recuperación del sistema Linux

Durante el tiempo que han existido los sistemas GNU/Linux, los administradores de sistemas han necesitado recuperarse de daños en el sistema de archivos raíz, cambios de configuración accidentales u otras situaciones que impedían que el sistema se iniciara en un estado "normal".

Las distribuciones de Linux suelen ofrecer una o más opciones de menú en el momento del arranque (por ejemplo, en el menú de GRUB) que se pueden usar para rescatar un sistema dañado; por lo general, inician el sistema en un modo de usuario único con la mayoría de los servicios del sistema deshabilitados. En el peor de los casos, el usuario podría modificar la línea de comando del kernel en el gestor de arranque para usar el shell estándar como proceso de inicio (PID 1). Este método es el más complejo y lleno de complicaciones, lo que puede generar frustración y pérdida de tiempo cuando un sistema necesita ser rescatado.

Más recursos de Linux

  • Hoja de trucos de los comandos de Linux
  • Hoja de trucos de comandos avanzados de Linux
  • Curso en línea gratuito:Descripción general técnica de RHEL
  • Hoja de trucos de red de Linux
  • Hoja de trucos de SELinux
  • Hoja de trucos de los comandos comunes de Linux
  • ¿Qué son los contenedores de Linux?
  • Nuestros últimos artículos sobre Linux

Lo que es más importante, todos estos métodos asumen que el sistema dañado tiene una consola física de algún tipo, pero esto ya no es un hecho en la era de la computación en la nube. Sin una consola física, hay pocas opciones (si es que hay alguna) para influir en el proceso de arranque de esta manera. Incluso las máquinas físicas pueden ser dispositivos integrados pequeños que no ofrecen una consola fácil de usar, y encontrar los cables y adaptadores de puerto serial adecuados y configurar un emulador de terminal serial, todo para usar un puerto de consola serial mientras se trata de un emergencia, suele ser complicado.

Cuando hay disponible otro sistema (de la misma arquitectura y, en general, una configuración similar), una técnica común para simplificar el proceso de reparación es extraer los dispositivos de almacenamiento del sistema dañado y conectarlos al sistema en funcionamiento como dispositivos secundarios. Con los sistemas físicos, esto suele ser sencillo, pero la mayoría de las plataformas de computación en la nube también pueden admitir esto, ya que permiten que el volumen de almacenamiento raíz de la instancia dañada se monte en otra instancia.

Una vez que el sistema de archivos raíz está conectado a otro sistema, abordar la corrupción del sistema de archivos es sencillo usando fsck. y otras herramientas. Abordar errores de configuración, paquetes rotos u otros problemas puede ser más complejo, ya que requiere montar el sistema de archivos y ubicar y cambiar los archivos de configuración o bases de datos correctos.

Uso de systemd

Antes de systemd , editar archivos de configuración con un editor de texto era una forma práctica de corregir una configuración. Localizar los archivos necesarios y comprender su contenido puede ser un desafío aparte, que está más allá del alcance de este artículo.

Cuando el sistema GNU/Linux usa systemd sin embargo, muchos cambios de configuración se realizan mejor utilizando las herramientas que proporciona; habilitar y deshabilitar servicios, por ejemplo, requiere la creación o eliminación de enlaces simbólicos en varias ubicaciones. El sistemactl La herramienta se utiliza para realizar estos cambios, pero su uso requiere un systemd instancia para ejecutarse y escuchar (en D-Bus) las solicitudes. Cuando el sistema de archivos raíz se monta como un sistema de archivos adicional en otra máquina, el systemd en ejecución no se puede usar la instancia para hacer estos cambios.

Lanzamiento manual del systemd del sistema de destino tampoco es práctico, ya que está diseñado para ser el proceso PID 1 en un sistema y administrar todos los demás procesos, lo que entraría en conflicto con la instancia que ya se está ejecutando en el sistema utilizado para las reparaciones.

Afortunadamente, systemd tiene la capacidad de lanzar contenedores, sistemas GNU/Linux completamente encapsulados con su propio PID 1 y un entorno que utiliza varias funciones de espacio de nombres que ofrece el kernel de Linux. A diferencia de herramientas como Docker y Rocket, systemd no requiere una imagen de contenedor para lanzar un contenedor; puede iniciar uno rooteado en cualquier punto del sistema de archivos existente. Esto se hace usando el systemd-nspawn tool, que creará los espacios de nombres del sistema necesarios e iniciará el proceso inicial en el contenedor, luego proporcionará una consola en el contenedor. A diferencia de chroot , que solo cambia la raíz aparente del sistema de archivos, este tipo de contenedor tendrá un espacio de nombres de sistema de archivos separado, sistemas de archivos adecuados montados en /dev , /correr y /proc , y un espacio de nombres de proceso y espacios de nombres IPC separados. Consulte el systemd-nspawn página del manual para obtener más información sobre sus capacidades.

Un ejemplo para mostrar cómo funciona

En este ejemplo, el dispositivo de almacenamiento que contiene el sistema de archivos raíz del sistema dañado se ha conectado a un sistema en ejecución, donde aparece como /dev/vdc . El nombre del dispositivo variará según la cantidad de dispositivos de almacenamiento existentes, el tipo de dispositivo y el método utilizado para conectarlo al sistema. El sistema de archivos raíz podría usar todo el dispositivo de almacenamiento o estar en una partición dentro del dispositivo; dado que la configuración más común (simple) coloca el sistema de archivos raíz en la primera partición del dispositivo, este ejemplo usará /dev/vdc1. Asegúrese de reemplazar el nombre del dispositivo en los siguientes comandos con el nombre de dispositivo correcto de su sistema.

El sistema de archivos raíz dañado también puede ser más complejo que un solo sistema de archivos en un dispositivo; puede ser un volumen en un conjunto de volúmenes LVM o en un conjunto de dispositivos combinados en un dispositivo RAID de software. En estos casos, se deben realizar los pasos necesarios para componer y activar el dispositivo lógico que contiene el sistema de archivos antes de que esté disponible para el montaje. Nuevamente, esos pasos están más allá del alcance de este artículo.

Requisitos

Primero, asegúrese de que systemd-nspawn la herramienta está instalada; la mayoría de las distribuciones de GNU/Linux no la instalan de manera predeterminada. Lo proporciona el systemd-container paquete en la mayoría de las distribuciones, así que use el administrador de paquetes de su distribución para instalar ese paquete. Las instrucciones de este ejemplo se probaron con Debian 9, pero deberían funcionar de manera similar en cualquier distribución moderna de GNU/Linux.

Es casi seguro que el uso de los comandos a continuación requerirá permisos de root, por lo que deberá iniciar sesión como root, usar sudo para obtener un shell con permisos de root, o prefije cada uno de los comandos con sudo .

Verificar y montar el fileystem

Primero, usa fsck para verificar las estructuras y el contenido del sistema de archivos de destino:

$ fsck /dev/vdc1

Si encuentra algún problema con el sistema de archivos, responda las preguntas apropiadamente para corregirlo. Si el sistema de archivos está lo suficientemente dañado, es posible que no se pueda reparar, en cuyo caso tendrá que encontrar otras formas de extraer su contenido.

Ahora, cree un directorio temporal y monte el sistema de archivos de destino en ese directorio:

$ mkdir /tmp/target-rescue
$ mount /dev/vdc1 /tmp/target-rescue

Con el sistema de archivos montado, inicie un contenedor con ese sistema de archivos como su sistema de archivos raíz:

$ systemd-nspawn --directory /tmp/target-rescue --boot -- --unit rescue.target

Los argumentos de la línea de comandos para iniciar el contenedor son:

  • --directorio /tmp/objetivo-rescate proporciona la ruta del sistema de archivos raíz del contenedor.
  • --arranque busca un programa de inicio adecuado en el sistema de archivos raíz del contenedor y lo inicia, pasándole parámetros desde la línea de comandos. En este ejemplo, el sistema de destino también usa systemd como su proceso PID 1, por lo que los parámetros restantes están destinados a él. Si el sistema de destino que está reparando utiliza cualquier otra herramienta como proceso PID 1, deberá ajustar los parámetros en consecuencia.
  • -- separa los parámetros para systemd-nspawn de los destinados al proceso PID 1 del contenedor.
  • --unidad de rescate.objetivo le dice a systemd en el contenedor, el nombre del objetivo al que debe intentar llegar durante el proceso de arranque. Para simplificar las operaciones de rescate en el sistema de destino, inícielo en el modo de "rescate" en lugar de en su modo multiusuario normal.

Si todo va bien, debería ver un resultado similar a este:

Spawning container target-rescue on /tmp/target-rescue.
Press ^] three times within 1s to kill container.
systemd 232 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
Detected virtualization systemd-nspawn.
Detected architecture arm.

Welcome to Debian GNU/Linux 9 (Stretch)!

Set hostname to <test>.
Failed to install release agent, ignoring: No such file or directory
[  OK  ] Reached target Swap.
[  OK  ] Listening on Journal Socket (/dev/log).
[  OK  ] Started Dispatch Password Requests to Console Directory Watch.
[  OK  ] Reached target Encrypted Volumes.
[  OK  ] Created slice System Slice.
         Mounting POSIX Message Queue File System...
[  OK  ] Listening on Journal Socket.
         Starting Set the console keyboard layout...
         Starting Restore / save the current clock...
         Starting Journal Service...
         Starting Remount Root and Kernel File Systems...
[  OK  ] Mounted POSIX Message Queue File System.
[  OK  ] Started Journal Service.
[  OK  ] Started Remount Root and Kernel File Systems.
         Starting Flush Journal to Persistent Storage...
[  OK  ] Started Restore / save the current clock.
[  OK  ] Started Flush Journal to Persistent Storage.
[  OK  ] Started Set the console keyboard layout.
[  OK  ] Reached target Local File Systems (Pre).
[  OK  ] Reached target Local File Systems.
         Starting Create Volatile Files and Directories...
[  OK  ] Started Create Volatile Files and Directories.
[  OK  ] Reached target System Time Synchronized.
         Starting Update UTMP about System Boot/Shutdown...
[  OK  ] Started Update UTMP about System Boot/Shutdown.
[  OK  ] Reached target System Initialization.
[  OK  ] Started Rescue Shell.
[  OK  ] Reached target Rescue Mode.
         Starting Update UTMP about System Runlevel Changes...
[  OK  ] Started Update UTMP about System Runlevel Changes.
You are in rescue mode. After logging in, type "journalctl -xb" to view
system logs, "systemctl reboot" to reboot, "systemctl default" or ^D to
boot into default mode.
Give root password for maintenance
(or press Control-D to continue):

En esta salida, puede ver systemd lanzándose como el proceso init en el contenedor y detectando que se está ejecutando dentro de un contenedor para que pueda ajustar su comportamiento apropiadamente. Se inician varios archivos de unidad para llevar el contenedor a un estado utilizable, luego se solicita la contraseña raíz del sistema de destino. Puede ingresar la contraseña de root aquí si desea un aviso de shell con permisos de root, o puede presionar Ctrl+D para permitir que continúe el proceso de inicio, que mostrará un indicador de inicio de sesión normal en la consola.

Cuando haya completado los cambios necesarios en el sistema de destino, presione Ctrl+] tres veces en rápida sucesión; esto terminará el contenedor y lo regresará a su shell original. A partir de ahí, puede limpiar desmontando el sistema de archivos del sistema de destino y eliminando el directorio temporal:

$ umount /tmp/target-rescue
$ rmdir /tmp/target-rescue

¡Eso es todo! Ahora puede eliminar los dispositivos de almacenamiento del sistema de destino y devolverlos al sistema de destino.

La idea de usar systemd-nspawn de esta manera, especialmente el --parámetro de arranque , provino de una pregunta publicada en StackExchange. ¡Gracias a Shibumi y kirbyfan64sos por proporcionar respuestas útiles a esta pregunta!


Linux
  1. Cómo usar BusyBox en Linux

  2. Cómo uso cron en Linux

  3. Cómo usar rsync avanzado para grandes copias de seguridad de Linux

  4. Cómo usar el comando Su en Linux

  5. Linux:¿cómo deshabilitar el pitido del sistema para usuarios sin privilegios?

Cómo cifrar el sistema de archivos raíz en Linux

Cómo usar el comando fd en el sistema Linux

Cómo usar máquinas virtuales Virtualbox en KVM en un sistema Linux

¿Cómo generar y usar la clave SSH en el sistema Linux?

Cómo instalar y usar Nmap en Linux Mint 20

Cómo instalar y usar YouTube-DL en el sistema Linux