Interactúa con la consola en serie

En esta página, se describe cómo habilitar el acceso interactivo a la consola en serie de una instancia para depurar problemas de inicio y red, solucionar problemas de funcionamiento incorrecto, interactuar con GRand Unified Bootloader (GRUB) y realizar otras tareas de solución de problemas.

Una instancia de máquina virtual tiene cuatro puertos en serie virtuales. Interactuar con un puerto en serie es similar a usar una ventana de la terminal, en la que la entrada y salida están totalmente en modo de texto y no hay interfaz gráfica ni asistencia de mouse. El sistema operativo de la instancia, el BIOS y otras entidades a nivel del sistema a menudo escriben la salida en los puertos en serie y pueden aceptar entradas, como comandos o respuestas a las indicaciones. Por lo general, estas entidades a nivel del sistema usan el primer puerto en serie (puerto 1) que por lo general se denomina consola en serie.

Si solo necesitas ver la salida del puerto en serie sin emitir ningún comando a la consola en serie, puedes llamar al método getSerialPortOutput o usar Stackdriver para leer la información que la instancia escribió en el puerto en serie. Consulta la página sobre cómo ver los registros del puerto en serie. Sin embargo, si tienes problemas para acceder a la instancia mediante SSH o necesitas solucionar problemas de una instancia que no está completamente iniciada, puedes habilitar el acceso interactivo a la consola en serie, que te permite conectarte y, también, interactuar con cualquiera de los puertos en serie de la instancia. Por ejemplo, puedes ejecutar comandos directamente y responder a las solicitudes en el puerto en serie.

Antes de comenzar

Permisos necesarios para esta tarea

Para realizar esta tarea, debes contar con los siguientes permisos:

  • compute.instances.setMetadata en la instancia, si habilitas el acceso interactivo en una instancia específica
  • compute.projects.setCommonInstanceMetadata en el proyecto, si habilitas el acceso interactivo en todo el proyecto

Habilita el acceso interactivo en la consola en serie

Habilita el acceso interactivo a la consola en serie para las instancias de VM individuales o un proyecto completo.

Habilita el acceso para un proyecto

Cuando habilitas el acceso interactivo de la consola en serie en un proyecto, se habilita el acceso para todas las instancias de VM que forman parte de ese proyecto.

De forma predeterminada, el acceso al puerto en serie interactivo está inhabilitado. Para inhabilitarlo de forma explícita, configura la clave serial-port-enable como 0, en lugar de 1. En cualquier caso, la configuración por instancia anulará la configuración a nivel de proyecto o la predeterminada.

Console

  1. Ve a la página Metadatos.
  2. Haz clic en Editar para editar entradas de metadatos.
  3. Agrega una entrada nueva con la clave serial-port-enable y el valor 1. Captura de pantalla para agregar la clave de metadatos de la consola en serie
  4. Guarda los cambios.

gcloud

Usa el comando project-info add-metadata: Por ejemplo:

gcloud compute project-info add-metadata --metadata serial-port-enable=1

API

En la API, realiza una solicitud al método projects().setCommonInstanceMetadata y proporciona la clave serial-port-enable con un valor de 1:

{
 "fingerprint": "FikclA7UBC0=",
 "items": [
  {
   "key": "serial-port-enable",
   "value": "1"
  }
 ]
}

Habilita el acceso para una instancia de VM

Habilita el acceso interactivo a la consola en serie para una instancia específica. Una configuración por instancia, si existe, anulará cualquier configuración a nivel de proyecto. También puedes inhabilitar el acceso para una instancia específica si estableces serial-port-enable en 0, en lugar de 1, incluso si el acceso está habilitado a nivel del proyecto. De manera similar, puedes habilitar el acceso para una o más instancias, incluso si están inhabilitadas en el proyecto, de forma explícita o predeterminada.

Console

  1. Ve a la página Instancias de VM.

    Ir a la página Instancias de VM

  2. Haz clic en la instancia para la que deseas habilitar el acceso.
  3. Haz clic en Editar.
  4. En la sección Acceso remoto, activa o desactiva la casilla de verificación Habilitar conexión a puertos en serie.
  5. Guarda los cambios.

gcloud

Con la herramienta de línea de comandos de gcloud, usa el comando instances add-metadata:

gcloud compute instances add-metadata INSTANCE \
  --metadata serial-port-enable=1

API

Realiza una solicitud al método instances().setMetadata con la clave serial-port-enable y un valor de 1:

POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances/example-instance/setMetadata

{
 "fingerprint": "zhma6O1w2l8=",
 "items": [
  {
   "key": "serial-port-enable",
   "value": "1"
  }
 ]
}

Conexión a una consola en serie

Después de habilitar el acceso interactivo para la consola en serie de una instancia, puedes conectarte a la consola en serie mediante Google Cloud Platform Console, la herramienta de línea de comandos de gcloud o un cliente SSH de terceros.

La consola en serie autentica a los usuarios con Llaves SSH. En concreto, debes agregar la Llave SSH pública a los metadatos del proyecto o de la instancia y almacenar la clave privada en la máquina local desde la que deseas conectarte. La herramienta de gcloud y Google Cloud Platform Console agregarán Llaves SSH al proyecto de forma automática. Si usas un cliente de terceros, es posible que debas agregar Llaves SSH de forma manual.

Console

  1. Ve a la página de instancias de VM.

    Ir a la página Instancias de VM

  2. Haz clic en la instancia a la que deseas conectarte.
  3. En Acceso remoto, haz clic en Conectar a la consola en serie para conectarte al puerto predeterminado (puerto 1).
  4. Si deseas conectarte a otro puerto en serie, haz clic en la flecha hacia abajo junto al botón Conectar a la consola en serie y cambia el número de puerto según corresponda.
  5. Para instancias de Windows, abre el menú desplegable junto al botón y conéctate al puerto 2 a fin de acceder a la consola en serie.

gcloud

Usa el subcomando gcloud compute connect-to-serial-port para conectarte con la herramienta de línea de comandos de gcloud. Por ejemplo:

gcloud compute connect-to-serial-port [INSTANCE_NAME]

en el que [INSTANCE_NAME] es el nombre de la instancia a la que deseas acceder en la consola en serie.

De forma predeterminada, el comando connect-to-serial-port se conecta al puerto 1 de la consola en serie. Si te conectas a una instancia de VM de Windows, en su lugar, conéctate al puerto 2:

gcloud compute connect-to-serial-port [INSTANCE_NAME] --port 2

Para conectarte a cualquier otro puerto, proporciona un número de puerto diferente con la marca --port. Puedes proporcionar un número de puerto del 1 al 4, inclusive. Para obtener más información sobre los números de puerto, consulta la descripción de la numeración de puertos en serie.

Otros clientes SSH

Puedes conectarte a la consola en serie de una instancia con otros clientes SSH de terceros, siempre y cuando el cliente te permita conectarte al puerto TCP 9600.

Por ejemplo, el siguiente comando SSH se conecta al puerto en serie predeterminado (1) de una instancia llamada example-instance con el nombre de usuario jane en un proyecto con el ID del proyecto myproject. La instancia está en la zona us-central1-f:

ssh -i [PRIVATE_SSH_KEY_FILE] -p 9600 \
myproject.us-central1-f.example-instance.jane@ssh-serialport.googleapis.com

En detalle, puedes conectarte a la consola en serie de una instancia con la siguiente información de acceso y dirección:

[PROJECT_ID].[ZONE].[INSTANCE_NAME].[USERNAME].[OPTIONS]@ssh-serialport.googleapis.com

en la que:

  • [PROJECT_ID] es el ID del proyecto para esta instancia.
  • [ZONE] es la zona de la instancia.
  • [INSTANCE_NAME] es el nombre de la instancia.
  • [USERNAME] es el nombre de usuario que usas para conectarte a la instancia. Por lo general, este es el nombre de usuario en tu máquina local.
  • [OPTIONS] son opciones adicionales que puedes especificar para esta conexión. Por ejemplo, puedes especificar un puerto en serie determinado y cualquiera de las opciones avanzadas que se muestran más adelante. El número de puerto puede ser del 1 al 4, inclusive. Para obtener más información sobre los números de puerto, consulta la descripción de la numeración de puertos en serie. Si se omite, te conectarás al puerto en serie 1.

Si te conectas a una instancia de VM de Windows, en su lugar, conéctate al puerto 2 con el siguiente comando:

ssh -i [PRIVATE_SSH_KEY_FILE] -p 9600 \
[PROJECT_ID].[ZONE].[INSTANCE_NAME].[USERNAME].port=2@ssh-serialport.googleapis.com

Si tienes problemas para conectarte con un cliente SSH de terceros, puedes ejecutar gcloud compute connect-to-serial-port con la opción de línea de comandos --dry-run para ver el comando SSH que habría ejecutado en tu nombre, y compara las opciones con el comando que usas.

