使用序列主控台來解決問題

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

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

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

啟用或停用序列埠時,您可以使用中繼資料伺服器接受的任何布林值。詳情請參閱「布林值」。

事前準備

  • 如果尚未設定驗證,請先完成設定。驗證程序會確認您的身分,以便您存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,您可以選取下列其中一個選項,向 Compute Engine 進行驗證:

    請根據您打算如何使用本頁範例,選取對應的分頁標籤:

    控制台

    使用 Google Cloud 控制台存取 Google Cloud 服務和 API 時,您不需要設定驗證機制。

    gcloud

    1. 安裝 Google Cloud CLI,然後使用聯合身分登入 gcloud CLI。 登入後, 執行下列指令來初始化 Google Cloud CLI:

      gcloud init
  • 設定預設區域和可用區。
  • REST

    如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。

      安裝 Google Cloud CLI,然後使用聯合身分登入 gcloud CLI。

    詳情請參閱 Google Cloud 驗證說明文件中的「使用 REST 進行驗證」一節。

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

為個別運算執行個體或整個專案啟用互動式序列主控台存取權。

針對專案啟用存取權

如果為專案啟用互動式序列控制台存取權,則該專案的所有運算執行個體都會啟用存取權。

根據預設,互動式序列埠存取權為停用。您也可以將 serial-port-enable 鍵設為 FALSE,明確停用這項功能。無論是哪一種情況,任何個別執行個體設定都會覆寫專案層級設定或預設設定。

控制台

  1. 前往 Google Cloud 控制台的「Metadata」(中繼資料) 頁面。

    前往「Metadata」(中繼資料) 頁面

  2. 按一下 [Edit] (編輯),編輯中繼資料項目。
  3. 新增項目,並使用 serial-port-enable 鍵和 TRUE 值。
  4. 儲存變更。

gcloud

使用 Google Cloud CLI 輸入 project-info add-metadata 指令,如下所示:

gcloud compute project-info add-metadata \
    --metadata serial-port-enable=TRUE

REST

在 API 中,向 projects().setCommonInstanceMetadata 方法提出要求,並提供 serial-port-enable 鍵和 TRUE 值:

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

啟用運算執行個體的存取權

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

控制台

  1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。

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

  2. 按一下您要為其啟用存取權的執行個體。
  3. 按一下 [編輯]。
  4. 在「遠端存取」部分,切換「啟用序列埠連線」核取方塊。
  5. 儲存變更。

gcloud

使用 Google Cloud CLI 輸入 instances add-metadata 指令,並將 instance-name 替換為執行個體名稱。

gcloud compute instances add-metadata instance-name \
    --metadata serial-port-enable=TRUE

REST

在 API 中,使用 serial-port-enable 鍵和 TRUE 值向 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": "TRUE"
  }
 ]
}

設定 Bare Metal 執行個體的序列主控台

如果是裸機執行個體,請將序列控制台的位元率 (也稱為鮑率) 提高至 115,200 bps (約 11.5 kB/秒)。如果使用較慢的速度,可能會導致控制台輸出內容出現亂碼或遺漏。

系統啟動載入程式設定會因作業系統和 OS 版本而異。如需操作說明,請參閱 OS 發行商的說明文件。

如要在指令列中修改目前工作階段的位元率,請使用類似下列的指令:

console=ttyS0,115200

如要修改 GRUB 設定,請使用類似下列的指令:

serial --speed=115200

請務必更新實際的開機載入程式設定。您可以使用 update-grub、grub2-mkconfig 或類似指令完成這項操作。

連線至序列主控台

Compute Engine 為每個 Google Cloud區域提供區域序列控制台閘道。為運算執行個體的序列控制台啟用互動式存取權後,即可連線至區域性序列控制台。

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

如果您使用的是第三方用戶端,也可以使用序列主控台的主機金鑰驗證連線。使用 Google Cloud CLI 連線時,系統會自動為您執行主機金鑰驗證。

控制台

如要連線至運算執行個體的區域序列控制台,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。

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

  2. 按一下您要連線的目標執行個體。
  3. 在「Details」(詳細資料) 下方,按一下「Connect to serial console」(連線至序列主控台),透過預設通訊埠 (通訊埠 1) 連線。
  4. 如果您想連線至其他序列埠,請按一下 [Connect to serial console] (連線至序列主控台) 按鈕旁的向下箭頭,變更通訊埠編號。
  5. 如果是 Windows 執行個體,請開啟按鈕旁的下拉式選單,然後連線至「Port 2」(通訊埠 2),即可存取序列控制台。

gcloud

如要連線至運算執行個體的區域序列控制台,請使用 gcloud compute connect-to-serial-port 指令:

