Recuperar una máquina virtual inaccesible


Si no puedes acceder a tu máquina virtual Linux por cualquier motivo, puedes intentar rescatarla siguiendo estos pasos.

Roles obligatorios

Para obtener los permisos que necesitas para recuperar una VM, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos en el proyecto:

Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

Estos roles predefinidos contienen los permisos necesarios para rescatar una VM. Para ver los permisos exactos que se necesitan, despliega la sección Permisos necesarios:

Permisos obligatorios

Para rescatar una VM, se necesitan los siguientes permisos:

  • compute.instances.create en el proyecto
  • compute.disks.create en el proyecto
  • compute.instances.get en el proyecto
  • compute.disks.createSnapshot en los discos
  • compute.instances.attachDisk en la nueva VM
  • compute.disks.use en disco
  • compute.instances.start en una máquina virtual nueva e inaccesible
  • compute.instances.stop en una máquina virtual nueva e inaccesible

También puedes obtener estos permisos con roles personalizados u otros roles predefinidos.

Recuperar una VM

Si no puedes conectarte a tu VM o el disco de arranque está lleno, debes crear una VM temporal para recuperar la VM inaccesible.

  1. (Opcional) Detén la VM inaccesible.
  2. Crea una instantánea del disco de arranque de la VM inaccesible. Si el sistema de archivos raíz se divide en varios discos, debes crear una instantánea de cada disco.
  3. Crea una VM temporal con una imagen pública que tenga el SO más parecido al de la VM inaccesible. En algunos casos, una política de imágenes de confianza puede impedir que crees discos de arranque a partir de imágenes públicas. En estos casos, debes pedir a un administrador que levante temporalmente esta restricción para poder crear una VM de recuperación. Para obtener más información, consulta Definir restricciones de acceso a imágenes.
  4. Por cada una de las capturas de los discos de arranque de la VM inaccesible que hayas creado anteriormente, crea un disco a partir de la captura y adjúntalo a la VM de rescate. Para ello, sigue estos pasos:

    1. En la consola de Google Cloud , ve a la página Instancias de VM.

      Ir a instancias de VM

    2. Haz clic en el nombre de la VM temporal que has creado.

    3. Haz clic en Editar.

    4. En Discos adicionales, haz clic en Añadir nuevo disco y, a continuación, haz lo siguiente:

      1. Añade el nombre del disco, como my-recovery-disk
      2. En Tipo de fuente, selecciona la pestaña Instantánea.
      3. En el menú desplegable Snapshot de origen, selecciona la captura de la VM de origen que has creado anteriormente en estos pasos.
      4. Haz clic en Listo.
    5. Haz clic en Guardar.

  5. Conéctate a la VM temporal mediante SSH.

  6. Identifica el nombre de cada uno de los discos que has asociado anteriormente a la VM ejecutando el siguiente comando:

    lsblk -d -o NAME,SERIAL

    El resultado debería ser similar al siguiente:

     NAME SERIAL
     sda  rescue-vm
     sdb  my-recovery-disk
     

    En este ejemplo, rescue-vm es el disco de arranque de la VM de rescate y my-recovery-disk es el disco de arranque de la captura de la VM inaccesible. Anota el NAME de la máquina virtual inaccesible para usarlo en el siguiente paso.

  7. En cada uno de los discos que has asociado anteriormente a la VM, haz lo siguiente:

    1. Identifica el sistema de archivos de cada partición ejecutando el siguiente comando:

      fdisk -l /dev/NAME -o Device,Size,Type
      

      Sustituye NAME por el nombre del disco de arranque de la máquina virtual inaccesible del paso anterior. En este ejemplo, el nombre sería sdb.

      El resultado debería ser similar al siguiente:

      Disk /dev/sdb: 10 GiB, 10737418240 bytes, 20971520 sectors
      Disk model: PersistentDisk
      Units: sectors of 1 * 512 = 512 bytes
      Sector size (logical/physical): 512 bytes / 4096 bytes
      I/O size (minimum/optimal): 4096 bytes / 4096 bytes
      Disklabel type: gpt
      Disk identifier: B31430F1-F041-4555-96B9-B2F43DC057AD
      
      Device     Size Type
      /dev/sdb1    2M BIOS boot
      /dev/sdb2   20M EFI System
      /dev/sdb3   10G Linux filesystem
      

      La columna Type muestra el sistema de archivos de cada partición. Si falta el tipo de sistema de archivos de alguna partición, ejecuta el siguiente comando:

      file -sL /dev/PARTITION_NAME
      

      Sustituye NAME por el nombre de la partición.

      La salida varía en función del tipo de sistema de archivos:

      • Sin sistema de archivos: si la salida solo muestra data, la partición no contiene ningún sistema de archivos. Ejemplo:

        /dev/sdb1: data
        
      • Sistema de archivos EFI: si la salida describe un sector de arranque DOS/MBR, la partición tiene un sistema de archivos EFI. Ejemplo:

        dev/sdb2: DOS/MBR boot sector, code offset 0x3c+2, OEM-ID "mkfs.fat", sectors/cluster 4, reserved sectors
        4, root entries 512, sectors 40960 (volumes <=32 MB), Media descriptor 0xf8, sectors/FAT 40, sectors/
        track 32, heads 64, serial number 0xf2af2664, label: "EFI        ", FAT (16 bit)
        
      • Sistema de archivos de Linux: si la salida describe datos del sistema de archivos, la partición es un sistema de archivos de Linux. Ejemplo:

        /dev/sdb3: SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs)
        

      Anota el nombre de la partición del sistema de archivos de Linux.

    2. Crea un punto de montaje en /rescue:

      sudo mkdir /rescue
    3. Monta la partición del sistema de archivos de Linux en /rescue:

      sudo mount PARTITION_NAME /rescue
      

      Sustituye PARTITION_NAME por el nombre del sistema de archivos de Linux que anotaste anteriormente.

    4. Si quieres modificar el directorio raíz del sistema de archivos con el comando chroot, también debes montar el sistema de archivos virtual y los dispositivos ejecutando los siguientes comandos:

      sudo mount -t proc /proc /rescue/proc
      sudo mount -t sysfs /sys /rescue/sys
      sudo mount -o bind /dev /rescue/dev
      sudo mount -o bind /dev/pts /rescue/dev/pts
      sudo mount -o bind /run /rescue/run
      

    El sistema de archivos del disco de arranque inaccesible ahora está montado en /rescue. Puedes desplazarte por el sistema de archivos, cambiar archivos de configuración, solucionar problemas o recuperar los datos.