Configura una conexión segura

Cuando usas un cliente SSH de terceros que no es la herramienta de línea de comandos de gcloud, puedes asegurarte de que estás protegido contra robo de identidad o ataques de intermediarios si verificas la Llave SSH del puerto en serio de Google. Sigue estas instrucciones para configurar el sistema y verificar la Llave SSH del servidor:

  1. Descarga la Llave SSH del servidor del puerto en serie de Google.
  2. Abre tu archivo de hosts conocidos; por lo general, se ubica en ~/.ssh/known_hosts.
  3. Agrega el contenido de la Llave SSH del servidor con ssh-serialport.googleapis.com a la clave. Por ejemplo, si la clave del servidor contiene la línea ssh-rsa AAAAB3NzaC1yc..., entonces ~/.ssh/known_hosts debería tener una línea:

    ssh-serialport.googleapis.com ssh-rsa AAAAB3NzaC1yc...
    

Por motivos de seguridad, a veces Google puede cambiar la Llave SSH del servidor del puerto en serie de Google. Si el cliente no puede autenticar la clave del servidor, anula el intento de conexión de inmediato y sigue las instrucciones anteriores para descargar una nueva Llave SSH del servidor del puerto en serie de Google.

Si después de actualizar la clave de host, continúas recibiendo un error de autenticación de host de tu cliente, debes detener los intentos de conexión al puerto en serie y comunicarte con la Atención al cliente de Google. No proporciones ninguna credencial a través de una conexión en la que haya fallado la autenticación del host.

Desconéctate de la consola en serie

Para desconectarte de la consola en serie, sigue estos pasos:

  1. Presiona la tecla ENTER.
  2. Escribe ~. (virgulilla, seguido de un punto).

Puedes descubrir otros comandos si escribes ~? o examinas la página del manual para SSH:

man ssh

No intentes desconectarte mediante ninguno de los siguientes métodos:

  • La combinación de teclas CTRL+ALT+DELETE o combinaciones similares. Esto no funcionará porque la consola en serie no reconoce las combinaciones de teclado de la computadora de escritorio.

  • El comando exit o logout no funciona porque el invitado no conoce ninguna conexión de red o módem. El uso de este comando hace que la consola se cierre y se vuelva a abrir, y permanezcas conectado a la sesión. Si deseas habilitar los comandos exit y logout para la sesión, configura la opción on-dtr-low.

Conéctate a una consola en serie con un mensaje de acceso

Si estás intentando solucionar un problema con una instancia que se inició por completo, o un problema que ocurre después de que la instancia se inició más allá del modo de usuario único, es posible que se te solicite información de acceso cuando intentes acceder a la consola en serie.

De forma predeterminada, las imágenes del sistema que proporciona Google no están configuradas para permitir accesos basados en contraseña de usuarios locales. Si la instancia ejecuta una imagen que está preconfigurada con accesos al puerto en serie, debes configurar una contraseña local en la instancia de máquina virtual para poder acceder a la consola en serie, si se solicita.

Configura una contraseña local

En las siguientes instrucciones, se describe cómo configurar una contraseña local para un usuario en una instancia de máquina virtual a fin de que pueda acceder a la consola en serie de esa instancia con la contraseña especificada.

  1. Conéctate a la instancia:

    gcloud compute ssh [INSTANCE_NAME]
    
  2. En la instancia, crea una contraseña local con el siguiente comando. Esto establece una contraseña para el usuario con el que accediste actualmente.

    sudo passwd `whoami`
    
  3. Sigue las indicaciones para crear una contraseña.

  4. A continuación, debes salir de la instancia y conectarte a la consola en serie.

  5. Ingresa tu información de acceso cuando se solicite.

Configura el acceso en otros puertos en serie

Los mensajes de acceso se habilitan en el puerto 1 de forma predeterminada en la mayoría de los sistemas operativos Linux. Sin embargo, el puerto 1 puede verse sobrecargado cuando registra datos y otra información que se imprime en el puerto. Como alternativa, puedes optar por habilitar una solicitud de acceso en otro puerto, como el puerto 2 (ttyS1), mediante la ejecución de uno de los siguientes comandos en la instancia. Puedes ver una lista de puertos disponibles para una instancia en la descripción de la numeración de puertos en serie.

En la siguiente tabla, se detallan imágenes preconfiguradas con acceso a consola en serie y los puertos predeterminados.