gcloud compute connect-to-serial-port INSTANCE_NAME \
    --port=PORT_NUMBER

更改下列內容:

  • INSTANCE_NAME:要連線至序列控制台的運算執行個體名稱。
  • PORT_NUMBER:要連線的通訊埠編號。如果是 Linux 執行個體,請使用 1;如果是 Windows 執行個體,請使用 2。如要進一步瞭解通訊埠編號,請參閱「瞭解序列埠編號」。

其他安全殼層 (SSH) 用戶端

只要用戶端允許您連線至 TCP 通訊埠 9600,您就可以使用其他第三方 SSH 用戶端連線至執行個體的序列主控台。連線前,您可以選擇使用序列主控台的主機金鑰驗證連線。

如要連線至運算執行個體的區域序列主控台,請根據執行個體的 OS 執行下列其中一項指令:

  • 如要連線至 Linux 執行個體,請按照下列步驟操作:

    ssh -i PRIVATE_SSH_KEY_FILE -p 9600 PROJECT_ID.ZONE.INSTANCE_NAME.USERNAME.OPTIONS@REGION-ssh-serialport.googleapis.com
    
  • 如要連線至 Windows 執行個體,請按照下列步驟操作:

    ssh -i PRIVATE_SSH_KEY_FILE -p 9600 PROJECT_ID.ZONE.INSTANCE_NAME.USERNAME.OPTIONS.port=2@REGION-ssh-serialport.googleapis.com
    

更改下列內容:

  • PRIVATE_SSH_KEY_FILE:運算執行個體的私人安全殼層金鑰。
  • PROJECT_ID:這個運算執行個體的專案 ID。
  • ZONE:運算執行個體的可用區。
  • REGION:運算執行個體的區域。
  • INSTANCE_NAME:運算執行個體的名稱。
  • USERNAME:用來連線至執行個體的使用者名稱。通常是本機電腦上的使用者名稱。
  • OPTIONS:可為這項連線指定的其他選項。例如,您可以指定特定序列埠和任何進階選項。通訊埠編號可以是 1 到 4 (含)。如要進一步瞭解通訊埠編號,請參閱「瞭解序列埠編號」。如果省略,則會連線至序列埠 1。

如果無法使用第三方 SSH 用戶端連線,可以執行 gcloud compute connect-to-serial-port 指令並加上 --dry-run 指令列選項,查看系統會代您執行的 SSH 指令。接著,您可以將這些選項與您使用的指令進行比較。

驗證第三方 SSH 用戶端連線

使用非 Google Cloud CLI 的第三方 SSH 用戶端時,建議您檢查 Google 的序列埠 SSH 主機金鑰,確認您不會受到模擬或中間人攻擊。如要設定系統檢查 SSH 主機金鑰,請完成下列步驟:

  1. 下載所用序列控制台的 SSH 主機金鑰:

  2. 開啟已知主機檔案,通常位於 ~/.ssh/known_hosts。

  3. 新增 SSH 主機金鑰的內容,並在金鑰前面加上伺服器的主機名稱。舉例來說,如果 us-central1 伺服器金鑰包含 ssh-rsa AAAAB3NzaC1yc... 這一行,則 ~/.ssh/known_hosts 應包含類似以下的一行:

    [us-central1-ssh-serialport.googleapis.com]:9600 ssh-rsa AAAAB3NzaC1yc...

基於安全考量,Google 可能會不時變更 Google 序列埠 SSH 主機金鑰。如果用戶端無法驗證伺服器金鑰,請立即結束連線嘗試,並完成上述步驟,下載新的 Google 序列埠 SSH 主機金鑰。

如果更新主機金鑰後,用戶端仍持續收到主機驗證錯誤,請停止嘗試連線至序列埠,並與 Google 支援團隊聯絡。如果主機驗證失敗,請勿透過連線提供任何憑證。

中斷與序列主控台的連線

如要中斷與序列控制台的連線,請按照您連線時使用的方法操作。

控制台

在 Google Cloud 控制台中,按照下列步驟中斷與序列控制台的連線:

  1. 關閉含有序列主控台連線的瀏覽器視窗或分頁。

gcloud

在 Google Cloud CLI 中,按照下列步驟中斷與序列控制台的連線:

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

其他安全殼層 (SSH) 用戶端

在其他 SSH 用戶端中,請按照下列步驟中斷與序列控制台的連線:

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

在 Google Cloud CLI 中或使用 SSH,您可以輸入 ~? 來探索其他指令。您也可以使用下列指令,查看 SSH 的 man 頁面:

man ssh

