与串行控制台进行交互

此页面介绍如何启用对实例串行控制台的交互式访问,以调试启动和网络问题、排查实例故障、与 GRand Unified Bootloader (GRUB) 交互以及执行其他问题排查任务。

虚拟机实例具有四个虚拟串行端口。与串行端口交互类似于使用终端窗口,因为输入和输出完全在文本模式下进行,并且没有图形界面或鼠标支持。实例的操作系统、BIOS 以及其他系统级实体通常将输出写入串行端口,并且可以接受输入,例如命令或提示的答案。通常,这些系统级实体使用第一个串行端口(端口 1),串行端口 1 通常称为串行控制台。

如果您仅需查看串行端口输出而不向串行控制台发出任何命令,则可以调用 getSerialPortOutput 方法或使用 Stackdriver 读取您的实例已写入其串行端口的信息;具体请参阅查看串行端口日志。但是,如果您在通过 SSH 访问实例时遇到问题,或者需要对未完全启动的实例进行问题排查,您可以启用对串行控制台的交互式访问,从而连接到您实例的任何串行端口并与其交互。例如,您可以通过串行端口直接运行命令并响应提示。

准备工作

执行此任务所需的权限

要执行此任务,您必须拥有以下权限

  • 对实例的 compute.instances.setMetadata 权限(如果在特定实例上启用交互式访问)
  • 对项目的 compute.projects.setCommonInstanceMetadata 权限(如果在整个项目中启用交互式访问)

在串行控制台上启用交互式访问

为单个虚拟机实例或整个项目启用交互式串行控制台访问。

启用对项目的访问

对某个项目启用交互式串行控制台访问即启用对属于该项目的所有虚拟机实例的访问。

默认情况下,停用交互式串行端口访问。您可以通过将 serial-port-enable 键设置为 0 而不是 1 来明确停用它。无论哪种情况下,任何针对每个实例的设置都将替换项目级层的设置或默认设置。

Console

  1. 转到元数据页面
  2. 点击修改以修改元数据条目。
  3. 添加一个新条目,其中键为 serial-port-enable,值为 1添加串行控制台元数据键的屏幕截图
  4. 保存更改。

gcloud

使用 project-info add-metadata 命令。例如:

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

API

在 API 中,为 serial-port-enable 键提供值 1,向 projects().setCommonInstanceMetadata 方法发出请求:

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

启用对虚拟机实例的访问

为特定实例启用交互式串行控制台访问。针对每个实例的设置(如果存在)会替换任何项目级层的设置。即使在项目级层启用了访问,也可以通过将 serial-port-enable 设置为 0 而不是 1 来停用对特定实例的访问。同样,即使明确或默认停用了对项目的访问,也可以启用对一个或多个实例的访问。

Console

  1. 转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

  2. 点击要为其启用访问权限的实例。
  3. 点击修改
  4. 远程访问部分下,勾选允许连接到串行端口复选框。
  5. 保存更改。

gcloud

gcloud 命令行工具中,使用 instances add-metadata 命令:

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

API

使用 serial-port-enable 键和值 1instances().setMetadata 方法发出请求:

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

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

连接到串行控制台

在启用对实例串行控制台的交互式访问后,您可以使用 Google Cloud Platform Console、gcloud 命令行工具或第三方 SSH 客户端连接到串行控制台。

串行控制台使用 SSH 密钥对用户进行身份验证。具体而言,您必须将公共 SSH 密钥添加到项目或实例元数据,并将私钥存储在您要从其中进行连接的本地机器上。gcloud 工具和 Google Cloud Platform Console 将自动为您将 SSH 密钥添加到项目中。如果您使用的是第三方客户端,则可能需要手动添加 SSH 密钥。

Console

  1. 转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

  2. 点击您要连接的实例。
  3. 远程访问下,点击连接到串行控制台以在默认端口(端口 1)上进行连接。
  4. 如果您要连接到其他串行端口,请点击连接到串行控制台按钮旁边的向下箭头,然后相应地更改端口号。
  5. 对于 Windows 实例,请点击该按钮旁边的下拉菜单,然后连接到端口 2 以访问串行控制台。

