與序列主控台互動

本頁面說明如何啟用對執行個體序列主控台的互動式存取權以偵錯啟動與網路問題、疑難排解發生異常的執行個體、與 GRand Unified Bootloader (GRUB) 互動,及執行其他疑難排解工作。

虛擬機器執行個體有四個虛擬序列埠。與序列埠的互動和使用終端機視窗類似,因為輸入與輸出完全位於文字模式下,且沒有圖形介面或滑鼠支援。執行個體的作業系統、BIOS 及其他系統層級實體通常會將輸出內容寫入序列埠,且可接受例如指令或提示的回答等輸入。這些系統層級實體一般會使用第一個序列埠 (通訊埠 1) 且序列埠 1 通常稱為序列主控台。

如果您只是要查看序列埠輸出內容,不對序列主控台發出任何指令,則可呼叫 getSerialPortOutput 方法或使用 Stackdriver,讀取執行個體寫入其序列埠的資訊;詳情請參閱查看序列埠記錄。不過,如果您透過安全殼層存取執行個體時遇到問題,或需要排解執行個體未完全啟動的問題,可以啟用對序列主控台的互動式存取權,這項權限可讓您連線至執行個體的任何序列埠並與之互動。例如,您可以在序列埠中直接執行指令並回應提示。

事前準備

這項工作需要的權限

如要執行這項工作,您必須具備以下權限

  • 執行個體的 compute.instances.setMetadata 權限 (如果在特定執行個體上啟用互動式存取權)
  • 專案的 compute.projects.setCommonInstanceMetadata 權限 (如果跨專案啟用互動式存取權)

啟用對序列主控台的互動式存取權

請針對個別 VM 執行個體或整個專案啟用互動式序列主控台存取權。

針對專案啟用存取權

如果您針對專案啟用互動式序列主控台存取權,就會一併針對屬於該專案的所有 VM 執行個體啟用存取權。

根據預設,互動式序列埠存取權為停用。您可以將 serial-port-enable 金鑰設為 0 而非 1 來明確停用這項存取權。在這兩種情況下,任何個別執行個體設定都會覆寫專案層級設定或預設設定。

主控台

  1. 前往「Metadata」(中繼資料) 頁面
  2. 按一下 [Edit] (編輯),編輯中繼資料項目。
  3. 新增鍵為 serial-port-enable 且值為 1 的項目。新增序列主控台中繼資料鍵的螢幕擷取畫面
  4. 儲存變更。

gcloud

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

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

API

透過 API 向 projects().setCommonInstanceMetadata 方法發出要求,鍵與值分別為 serial-port-enable1

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

針對 VM 執行個體啟用存取權

您可以針對特定執行個體啟用互動式序列主控台存取權。如果有個別執行個體設定,該設定會覆寫任何專案層級的設定。即使專案層級已啟用此存取權,您也可將 serial-port-enable 設定為 0 (而非 1),針對特定執行個體停用存取權。同樣地,即使專案已由您明確停用或預設停用存取權,您也還是可以針對一或多個執行個體啟用存取權。

主控台

  1. 前往「VM instances」(VM 執行個體) 頁面。

    前往「VM instances」(VM 執行個體) 頁面

  2. 按一下您要為其啟用存取權的執行個體。
  3. 按一下 [Edit] (編輯)
  4. 在「Remote access」(遠端存取) 區段下,勾選 [Enable connecting to serial ports] (啟用序列埠連線) 核取方塊。
  5. 儲存變更。

gcloud

透過 gcloud 指令列工具使用 instances add-metadata 指令:

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

API

instances().setMetadata 方法發出請求,鍵與值分別為 serial-port-enable1

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 指令列工具或第三方安全殼層用戶端連線至此序列主控台。