Sistema operativo Puertos con una solicitud de acceso predeterminada Administración de servicio
CentOS 6 1 upstart
CentOS 7 1 systemd
CoreOS 1 systemd
COS 1 systemd
Debian 8 1 systemd
Debian 9 1 systemd
OpenSUSE 13 1 systemd
OpenSUSE Leap 1 systemd
RHEL 6 1 upstart
RHEL 7 1 systemd
SLES 11 1 sysvinit
SLES 12 1 systemd
Ubuntu 14.04 1 upstart
Ubuntu 16.04 1 systemd
Ubuntu 17.04 1 systemd
Ubuntu 17.10 1 systemd
Windows COM2 No aplica

Para habilitar las solicitudes de acceso en puertos en serie adicionales, sigue las instrucciones que se muestran a continuación.

systemd

Para los sistemas operativos Linux que usan systemd, haz lo siguiente:

  • Habilita el servicio de forma temporal hasta el próximo reinicio:

    sudo systemctl start serial-getty@ttyS1.service
    
  • Habilita el servicio de forma permanente a partir del siguiente reinicio:

    sudo systemctl enable serial-getty@ttyS1.service
    

upstart

Para los sistemas operativos Linux que usan upstart, haz lo siguiente:

  1. Para crear un archivo /etc/init/ttyS1.conf nuevo, copia y modifica un archivo ttyS0.conf existente a fin de reflejar ttyS1. Por ejemplo:

    • En Ubuntu 14.04:

      sudo sh -c "sed -e s/ttyS0/ttyS1/g < /etc/init/ttyS0.conf > /etc/init/ttyS1.conf"
      
    • En RHEL 6.8 y CentOS 6.8:

      sudo sh -c "sed -ne '/^# # ttyS0/,/^# exec/p'  < /etc/init/serial.conf  | sed -e 's/ttyS0/ttyS1/g' -e 's/^# *//' > /etc/init/ttyS1.conf"
      
  2. Inicia una ventana de acceso en ttyS1 sin reiniciar:

    sudo start ttyS1
    

sysvinit

Para los sistemas operativos Linux que usan sysvinit, ejecuta los siguientes comandos:

 sudo sed -i~ -e 's/^#T\([01]\)/T\1/' /etc/inittab
 sudo telinit q

Descripción de la numeración del puerto en serie

Cada instancia de máquina virtual tiene cuatro puertos en serie. Para mantener la coherencia con la API de getSerialPortOutput, cada puerto está numerado del 1 al 4. Linux y otros sistemas similares numeran sus puertos en serie del 0 al 3. Por ejemplo, en muchas imágenes del sistema operativo, los dispositivos correspondientes son /dev/ttyS0 a /dev/ttyS3. Windows hace referencia a los puertos en serie como COM1 a COM4. Para conectarte a lo que Windows considera COM3 y Linux considera ttyS2, debes especificar el puerto 3. Usa la siguiente tabla para saber a qué puerto deseas conectarte.

Puertos en serie de la instancia de máquina virtual Puertos en serie estándar de Linux Puertos COM de Windows
1 /dev/ttyS0 COM1
2 /dev/ttyS1 COM2
3/dev/ttyS2 COM3
4/dev/ttyS3 COM4

Ten en cuenta que muchas imágenes de Linux usan el puerto 1 (/dev/ttyS0) para registrar mensajes de kernel y los programas del sistema.

Envía una interrupción en serie

La función clave Magic SysRq te permite realizar tareas de bajo nivel sin importar el estado del sistema. Por ejemplo, con la función clave Magic SysRq, puedes sincronizar sistemas de archivos, reiniciar la instancia, terminar procesos, desactivar sistemas de archivos, etc.

Para enviar un comando Magic SysRq mediante una interrupción serial simulada, sigue estos pasos:

  1. Presiona la tecla ENTER.
  2. Escribe ~B (virgulilla, seguido de B mayúscula).
  3. Escribe el comando Magic SysRq deseado.

Visualiza registros de auditoría de la consola en serie

Compute Engine proporciona registros de auditoría para realizar el seguimiento de quién se conectó y desconectó de la consola en serie de una instancia. Para ver los registros, debes tener permisos del Visor de registros o ser un visor o editor de proyecto.

  1. Ve a la página de Registros en GCP Console.

    Ir a la página Registros

  2. Expande el menú desplegable y selecciona GCE VM Instance.
  3. En la barra de búsqueda, escribe ssh-serialport.googleapis.com y presiona Intro.
  4. Aparece una lista de registros de auditoría que describen la conexión y las desconexiones de una consola en serie. Expande cualquiera de las entradas para obtener más información:

    Registros de auditoría de la consola en serie