gcloud

gcloud 命令行工具中使用 gcloud compute connect-to-serial-port 子命令进行连接。例如:

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

其中,[INSTANCE_NAME] 是您要访问的串行控制台的实例的名称。

默认情况下,connect-to-serial-port 命令连接到串行控制台的端口 1。如果要连接到 Windows 虚拟机实例,请改为连接到端口 2:

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

要连接到任何其他端口,请使用 --port 标志来提供其他端口号。您可以提供从 1 到 4 的端口号,包括 1 和 4。如需详细了解端口号,请参阅了解串行端口编号

其他 SSH 客户端

您可以使用其他第三方 SSH 客户端连接到实例的串行控制台,只要这些客户端允许您连接到 TCP 端口 9600 即可。

例如,以下 SSH 命令在项目 ID 为 myproject 的项目中以用户名 jane 连接到名为 example-instance 的实例的默认串行端口 (1)。该实例位于地区 us-central1-f

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

具体地说,您可以使用以下登录和地址信息连接到实例的串行控制台:

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

其中:

  • [PROJECT_ID] 是此实例的项目 ID。
  • [ZONE] 是实例的地区。
  • [INSTANCE_NAME] 是实例的名称。
  • [USERNAME] 是您用于连接实例的用户名,通常是本地机器上的用户名。
  • [OPTIONS] 是您可以为此连接指定的其他选项。例如,您可以指定某个串行端口并指定下面的任何高级选项。端口号可以是 1 到 4,包括 1 和 4。如需详细了解端口号,请参阅了解串行端口编号。如果省略该选项,您将连接到串行端口 1。

如果要连接到 Windows 虚拟机实例,请使用以下命令通过端口 2 进行连接:

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

如果您在使用第三方 SSH 客户端进行连接时遇到问题,可以运行 gcloud compute connect-to-serial-port(包含 --dry-run 命令行选项)以查看代表您运行的 SSH 命令,并将选项与您正在使用的命令进行比较。

建立安全连接

当您使用 gcloud 命令行工具之外的第三方 SSH 客户端时,可以通过检查 Google 的串行端口服务器 SSH 密钥来确保您免受假冒或中间人攻击。按照以下说明设置系统以检查服务器 SSH 密钥:

  1. 下载 Google 的串行端口服务器 SSH 密钥
  2. 打开您的已知主机文件,该文件通常位于 ~/.ssh/known_hosts
  3. 添加服务器 SSH 密钥的内容,将 ssh-serialport.googleapis.com 添加到密钥前面。例如,如果服务器密钥包含 ssh-rsa AAAAB3NzaC1yc... 行,那么 ~/.ssh/known_hosts 应该有以下一行内容:

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

出于安全考虑,Google 有时可能会更改 Google 串行端口服务器 SSH 密钥。如果您的客户端未能对服务器密钥进行身份验证,请立即中止连接尝试并按照上述说明下载新的 Google 串行端口服务器 SSH 密钥。

如果您在更新主机密钥后还是会从客户端收到主机身份验证错误,请停止尝试连接到串行端口并与 Google 支持团队联系。请勿在主机身份验证失败的连接上提供任何凭据。

与串行控制台断开连接

要与串行控制台断开连接,请执行以下操作:

  1. ENTER 键。
  2. 输入 ~.(波浪线,后跟英文句点)。

您可以通过输入 ~? 或者查看 SSH 的手册页面来发现其他命令:

man ssh

请勿尝试使用以下任何方法断开连接:

  • CTRL+ALT+DELETE 组合键或其他类似组合键。这种方法不起作用,因为串行控制台无法识别 PC 键盘组合。

  • exitlogout 命令也不起作用,因为客机无法感知任何网络或调制解调器连接。使用此命令会导致控制台关闭然后重新打开,并且仍然连接到会话。如果您要为会话启用 exitlogout 命令,可以通过设置 on-dtr-low 选项来启用。