序列主控台會使用安全殼層金鑰驗證使用者的身分。具體而言,您必須將公開安全殼層金鑰新增至專案或執行個體中繼資料,並將私密金鑰儲存在您想連線的來源本機電腦中。gcloud 工具和 Google Cloud Platform Console 會自動為您將安全殼層金鑰新增至專案。如果您使用第三方用戶端,可能需要手動新增安全殼層金鑰。

主控台

  1. 前往「VM instances」(VM 執行個體) 頁面。

    前往「VM instances」(VM 執行個體) 頁面

  2. 按一下您要連線的目標執行個體。
  3. 按一下「Remote access」(遠端存取) 底下的 [Connect to serial console] (連線至序列主控台),連線至預設通訊埠 (通訊埠 1)。
  4. 如果您想連線至其他序列埠,請按一下 [Connect to serial console] (連線至序列主控台) 按鈕旁的向下箭頭,變更通訊埠編號。
  5. 若使用 Windows 執行個體,請將按鈕旁的下拉式選單往下拉並連線至「Port 2」(通訊埠 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 VM 執行個體,請改為連線至通訊埠 2:

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

欲連接至其他通訊埠,請使用 --port 旗標提供不同的通訊埠編號。您可以提供從 1 到 4 (包括 1 和 4) 的通訊埠編號。 如要進一步瞭解通訊埠編號,請參閱瞭解序列埠編號

其他安全殼層用戶端

只要用戶端允許您連線至 TCP 通訊埠 9600,您就可以使用其他第三方安全殼層用戶端連線至執行個體的序列主控台。

舉例來說,下列安全殼層指令將連線的預設序列埠 (1) 之執行個體名稱為 example-instance、使用者名稱為 jane,所屬之專案的專案 ID 為 myproject,該執行個體則位於區域 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 VM 執行個體,請使用下列指令透過序列埠 2 連線:

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

如果您在使用第三方安全殼層用戶端連線時遇到問題,可以使用 --dry-run 指令列選項執行 gcloud compute connect-to-serial-port,以查看代表您執行的安全殼層指令,並將選項與您使用的指令進行比較。

設定安全連線

使用非 gcloud 指令列工具的第三方安全殼層用戶端時,您可檢查 Google 的序列埠伺服器安全殼層金鑰,確保您不會受到冒用身分或攔截式攻擊。按照下列操作說明設定系統,以檢查伺服器安全殼層金鑰:

  1. 下載 Google 的序列埠伺服器安全殼層金鑰
  2. 開啟已知主機檔案,通常位於 ~/.ssh/known_hosts
  3. 新增伺服器安全殼層金鑰的內容 (金鑰前面有加上 ssh-serialport.googleapis.com)。例如,如果伺服器金鑰包含 ssh-rsa AAAAB3NzaC1yc... 這一行,則 ~/.ssh/known_hosts 應有下列這一行:

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

為安全起見,Google 有時可能會變更 Google 序列埠伺服器安全殼層金鑰。如果您的用戶端無法驗證伺服器金鑰,請立即放棄連線嘗試並按照上述指示下載新的 Google 序列埠伺服器安全殼層金鑰。

如果在更新主機金鑰之後,您繼續從用戶端收到主機驗證錯誤,請停止嘗試連線至序列埠並與 Google 支援小組聯絡。請勿在主機驗證失敗的情況下,透過連線提供任何憑證。

中斷與序列主控台的連線

如要中斷與序列主控台的連線:

  1. 按下 ENTER 鍵。
  2. 輸入 ~. (波浪號後面加上句號)。

您可以透過輸入 ~? 或透過檢查安全殼層的手冊來尋找其他指令:

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 會提供稽核記錄來追蹤誰已與執行個體的序列主控台連線及中斷連線。如要查看記錄,您必須擁有記錄檢視器的權限,或者必須為專案檢視者或編輯者。

  1. 前往 GCP Console 的「Logs」(記錄) 頁面。

    前往「Logs」(記錄) 頁面

  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 此項目適用的使用者可理解訊息。

停用互動式序列主控台存取權

您可以變更特定執行個體或專案中的中繼資料來停用互動式序列主控台存取權,也可以設定機構政策來停用屬於機構一部分的一或多個專案所有 VM 執行個體的互動式序列主控台存取權。

在特定執行個體或專案中停用互動式序列主控台

專案擁有者與編輯者,以及已授予 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"
  }
}

