与串行控制台进行交互

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

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

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

准备工作

执行此任务所需的权限

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

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

启用对串行控制台的交互式访问权限

您可以针对个别虚拟机实例或整个项目启用交互式串行控制台访问权限。

针对项目启用访问权限

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

默认情况下,交互式串行端口访问权限处于停用状态。您可以明确停用这项访问权限,只需将 serial-port-enable 键设置为 0(而非 1)即可。无论哪种情况下,任何针对个别实例的设置都将替换项目级层的设置或默认设置。

控制台

  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 中提供值为 1serial-port-enable 键,向 projects().setCommonInstanceMetadata 方法发出请求:

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

针对虚拟机实例启用访问权限

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

控制台

  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 键和 1 值向 instances().setMetadata 方法发出请求:

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"
  }
 ]
}

连接到串行控制台

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

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

控制台

  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 客户端进行连接时遇到问题,可以运行带有 --dry-run 命令行选项的 gcloud compute connect-to-serial-port 命令,以查看代表您运行的 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 文件并按照 ttyS1 修改此文件,以创建新的 /etc/init/ttyS1.conf 文件。例如:

    • 在 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 会提供审核日志,便于您跟踪已与实例的串行控制台连接和断开连接的用户。如需查看日志,您必须具有日志查看器的权限,或者具有项目的 Viewer 或 Editor 身份。

  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 是实例 example-instance 的端口号 2,也称为 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 针对此条目的人类可读消息。

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

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

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

项目 Owner 和 Editor 以及已被授予 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 命令行选项的 命令,以查看代表您运行的 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 客户端会解释单个 ~ 后面的命令;机器 B 上的客户端则解释连续两个 ~ (ENTER~~)后面的命令,依此类推。您只需要按一次 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

重放最多(且不超过)这些标志所描述的行数或字节数(以较小者为准)。此选项重放的行数或字节数不会超过 NM

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 文档