使用登录提示连接到串行控制台

如果您尝试排查完全启动的实例的问题,或者尝试排查实例启动单用户模式后发生的问题,则系统在您尝试访问串行控制台时可能会提示您输入登录信息。

默认情况下,Google 提供的系统映像未配置为允许本地用户使用密码登录。如果您的实例正在运行预先配置了串行端口登录的映像,您需要在虚拟机实例上设置本地密码,以便在出现提示时登录到串行控制台。

设置本地密码

以下说明介绍如何在虚拟机实例上为用户设置本地密码,以便用户可以使用指定的密码登录该实例的串行控制台。

  1. 连接到实例:

    gcloud compute ssh [INSTANCE_NAME]
    
  2. 在实例上,使用以下命令创建本地密码。这样做将为您当前登录的用户设置密码。

    sudo passwd `whoami`
    
  3. 按照提示创建密码。

  4. 接下来,退出实例并连接到串行控制台

  5. 出现提示时输入您的登录信息。

在其他串行端口上设置登录

在大多数 Linux 操作系统上,端口 1 默认启用登录提示。但是,端口 1 通常会因记录打印到端口的数据和其他信息而不堪重负。您也可以选择通过在您的实例上执行以下命令之一,在其他端口上启用登录提示,例如端口 2 (ttyS1)。您可以在了解串行端口编号中查看实例的可用端口列表。

下表列出了预配置有串行控制台登录和默认端口的映像。

操作系统 默认情况下具有登录提示的端口 服务管理
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 不适用

要在其他串行端口上启用登录提示,请按照以下说明进行操作。

systemd

对于使用 systemd 的 Linux 操作系统:

  • 暂时启用该服务,直到下次重新启动:

    sudo systemctl start serial-getty@ttyS1.service
    
  • 从下次重新启动开始永久启用该服务:

    sudo systemctl enable serial-getty@ttyS1.service
    

upstart

对于使用 upstart 的 Linux 操作系统:

  1. 通过复制和修改现有的 ttyS0.conf 文件创建新的 /etc/init/ttyS1.conf 文件以反映 ttyS1。例如:

    • 在 Ubuntu 14.04 上执行以下命令:

      sudo sh -c "sed -e s/ttyS0/ttyS1/g < /etc/init/ttyS0.conf > /etc/init/ttyS1.conf"
      
    • 在 RHEL 6.8 和 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. 在不重启的情况下在 ttyS1 上启动登录提示,请执行以下命令:

    sudo start ttyS1
    

sysvinit

对于使用 sysvinit 的 Linux 操作系统,请执行以下命令:

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

了解串行端口编号

每个虚拟机实例都有四个串行端口。为了与 getSerialPortOutput API 保持一致,各个端口的编号为 1 到 4。Linux 和其他类似系统将其串行端口编号为 0 到 3。例如,在许多操作系统映像上,相应的设备是 /dev/ttyS0/dev/ttyS3。Windows 将串行端口编号为 COM1COM4。要连接到 Windows 视作 COM3 而 Linux 视作 ttyS2 的端口,您需要指定端口 3。下表可以帮助您确定要连接的端口。

虚拟机实例串行端口 标准 Linux 串行端口 Windows COM 端口
1 /dev/ttyS0 COM1
2 /dev/ttyS1 COM2
3 /dev/ttyS2 COM3
4 /dev/ttyS3 COM4

请注意,许多 Linux 映像使用端口 1 (/dev/ttyS0) 来记录来自内核和系统程序的消息。

发送串行中断

通过 Magic SysRq 键功能,无论系统的状态如何,您都可以执行低级任务。例如,您可以使用 Magic SysRq 键功能同步文件系统、重新启动实例、终止进程、卸载文件系统等。

要使用模拟串行中断发送 Magic SysRq 命令,请执行以下操作:

  1. ENTER 键。
  2. 输入 ~B(波浪线,后跟大写 B)。
  3. 输入所需的 Magic SysRq 命令。

查看串行控制台审核日志