提示與秘訣

  • 如果您在使用標準安全殼層用戶端連線時遇到問題,但 gcloud compute connect-to-serial-port 連線成功,則建議使用 --dry-run 指令列選項執行 ,以利查看代表您執行的安全殼層指令,並且比較選項與您使用的指令。

  • 設定位元率 (也稱為傳輸速率):您可以隨意設定任何位元率 (例如 stty 9600),但功能通常會將有效速率強制設為 115200 bps (~11.5kB/sec)。這是因為許多 OS 映像檔會在序列主控台中預設採用較慢的位元率 (例如 9600),且會緩慢啟動。

  • 某些 OS 映像檔的序列埠預設行為使用起來較不方便。以 CentOS 7 為例,必須要有 stty icrnl 才能讓主控台使用 Enter 鍵執行正確操作 (傳送 CR,又叫 ^M)。由於 bash 殻層的緣故,在您嘗試設定密碼卻似乎在 password: 提示出現後就停止不動之前,您可能都不會察覺到這個情況。

  • 如果您使用特定方式將殼層附加至通訊埠,部分 OS 映像檔可以操控預設停用的工作控制鍵,其中包括 ^Z^Csetsid 指令可能會修復這個問題。否則,如果您看到 job control is disabled in this shell 訊息,請務必小心,不要執行您需要中斷的指令。

  • 建議您在系統中指定使用的視窗大小,讓 bash 和編輯器能夠妥善管理。否則,倘若 bash 或編輯器嘗試根據不正確的可用列數和欄數控管顯示內容,可能會出現異常顯示行為。請使用 stty rows Y cols X 指令和 stty -a 查看設定。例如:stty rows 60 cols 120 (如果您的視窗是 120 個字元 x 60 列)。

  • 如果您使用安全殼層從 A 機器連線至 B 機器,再連線至 C 機器 (依此類推),以利建立巢狀安全殼層工作階段,且您想使用 ~ 指令執行諸如中斷連線或傳送序列中斷訊號的操作,則必須在指令中額外加入足夠的 字元,才能連線至正確的安全殼層用戶端。A 機器上的安全殼層用戶端會解譯單一 ~ 後的指令;B 機器上的用戶端則負責解譯兩個連續 ~ (ENTER~~),依此類推。您只需要按 ENTER 一次,就會一直執行到最內層的安全殼層目的地。使用任何提供 ~ 逸出功能的安全殼層用戶端均是如此。

    如果您不記得需要多少個 ~ 字元,請按下 ENTER 鍵,然後一次輸入一個 字元,直到執行個體回應 為止。這表示您已到達鏈尾。現在您知道如要傳送 ~ 指令至最深層的巢狀安全殼層用戶端,您需要輸入的 ~ 要比剛才輸入的數量少一個。

進階選項

控制連線數上限

您可以設定 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

設定重播選項

根據預設,您每次連線至序列主控台時,都會收到最後 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 -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 的輸出一律可用,且您的安全殼層用戶端通常不應遺失序列埠中的任何輸出。 如果基於某種原因,您的安全殼層用戶端在一段時間內停止接受輸出,但連線未中斷,且產生超過 1 MiB 的新資料,則您的安全殼層用戶端可能會遺失部分輸出。在這些情況下,當您的安全殼層用戶端接受資料的速度不夠快,無法與序列主控台通訊埠中的輸出保持同步時,可設定 on-dropped-output 屬性來決定主控台的行為。

使用這個屬性設定下列任何適用選項:

  • insert-stderr-note:插入安全殼層用戶端 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 -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 說明文件