En cualquiera de los registros de auditoría, puedes hacer lo siguiente:

  1. Expandir la propiedad protoPayload.
  2. Buscar methodName para ver la actividad a la que se aplica este registro (ya sea una solicitud de conexión o desconexión). Por ejemplo, si este registro rastrea una desconexión de la consola en serie, el nombre del método dirá "google.ssh-serialport.v1.disconnect". Del mismo modo, un registro de conexión diría "google.ssh-serialport.v1.connect". Se registra una entrada de registro de auditoría al principio y al final de cada sesión en la consola en serie.

Existen diferentes propiedades de registro de auditoría para distintos tipos de registro. Por ejemplo, los registros de auditoría relacionados con las conexiones tendrán algunas propiedades específicas de los registros de conexión, mientras que los registros de auditoría para desconexiones tendrán su propio conjunto de propiedades. Existen ciertas propiedades de registro de auditoría que también se comparten entre ambos tipos de registro.

Todos los registros de la consola en serie

Propiedad Valor
requestMetadata.callerIp Indica la dirección IP y el número de puerto desde donde se originó la conexión.
serviceName ssh-serialport.googleapis.com
resourceName Indica una string que contiene el ID del proyecto, la zona, el nombre de la instancia y el número de puerto en serie para indicar a qué consola en serie pertenece. Por ejemplo, projects/myproject/zones/us-east1-a/instances/example-instance/SerialPort/2 es el puerto 2, también conocido como COM2 o /dev/ttyS1, para la instancia example-instance.
resource.labels Indica las propiedades que identifican el ID de la instancia, la zona y el ID del proyecto.
timestamp Indica una marca de tiempo que muestra cuándo comenzó o terminó la sesión.
severity NOTICE
operation.id Indica una string de ID que identifica de forma exclusiva la sesión; puedes usar esto para asociar una entrada de desconexión con la entrada de conexión correspondiente.
operation.producer ssh-serialport.googleapis.com

Registros de conexión

Propiedad Valor
methodName google.ssh-serialport.v1.connect
status.message Connection succeeded.
request.serialConsoleOptions Indica cualquier opción que se especificó con la solicitud, incluido el número de puerto en serie.
request.@type type.googleapis.com/google.compute.SerialConsoleSessionBegin
request.username Indica el nombre de usuario especificado para esta solicitud. Esto se usa para seleccionar la clave pública para que coincida.
operation.first true
status.code Para las solicitudes de conexión exitosas, un valor status.code de google.rpc.Code.OK indica que la operación se completó con éxito sin ningún error. Como el valor de enumeración de esta propiedad es 0, la propiedad status.code no se mostrará en este caso. Sin embargo, cualquier código que comprueba un valor status.code de google.rpc.Code.OK funcionará como se esperaba.

Registros de desconexión

Propiedad Valor
methodName google.ssh-serialport.v1.disconnect
response.duration Indica la cantidad de tiempo que duró la sesión, en segundos.
response.@type type.googleapis.com/google.compute.SerialConsoleSessionEnd
operation.last true

Registros de conexión fallidos

Cuando falla una conexión, Compute Engine crea una entrada de registro de auditoría. Un registro de conexión con errores es muy similar a una entrada de conexión exitosa, pero tiene las siguientes propiedades para indicar una conexión con errores.

Propiedad Valor
severity ERROR
status.code

Indica el código de error canónico de la API de Google que describe mejor el error. A continuación, se detallan los posibles códigos de error que pueden aparecer:

status.message Indica el mensaje legible para esta entrada.

Inhabilita el acceso interactivo a la consola en serie

Para inhabilitar el acceso a la consola en serie interactiva, debes cambiar los metadatos en la instancia o proyecto específico, o establecer una Política de la organización que inhabilite el acceso a la consola en serie interactiva a todas las instancias de VM para uno o más proyectos que forman parte de la organización.

Inhabilita la consola en serie interactiva en una instancia o proyecto en particular

Los propietarios y editores de proyectos, así como los usuarios a los que se les otorgó la función compute.instanceAdmin.v1 pueden inhabilitar el acceso a la consola en serie si cambian los metadatos de la instancia o el proyecto en particular. Al igual que para habilitar el acceso a la consola en serie, configura los metadatos de serial-port-enable en 0:

serial-port-enable=0

Por ejemplo, mediante el uso de la herramienta de línea de comandos de gcloud, puedes aplicar estos metadatos a una instancia específica de esta manera:

gcloud compute instances add-metadata [INSTANCE_NAME]  \
    --metadata=serial-port-enable=0

Para aplicar los metadatos al proyecto, ejecuta este comando:

gcloud compute project-info add-metadata --metadata=serial-port-enable=0

Inhabilita el acceso a la consola en serie interactiva a través de la política de la organización

Si se te otorgó la función orgpolicy.policyAdmin en la organización, puedes establecer una política de la organización que evite el acceso interactivo a la consola en serie, sin importar si su acceso interactivo está habilitado en el servidor de metadatos. Una vez establecida, la política anula efectivamente la clave de metadatos de serial-port-enable y ningún usuario de la organización o proyecto puede habilitar el acceso interactivo de consola en serie. De forma predeterminada, esta restricción se establece como falsa.

La restricción para inhabilitar el acceso a la consola en serie interactiva es esta:

compute.disableSerialPortAccess

Sigue las instrucciones a continuación sobre cómo establecer esta política en la organización. Después de configurarla, puedes otorgar exenciones por proyecto.

gcloud

Para establecer la política con la herramienta de línea de comandos de gcloud, ejecuta el comando resource-manager enable-enforce:

gcloud alpha resource-manager org-policies enable-enforce --organization [ORGANIZATION_ID] \
    compute.disableSerialPortAccess

en el que [ORGANIZATION_ID] es el ID numérico de la organización. Por ejemplo, 1759840282.

API

Para establecer una política en la API, realiza una solicitud POST a la siguiente URL:

 POST https://cloudresourcemanager.googleapis.com/v1beta1/[ORGANIZATION_NAME]:setOrgPolicy

en la que [ORGANIZATION_NAME] es el nombre de la organización. Por ejemplo, organizations/1759840282.

El cuerpo de la solicitud debe contener un objeto de policy con la siguiente restricción:

 "constraint": "constraints/compute.disableSerialPortAccess"

Por ejemplo:

 {
   "policy":
   {
     "booleanPolicy":
     {
       "enforced": true
     },
     "constraint": "constraints/compute.disableSerialPortAccess"
   }
 }

La política estará vigente de inmediato, por lo que cualquier proyecto de la organización dejará de permitir el acceso interactivo a la consola en serie.

Para deshabilitar la política de forma temporal, use el comando disable-enforce:

gcloud alpha resource-manager org-policies disable-enforce --organization [ORGANIZATION_ID] \
    compute.disableSerialPortAccess

Como alternativa, puedes realizar una solicitud a la API en la que el cuerpo de la solicitud establezca el parámetro enforced en false:

{
  "policy":
  {
    "booleanPolicy":
    {
      "enforced": false
    },
    "constraint": "constraints/compute.disableSerialPortAccess"
  }
}

Establece la política de la organización a nivel de proyecto

Puedes establecer la misma política de la organización por proyecto. Esto anula la configuración a nivel de la organización.

gcloud

Para desactivar la aplicación de esta política de un proyecto específico, ejecuta el comando:

gcloud alpha resource-manager org-policies disable-enforce --project [PROJECT_ID]
    compute.disableSerialPortAccess

en el que [PROJECT_ID] es el ID de proyecto para esta solicitud, como my-example-project.

Puedes activar la aplicación de esta política con el comando enable-enforce con los mismos valores.

API

En la API, realiza una solicitud POST a la siguiente URL a fin de habilitar el acceso interactivo de la consola en serie para el proyecto:

POST https://cloudresourcemanager.googleapis.com/v1beta1/projects/[PROJECT_ID]:setOrgPolicy

en la que [PROJECT_NAME] es el ID del proyecto.

El cuerpo de la solicitud debe contener un objeto de policy con la siguiente restricción:

"constraint": "constraints/compute.disableSerialPortAccess"

Por ejemplo:

{
  "policy":
  {
    "booleanPolicy":
    {
      "enforced": false
    },
    "constraint": "constraints/compute.disableSerialPortAccess"
  }
}