Compute Engine 提供审核日志以跟踪与实例的串行控制台连接和断开连接的用户。要查看日志,您需要具有日志查看器的权限,或者具有项目查看者或编辑者身份。

  1. 转到 GCP Console 中的“日志”页面。

    转到“日志”页面

  2. 展开下拉菜单,然后选择 GCE VM Instance
  3. 在搜索栏中,输入 ssh-serialport.googleapis.com 并按 Enter 键。
  4. 系统将显示描述串行控制台连接和断开连接的审核日志列表。展开任一条目可以了解详情:

    串行控制台审核日志的屏幕截图

对于任何审核日志,您可以执行以下操作:

  1. 展开 protoPayload 属性。
  2. 查找 methodName 以查看此日志对应的活动(连接或断开连接请求)。例如,如果此日志跟踪与串行控制台断开连接的操作,则方法名称将显示为 "google.ssh-serialport.v1.disconnect"。类似地,连接日志会显示为 "google.ssh-serialport.v1.connect"。串行控制台上每个会话开始和结束时会记录审计日志条目。

不同的日志类型有不同的审核日志属性。例如,与连接相关的审核日志将具有针对连接日志的一些属性,而断开连接的审核日志将具有自己的一组属性。某些审核日志属性同时适用于这两种日志类型。

所有串行控制台日志

属性
requestMetadata.callerIp 发起连接的 IP 地址和端口号。
serviceName ssh-serialport.googleapis.com
resourceName 包含项目 ID、地区、实例名称和串行端口号的字符串,指示与其相关的串行控制台。 例如,projects/myproject/zones/us-east1-a/instances/example-instance/SerialPort/2 是端口号 2,对于实例 example-instance,也称为 COM2 或 /dev/ttyS1。
resource.labels 标识实例 ID、地区和项目 ID 的属性。
timestamp 指示会话开始或结束时间的时间戳。
severity NOTICE
operation.id 唯一标识会话的 ID 字符串;您可以使用该属性将断开连接条目与相应的连接条目相关联。
operation.producer ssh-serialport.googleapis.com

连接日志

属性
methodName google.ssh-serialport.v1.connect
status.message Connection succeeded.
request.serialConsoleOptions 为此请求指定的任何选项,包括串行端口号。
request.@type type.googleapis.com/google.compute.SerialConsoleSessionBegin
request.username 为此请求指定的用户名。该属性用于选择要匹配的公钥。
operation.first true
status.code 对于成功的连接请求,status.code 值为 google.rpc.Code.OK 表示操作成功完成且没有任何错误。由于此属性的枚举值为 0,因此在本例中不会显示 status.code 属性。但是,检查 status.code 值是否为 google.rpc.Code.OK 的任何代码都将按预期运行。

断开连接日志

属性
methodName google.ssh-serialport.v1.disconnect
response.duration 会话持续的时间,以秒为单位。
response.@type type.googleapis.com/google.compute.SerialConsoleSessionEnd
operation.last true

失败连接日志

连接失败时,Compute Engine 会创建审核日志条目。失败的连接日志看起来与成功的连接条目非常相似,但具有以下指示连接失败的属性。

属性
severity ERROR
status.code

能最好地描述错误的 Google API 标准错误代码。以下是可能出现的错误代码:

status.message 此条目的易懂消息。

停用交互式串行控制台访问

可以通过以下两种方式停用交互式串行控制台访问:更改特定实例或项目上的元数据;设置组织政策,停用对组织中一个或多个项目的所有虚拟机实例的交互式串行控制台访问。

在特定实例或项目上停用交互式串行控制台

项目所有者和编辑者以及已被授予 compute.instanceAdmin.v1 角色的用户可以通过更改特定实例或项目上的元数据来停用对串行控制台的访问。类似于启用串行控制台访问,将 serial-port-enable 元数据设置为 0

serial-port-enable=0

例如,使用 gcloud 命令行工具,您可以将此元数据应用于特定实例,如下所示:

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

要将元数据应用于项目,请执行以下命令:

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

通过组织政策停用交互式串行控制台访问