Deshacer los cambios y volver a iniciar la VM inaccesible

Una vez que se haya solucionado el problema o se hayan recuperado los datos, deberá restaurar la VM. Sigue estos pasos para restaurar la máquina virtual original:

  1. Desmonta el disco adicional que está montado en /rescue en la máquina virtual temporal:

     cd ~
     sudo umount /rescue

  2. En la consola de Google Cloud , ve a la página Instancias de VM.

    Ir a instancias de VM

    1. Selecciona la VM temporal que has creado.

    2. Haz clic en Editar.

    3. En Discos adicionales, haz clic en del disco creado en los pasos anteriores para separar el disco adicional de la VM temporal.

    4. Haz clic en Guardar.

  3. Ve a la página Instancias de VM de la Google Cloud consola.

    Ir a instancias de VM

    1. Si la máquina virtual inaccesible sigue ejecutándose, detenla.

    2. Haga clic en el nombre de la máquina virtual que acaba de detener y, a continuación, en Editar.

    3. En Disco de arranque, haz clic en Desvincular disco de arranque para desvincular el disco de arranque de la VM inaccesible.

    4. A continuación, haz clic en CONFIGURAR DISCO DE ARRANQUE para adjuntar el disco que has creado y corregido anteriormente en la sección Recuperar una VM de esta página.

      1. En la sección Disco de arranque, haga clic en la pestaña Discos existentes.
      2. En la lista desplegable, selecciona el disco que has creado en la sección anterior, por ejemplo, my-recovery-disk.
      3. Haz clic en Seleccionar y, a continuación, en Guardar.
    5. Inicia la VM.

  4. Ahora deberías poder conectarte a la VM mediante SSH.