Sugerencias y trucos

  • Si tienes problemas para conectarte con un cliente SSH estándar, pero gcloud compute connect-to-serial-port se conecta con éxito, podría resultarte útil ejecutar con la opción de línea de comandos --dry-run para ver el comando SSH que habría ejecutado en tu nombre, y compara las opciones con el comando que usas.

  • Configuración de la velocidad de bits, también conocida como velocidad de transmisión: puedes establecer cualquier velocidad de bits que desees, como stty 9600, pero la función por lo general fuerza la velocidad efectiva a 115200 bps (~ 11.5 kB/s). Esto se debe a que muchas imágenes de SO de forma predeterminada tienen velocidades de bits lentas, como 9600 en la consola en serie, y se inician con lentitud.

  • Algunas imágenes de SO tienen valores predeterminados inconvenientes en el puerto en serie. Por ejemplo, en CentOS 7 se requiere stty icrnl para indicarle a la consola que haga lo correcto con la tecla Intro (que envía un CR, también conocido como ^M). La shell Bash puede ocultar esta información hasta que intentes establecer una contraseña y, luego, te preguntes por qué parece estar detenida en la solicitud de password:.

  • Algunas imágenes de SO tienen teclas de control de trabajo que están inhabilitadas de manera predeterminada si conectas una shell a un puerto de ciertas maneras. Algunos ejemplos de estas teclas incluyen ^Z y ^C. El comando setsid puede corregir esto. De lo contrario, si ves un mensaje job control is disabled in this shell, ten cuidado de no ejecutar comandos que deberás interrumpir.

  • Puede que te resulte útil indicarle al sistema el tamaño de la ventana que usas, para que Bash y los editores puedan administrarlo de forma correcta. De lo contrario, puedes experimentar un comportamiento de visualización extraño cuando Bash o los editores intentan manipular la pantalla en función de suposiciones incorrectas sobre el número de filas y columnas disponibles. Usa el comando stty rows Y cols X y stty -a para ver cuál es la configuración. Por ejemplo: stty rows 60 cols 120 (si la ventana es de 120 caracteres por 60 líneas).

  • Si te conectas con SSH desde la máquina A a la máquina B y, luego, a la máquina C (y así sucesivamente), creas una sesión SSH anidada y deseas usar comandos ~, como desconectar o enviar una señal de interrupción de serie, necesitas agregar suficientes caracteres adicionales al comando para llegar al cliente SSH correcto. El cliente SSH interpretará un comando que sigue a un único ~ en la máquina A; el cliente en la máquina B interpretará dos ~ consecutivos (ENTER~~) y así sucesivamente. Solo debes presionar ENTER una vez, porque eso se pasa hasta el destino SSH más interno. Esto es verdadero para cualquier uso de clientes SSH que proporcionen la función escape ~.

    Si no recuerdas cuántos caracteres ~ necesitas, presiona la tecla ENTER y, luego, escribe los caracteres uno a la vez hasta que la instancia repita el . Esto indica que llegaste al final de la cadena y ahora sabes que para enviar un comando ~ al cliente SSH más anidado, necesitas un ~ menos que el número que escribiste.

Opciones avanzadas

Controla conexiones máximas

Puedes establecer la propiedad max-connections para controlar cuántas conexiones simultáneas se pueden hacer a este puerto en serie a la vez. El número predeterminado y máximo de conexiones es 5. Por ejemplo:

gcloud compute connect-to-serial-port [INSTANCE_NAME] --port [PORT_NUMBER] --extra-args max-connections=3
ssh -i [PRIVATE_SSH_KEY_FILE] -p 9600 [PROJECT_ID].[ZONE].[INSTANCE_NAME].[USERNAME].max-connections=3@ssh-serialport.googleapis.com

Establece opciones de repetición

De forma predeterminada, cada vez que te conectes a la consola en serie, recibirás una repetición de las últimas 10 líneas de datos, independientemente de que otro cliente SSH haya visto las últimas 10 líneas. Puedes cambiar esta configuración y controlar cuántas líneas, y cuáles, se muestran cuando se proporcionan las siguientes opciones:

  • replay-lines=N: establece N en el número de líneas que deseas repetir. Por ejemplo, si N era 50, se incluyen las últimas 50 líneas del resultado de la consola.
  • replay-bytes=N: repite los N bytes más recientes. También puedes establecer N en new, que repite todos los resultados que aún no se enviaron a ningún cliente.
  • replay-from=N: repite el resultado a partir de un índice de bytes absoluto que proporciones. Puedes obtener el índice de bytes actual del resultado de la consola en serie mediante una solicitud getSerialPortOutput. Si estableces replay-from, se ignoran todas las demás opciones de repetición.