如果您已在组织上被授予 orgpolicy.policyAdmin 角色,则无论元数据服务器是否启用了交互式串行控制台访问,您都可以设置组织政策来阻止交互式串行控制台访问。设置后,该政策将有效地替换 serial-port-enable 元数据键,组织或项目的任何用户都无法启用交互式串行控制台访问。默认情况下,此限制设置为 false。

停用交互式串行控制台访问的限制如下:

compute.disableSerialPortAccess

按照以下有关如何在组织上设置此政策的说明执行操作。设置政策后,您可以基于每个项目授予豁免项。

gcloud

要使用 gcloud 命令行工具设置政策,请运行 resource-manager enable-enforce 命令:

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

其中 [ORGANIZATION_ID] 是组织数字 ID。例如,1759840282

API

要在 API 中设置政策,请对以下网址发出 POST 请求:

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

其中 [ORGANIZATION_NAME]组织名称。例如,organizations/1759840282

请求正文应包含带有以下限制的 policy 对象:

 "constraint": "constraints/compute.disableSerialPortAccess"

例如:

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

该政策立即生效,因此组织下的所有项目都将停止允许对串行控制台的交互式访问。

要暂时停用该政策,请使用 disable-enforce 命令:

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

或者,您可以发出 API 请求,其中请求正文将 enforced 参数设置为 false

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

设置项目级组织政策

您可以基于每个项目设置相同的组织政策。这将替换组织级设置。

gcloud

要为特定项目关闭此政策的强制执行,请执行以下操作:

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

其中 [PROJECT_ID] 是此请求的项目 ID,例如 my-example-project

您可以使用具有相同值的 enable-enforce 命令打开对此政策的强制执行。

API

在 API 中,对以下网址发出 POST 请求以为项目启用交互式串行控制台访问:

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

其中 [PROJECT_NAME] 是项目 ID。

请求正文应包含带有以下限制的 policy 对象:

"constraint": "constraints/compute.disableSerialPortAccess"

例如:

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

提示和技巧

  • 如果您在使用标准 SSH 客户端进行连接时遇到问题,但 gcloud compute connect-to-serial-port 成功连接,建议您运行带有 --dry-run 命令行选项的 gcloud compute connect-to-serial-port 以查看本应代表您运行的 SSH 命令,并将选项与您正在使用的命令进行比较。

  • 设置比特率(也称为波特率):您可以设置任何所需的比特率,例如 stty 9600,但该功能通常会将有效速率强制设置为 115200 bps(约 11.5kB/秒)。这是因为许多操作系统映像默认会降低比特率(例如串行控制台上为 9600),并且会缓慢启动。

  • 某些操作系统映像的串行端口上的默认值不合适。例如,在 CentOS 7 上,需要 stty icrnl 告知控制台使用 Enter 键(该键发送 CR,也就是 ^M)来执行正确的操作。bash shell 可能会对其进行掩盖,当您要设置密码,却发现操作卡在了 password: 提示符处时才会发现。

  • 某些操作系统映像具有作业控制键,如果您以某种方式将 shell 连接到端口,则默认情况下会停用这些键。这些键的示例包括 ^Z^Csetsid 命令可以解决这个问题。否则,如果您看到了 job control is disabled in this shell 消息,请注意不要运行需要中断的命令。

  • 建议告知系统您正在使用的窗口大小,以便 bash 和编辑器可以恰当地管理该窗口。否则,您可能会遇到奇怪的显示行为,因为 bash 或编辑器会尝试根据对可用行数和列数的错误假设来控制显示。使用 stty rows Y cols X 命令和 stty -a 来查看设置内容。例如:stty rows 60 cols 120(如果您的窗口是 120 个字符乘 60 行)。

  • 如果您使用 SSH 从机器 A 连接到机器 B,然后连接到机器 C(依此类推),从而创建嵌套的 SSH 会话,并且您希望使用 ~ 命令来执行断开连接或发送串行中断信号等操作,则需要在命令中额外添加足够的 ~ 字符才能到达正确的 SSH 客户端。跟在单个 ~ 后面的命令将由机器 A 上的 SSH 客户端解释;两个连续的 ~ (ENTER~~) 将由机器 B 上的客户端解释,依此类推。您只需要按一次 ENTER,因为它会一直传递到最里层的 SSH 目标。对于提供 ~ 转义功能的 SSH 客户端的任何使用情况都是如此。

    如果您忘记了所需的 ~ 字符数,请按 ENTER 键,然后逐个输入 ~ 字符,直到实例回显 ~。这表明您已到达链的末端,并且您现在知道如果要向嵌套程度最高的 SSH 客户端发送 ~ 命令,您需要比您输入数量少一个的 ~