請勿嘗試使用下列任一方法中斷連結:

  • CTRL+ALT+DELETE 按鍵組合或其他類似組合。這項操作無法執行,因為序列控制台無法辨識電腦鍵盤組合。

  • exit 或 logout 指令無法運作,因為訪客不知道任何網路或數據機連線。若使用這個指令,主控台會關閉再重新開啟,而您的工作階段仍然保持連線。如果要針對工作階段啟用 exit 和 logout 指令,設定 on-dtr-low 選項即可。

使用登入提示連線至序列主控台

如果您嘗試排解已完全啟動的運算執行個體問題,或嘗試排解運算執行個體啟動後超過單一使用者模式的問題,系統可能會在您嘗試存取序列主控台時,提示您輸入登入資訊。

根據預設,Google 提供的 Linux 系統映像檔並未設定為允許本機使用者透過密碼登入。不過,Google 提供的 Windows 映像檔已設為允許本機使用者透過密碼登入。

如果運算執行個體執行的映像檔已預先設定序列埠登入,您必須在運算執行個體設定本機密碼,才能在系統提示時登入序列控制台。連線至運算執行個體後,或使用開機指令碼,即可設定本機密碼。

如果 VM 無法啟動到足以執行開機指令碼的程度 (例如 GRUB 系統啟動載入程式損毀),或者您沒有本機密碼,且缺少 sshd 或 google-guest-agent,就無法使用開機指令碼登入。請改用下列任一方法復原 VM:

  • 使用開放原始碼 GCE Rescue 工具診斷序列控制台開機錯誤 (gce-rescue diagnose)、自動修復常見的開機問題 (gce-rescue repair),或將執行個體啟動至救援模式 (gce-rescue rescue)。
  • 將開機磁碟連接至臨時 VM,以便離線修復。如需操作說明,請參閱「救援無法存取的 VM」。

使用開機指令碼設定本機密碼

您可以使用開機指令碼設定本機密碼,以便在建立執行個體期間或之後連線至序列控制台。

如要在現有運算執行個體中設定本機密碼,請選取下列其中一個選項:

Linux

  1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。

    前往 VM 執行個體

  2. 在「Name」(名稱) 欄中,按一下要新增本機密碼的運算執行個體名稱。

    運算執行個體的詳細資料頁面隨即開啟。

  3. 按一下「Edit」(編輯)。

    系統會開啟頁面,讓您編輯運算執行個體的詳細資料。

  4. 在「Metadata」(中繼資料) >「Automation」(自動化) 部分,執行下列操作:

    1. 如果運算執行個體已有開機指令碼,請移除並儲存在安全的地方。

    2. 新增下列開機指令碼:

      #!/bin/bash
      useradd USERNAME
      echo 'USERNAME:PASSWORD' | chpasswd
      usermod -aG google-sudoers USERNAME
      

      更改下列內容:

      • USERNAME:要新增的使用者名稱。

      • PASSWORD:使用者名稱的密碼。部分作業系統會要求密碼長度和複雜度下限,因此請按照下列規定指定密碼:

        • 至少須有 12 個半形字元。

        • 混合使用大小寫英文字母、數字和符號。

  5. 按一下「儲存」。

    運算執行個體的詳細資料頁面隨即開啟。

  6. 按一下「重設」。

  7. 連線至序列控制台。

  8. 系統提示時,請輸入登入資訊。

Windows

  1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。

    前往 VM 執行個體

  2. 在「Name」(名稱) 欄中,按一下要新增本機密碼的運算執行個體名稱。

    運算執行個體的詳細資料頁面隨即開啟。

  3. 按一下「Edit」(編輯)。

    系統會開啟編輯運算執行個體詳細資料的頁面。

  4. 在「Metadata」(中繼資料) 部分,執行下列操作:

    1. 如果運算執行個體已有開機指令碼,請將指令碼儲存在安全的地方,然後按一下 「Delete item」(刪除項目) 刪除指令碼。

    2. 按一下 [新增項目]。

    3. 在「Key」欄位中輸入 windows-startup-script-cmd。

    4. 在「Value」(值) 欄位中輸入下列指令碼:

      net user USERNAME PASSWORD /ADD /Y
      net localgroup administrators USERNAME /ADD
      

      更改下列內容:

      • USERNAME:要新增的使用者名稱。

      • PASSWORD:使用者名稱的密碼。部分作業系統會要求密碼長度和複雜度下限,因此請按照下列規定指定密碼:

        • 至少須有 12 個半形字元。

        • 混合使用大小寫英文字母、數字和符號。

  5. 按一下「儲存」。

    運算執行個體的詳細資料頁面隨即開啟。

  6. 按一下「重設」。

  7. 連線至序列控制台。

  8. 系統提示時,請輸入登入資訊。