Con la herramienta de línea de comandos de gcloud, agrega lo siguiente al comando connect-to-serial-port, en el que N es la cantidad especificada de líneas (o bytes o índice de bytes absolutos, según la opción de repetición que selecciones):

--extra-args replay-lines=N

Si usas un cliente SSH de terceros, proporciona esta opción en tu comando SSH:

ssh -i [PRIVATE_SSH_KEY_FILE] -p 9600 \
  myproject.us-central1-f.example-instance.jane.port=3.replay-lines=N@ssh-serialport.googleapis.com

También puedes usar una combinación de estas opciones. Por ejemplo:

replay-lines=N y replay-bytes=new

Repite el número especificado de líneas O todos los resultados que no se enviaron previamente a ningún cliente, el que sea mayor. El primer cliente que se conecte con esta combinación de marcadores verá el resultado que se envió al puerto en serie, y los clientes que se conecten posteriormente solo verán las últimas N líneas. Ejemplos:

gcloud compute connect-to-serial-port [INSTANCE_NAME] --port [PORT_NUMBER] --extra-args replay-lines=N,replay-bytes=new
ssh -i [PRIVATE_SSH_KEY_FILE] -p 9600 [PROJECT_ID].[ZONE].[INSTANCE_NAME].[USERNAME].replay-lines=N.replay-bytes=new@ssh-serialport.googleapis.com
replay-lines=N y replay-bytes=M

Repite las líneas hasta el número de líneas o bytes descritos por estas marcas, pero sin superarlo, lo que sea menor. Esta opción no repetirá más de N o M bytes.

gcloud compute connect-to-serial-port [INSTANCE_NAME] --port [PORT_NUMBER] --extra-args replay-lines=N,replay-bytes=M
ssh -i [PRIVATE_SSH_KEY_FILE] -p 9600 [PROJECT_ID].[ZONE].[INSTANCE_NAME].[USERNAME].replay-lines=N.replay-bytes=M@ssh-serialport.googleapis.com

Maneja los resultados descartados

El resultado 1 MiB más reciente para cada puerto en serie siempre está disponible y, en general, tu cliente SSH no debe perder ningún resultado del puerto en serie. Si, por algún motivo, tu cliente SSH deja de aceptar el resultado durante un período, pero no se desconecta y se produce más de 1 MiB de datos nuevos, es posible que tu cliente SSH pierda algún resultado. En estos casos, cuando el cliente no acepta datos lo suficientemente rápido para mantenerse al día con el resultado en el puerto de consola en serie, puedes configurar la propiedad de on-dropped-output para determinar cómo se comporta la consola.

Establece cualquiera de las siguientes opciones aplicables con esta propiedad:

  • insert-stderr-note: inserta una nota en el stderr del cliente SSH que indique que se descartó el resultado. Esta es la opción predeterminada.
  • ignore: descarta el resultado de forma silenciosa y no realiza ninguna acción.
  • disconnect: finaliza la conexión.

Por ejemplo:

gcloud compute connect-to-serial-port [INSTANCE_NAME] --port [PORT_NUMBER] --extra-args on-dropped-output=ignore
ssh -i [PRIVATE_SSH_KEY_FILE] -p 9600 [PROJECT_ID].[ZONE].[INSTANCE_NAME].[USERNAME].on-dropped-output=ignore@ssh-serialport.googleapis.com

Habilita la desconexión con los comandos de salida o cierre de sesión

Puedes habilitar la desconexión cuando sales o cierras sesión si configuras la propiedad on-dtr-low para disconnect cuando te conectas a la consola en serie.

En la herramienta de línea de comandos de gcloud, agrega lo siguiente al comando connect-to-serial-port:

--extra-args on-dtr-low=disconnect

Si usas un cliente SSH de terceros, proporciona esta opción en tu comando SSH:

ssh -i [PRIVATE_SSH_KEY_FILE] -p 9600 \
  myproject.us-central1-f.example-instance.jane.port=3.on-dtr-low=disconnect@ssh-serialport.googleapis.com

Si habilitas esta opción, es posible que tu instancia se desconecte una o más veces cuando la reinicies, ya que el sistema operativo restablece los puertos en serie cuando inicia.

La configuración predeterminada para esta opción es none, en la que no ocurre nada cuando cambia la línea DTR. Si cambias esto a ninguno, puedes reiniciar la instancia sin desconectarte de la consola en serie, pero la consola no se desconectará a través de medios normales, como los comandos de exit o logout, o combinaciones de teclas normales, como Ctrl+d.

Próximos pasos

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Documentación de Compute Engine