高级选项

控制最大连接数

您可以设置 max-connections 属性以控制一次可以对此串行端口进行的并发连接数。默认和最大连接数为 5。例如:

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

设置重放选项

默认情况下,每次连接到串行控制台时,无论其他 SSH 客户端是否已看到最后 10 行,您都将收到最后 10 行数据的重放。您可以通过提供以下选项来更改此设置并控制返回多少行和返回哪些行:

  • replay-lines=N:将 N 设置为要重放的行数。例如,如果 N 为 50,则包括控制台输出的最后 50 行。
  • replay-bytes=N:重放最近的 N 个字节。您还可以将 N 设置为 new,以重放尚未发送到任何客户端的所有输出。
  • replay-from=N:从您提供的绝对字节索引开始重放输出。您可以通过发出 getSerialPortOutput 请求来获取串行控制台输出的当前字节索引。如果您设置 replay-from,所有其他重放选项会被忽略。

使用 gcloud 命令行工具,将以下内容附加到 connect-to-serial-port 命令,其中 N 是指定的行数(或字节数或绝对字节索引,具体取决于您选择的重放选项):

--extra-args replay-lines=N

如果您使用的是第三方 SSH 客户端,请在 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

您还可以使用这些选项的组合。例如:

replay-lines=Nreplay-bytes=new

重放以下二者中较大的行数:指定的行数,或之前未发送到任何客户端的所有输出。第一个连接此标志组合的客户端将看到已发送到串行端口的所有输出,后续连接的客户端将只看到最后 N 行。示例:

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=Nreplay-bytes=M

重放的行数不超过以下二者之间的较小值:指定的行数 (N),或者这些标志所描述的字节数。此选项不会重放超过 N 行或 M 个字节。

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

处理已丢弃的输出

每个串行端口的最新 1 MiB 输出始终可用,且通常您的 SSH 客户端应该不会从串行端口丢失任何输出。如果由于某种原因,您的 SSH 客户端在一段时间内停止接受输出但未断开连接,并且产生的新数据超过 1 MiB,则您的 SSH 客户端可能会丢失某些输出。在这些情况下,如果您的 SSH 客户端未足够快地接受数据以跟上串行控制台端口上的输出,您可以设置 on-dropped-output 属性以确定控制台的行为方式。

使用此属性设置以下任何适用选项:

  • insert-stderr-note:在 SSH 客户端的 stderr 上插入一条注释,指示输出已被丢弃。这是默认选项。
  • ignore:静默地丢弃输出并且不执行任何操作。
  • disconnect:终止连接。

例如:

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

启用通过 exit 或 logout 命令断开连接

当您连接到串行控制台时,您可以通过将 on-dtr-low 属性设置为 disconnect 来启用通过 exit 或 logout 命令断开连接。

gcloud 命令行工具上,将以下内容附加到 connect-to-serial-port 命令:

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

如果您使用的是第三方 SSH 客户端,请在 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

启用此选项可能会导致实例在您重新启动实例时断开连接一次或多次,因为操作系统会在启动时重置串行端口。

此选项的默认设置为 none,DTR 行更改时不会执行任何操作。如果将此选项更改为 none,您可以在不断开与串行控制台连接的情况下重新启动实例,但控制台不会通过常规方式(例如 exitlogout 命令)或常规组合键(如 Ctrl+d)断开连接。

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Compute Engine 文档