建立使用者後,請將開機指令碼替換為您在本節中儲存的開機指令碼。

在運算執行個體上使用 passwd 設定本機密碼

下列操作說明說明如何為運算執行個體上的使用者設定本機密碼,讓使用者可以使用指定密碼登入該運算執行個體的序列主控台。

  1. 連線至運算執行個體。將 INSTANCE_NAME 替換為執行個體名稱。

    gcloud compute ssh INSTANCE_NAME
  2. 在運算執行個體上,使用下列指令建立本機密碼。這項操作會為您登入的使用者設定密碼。

    sudo passwd $(whoami)
  3. 依照提示建立密碼。

  4. 接下來,登出執行個體並連線至序列主控台。

  5. 系統提示時,請輸入登入資訊。

在其他序列埠中設定登入

根據預設,在使用 systemd 服務管理的所有 Linux 公開映像檔中,通訊埠 1 會啟用登入提示。如果是 Windows 映像檔,登入提示預設會在通訊埠 2 啟用,並由裝置管理工具管理。不過,通訊埠 1 通常會因記錄資料和其他資訊列印到通訊埠而超載。或者,您也可以在運算執行個體上執行下列指令,選擇在其他通訊埠 (例如通訊埠 2 (ttyS1)) 啟用登入提示:

Linux

針對使用 systemd 的 Linux 作業系統:

  • 暫時啟用服務,直到下次重新啟動為止:

    sudo systemctl start serial-getty@ttyS1.service
  • 從下一次重新啟動開始,永久啟用服務:

    sudo systemctl enable serial-getty@ttyS1.service

Windows

Windows 作業系統:

  • 以系統管理員身分開啟命令提示字元

  • 將 EMS 連接埠從 COM2 變更為 COM1:

    bcdedit /emssettings EMSPORT:1 EMSBAUDRATE:9600
  • 重新啟動運算執行個體

瞭解序列埠編號

每個虛擬機器執行個體都有四個序列埠。為了與 getSerialPortOutput API 一致,各通訊埠分別有 1 到 4 的編號。Linux 及其他類似系統會將序列埠編號為 0 到 3。例如,在許多作業系統映像檔中,對應裝置為 /dev/ttyS0 到 /dev/ttyS3。Windows 會將序列埠稱為 COM1 到 COM4。如要連線至 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. 前往 Google Cloud 控制台的「Logs Explorer」頁面。

    前往 Logs Explorer

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

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

如要停用互動式序列主控台存取權,您可以變更特定執行個體或專案的中繼資料,也可以設定組織政策,停用組織中一或多個專案的所有運算執行個體互動式序列主控台存取權。

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

專案擁有者和編輯者,以及獲派 compute.instanceAdmin.v1 角色的使用者,可以變更特定執行個體或專案的中繼資料,停用序列控制台存取權。與啟用序列主控台存取權類似,請將 serial-port-enable 中繼資料設定為 FALSE:

serial-port-enable=FALSE

舉例來說,您可以使用 Google Cloud CLI,將這項中繼資料套用至特定執行個體,如下所示:

gcloud compute instances add-metadata instance-name \
    --metadata=serial-port-enable=FALSE

如要將中繼資料套用至專案:

gcloud compute project-info add-metadata \
    --metadata=serial-port-enable=FALSE

透過組織政策停用互動式序列控制台存取權

如果您已獲派組織的 orgpolicy.policyAdmin 角色,則可設定組織政策,禁止互動式存取序列控制台,無論中繼資料伺服器是否啟用互動式序列控制台存取權。設定組織政策後,政策會有效覆寫 serial-port-enable 中繼資料鍵,且組織或專案的使用者都無法啟用互動式序列主控台存取權。根據預設,這項限制設為 FALSE。

停用互動式序列控制台存取權的限制如下:

compute.disableSerialPortAccess

請按照下列操作說明,在組織中設定這項政策。設定政策之後,您可以針對每個專案授予豁免。

gcloud

如要使用 Google Cloud CLI 設定政策,請執行 resource-manager enable-enforce 指令。將 organization-id 替換為組織 ID。例如:1759840282。

gcloud resource-manager org-policies enable-enforce \
    --organization organization-id compute.disableSerialPortAccess

REST

如要在 API 中設定政策,請向下列網址發出 POST 要求。將 organization-name 替換為組織名稱。例如:organizations/1759840282。

 POST https://cloudresourcemanager.googleapis.com/v1/organization-name:setOrgPolicy

要求主體應包含具有下列限制的 policy 物件:

"constraint": "constraints/compute.disableSerialPortAccess"

例如:

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

這項政策會立即生效,因此組織下的任何專案都會立即停止允許互動式存取序列控制台。

如要暫時停用政策,請使用 disable-enforce 指令:

gcloud resource-manager org-policies disable-enforce \
    --organization organization-id compute.disableSerialPortAccess

或者,您可以提出 API 要求,在要求主體中將 enforced 參數設定為 FALSE:

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

在專案層級設定組織政策

您可以為各項專案設定相同的組織政策。這會覆寫機構層級的設定。

gcloud

如要停止對特定專案強制執行這項政策,並將 project-id 改成專案 ID。

gcloud resource-manager org-policies disable-enforce \
    --project project-id compute.disableSerialPortAccess

您可以使用具有相同值的 enable-enforce 指令,來開啟這個政策的強制執行功能。

REST

在 API 中,向下列網址發出 POST 要求,為專案啟用互動式序列控制台存取權,並將 project-id 替換為專案 ID:

POST https://cloudresourcemanager.googleapis.com/v1/projects/project-id:setOrgPolicy

要求主體應包含 policy 物件,並符合下列限制:

"constraint": "constraints/compute.disableSerialPortAccess"

例如:

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

疑難排解 Web UI 連線問題

如果點選「Connect to serial console」(連線至序列控制台) 按鈕時,出現「SSH authentication failed」(SSH 驗證失敗) 錯誤,或系統將您重新導向至一般 SSH 錯誤頁面,請檢查下列事項:

  • VPC Service Controls:如果專案受到 VPC Service Controls 保護,就無法使用瀏覽器型序列主控台。請改用 gcloud compute connect-to-serial-port 指令。
  • IAM 權限:確認您具備執行個體服務帳戶的 iam.serviceAccountUser 角色。序列控制台閘道需要這個角色,才能驗證連線。
  • OS 登入:如果執行個體使用 OS 登入,請務必將安全殼層金鑰推送至 OS 登入設定檔或專案中繼資料。
  • Private Google Access:如果您將 Private Google Access 與 *.googleapis.com 的 DNS 萬用字元搭配使用,序列控制台端點 (REGION-ssh-serialport.googleapis.com) 可能無法正確解析。請務必透過公開網際網路轉送這類流量。

提示與祕訣

  • 如果無法使用標準 SSH 用戶端連線,但 gcloud compute connect-to-serial-port 成功連線,建議您使用 --dry-run 指令列選項執行 gcloud compute connect-to-serial-port,查看系統代您執行的 SSH 指令,並比較選項與您使用的指令。

  • 如果您使用已啟用 OS 登入功能的 Windows 執行個體,並遇到 UNAUTHENTICATED 錯誤,請確認公開安全殼層金鑰已發布至專案或執行個體中繼資料。詳情請參閱「管理中繼資料中的安全殼層金鑰」。

  • 設定位元率 (也稱為鮑率) 時,您可以設定任何位元率,例如 stty 9600,但這項功能通常會強制將有效率設為 115,200 bps (~11.5kB/sec)。這是因為許多公開映像檔預設為慢速位元率,例如序列控制台上的 9,600,因此開機速度會變慢。

  • 某些 OS 映像檔的序列埠預設行為使用起來較不方便。舉例來說,在 CentOS 7 上,控制台 Enter 鍵的 stty icrnl 預設值是傳送 CR,也稱為 ^M。bash 殼層可能會遮蓋這個提示,直到您嘗試設定密碼,此時您可能會想知道為什麼它似乎卡在 password: 提示。

  • 某些公開映像檔具有工作控制鍵,如果您以特定方式將殼層附加至通訊埠,這些按鍵預設會停用。其中包括 ^Z 和 ^C。setsid 指令或許能修正這個問題。否則,如果看到 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,會忽略所有其他重播選項。

使用 Google Cloud CLI 時,請在 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=N 和 replay-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=N 和 replay-bytes=M
重播行數最多不超過這些旗標描述的行數或位元組數,以較少者為準。這個選項不會重播超過 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 指令啟用中斷連線。

在 Google Cloud CLI 中,將下列旗標附加至 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

啟用 disconnect 選項後,重新啟動執行個體時,執行個體可能會中斷連線一或多次,因為作業系統會在啟動時重設序列埠。

on-dtr-low 選項的預設設定為 none。如果使用預設設定 none,您可以在不與序列主控台中斷連線的情況下重新啟動執行個體,但主控台不會透過一般方式 (例如 exit 或 logout 指令) 或一般按鍵組合 (像是 Ctrl+D) 來中斷連線。

後續步驟