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

本頁面說明如何啟用對執行個體序列主控台的互動式存取權以偵錯啟動與網路問題、疑難排解發生異常的執行個體、與 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。 完成後,執行下列指令來初始化 Google Cloud CLI:

      gcloud init

      如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。

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

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

      安裝 Google Cloud CLI。

      若您採用的是外部識別資訊提供者 (IdP),請先 使用聯合身分登入 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區域提供區域序列埠控制台閘道。為運算執行個體的序列控制台啟用互動式存取權後,即可連線至區域序列控制台。

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

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

控制台

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

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

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

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

    • 如要建立區域連線,請前往 https://www.gstatic.com/vm_serial_port_public_keys/REGION/REGION.pub 尋找區域的 SSH 主機金鑰。

    • 如要進行全域連線,請下載 Google 的序列埠 SSH 主機金鑰

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

  3. 新增安全殼層主機金鑰的內容,並在金鑰前加上伺服器的主機名稱。舉例來說,如果 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 按鍵組合或其他類似組合。由於序列埠控制台無法辨識 PC 鍵盤組合,因此這項操作無效。

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

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

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

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

如果運算執行個體執行的映像檔已預先設定序列埠登入,您需要在運算執行個體上設定本機密碼,以便在系統提示時登入序列埠控制台。連線至運算執行個體後,您可以設定本機密碼,也可以使用啟動指令碼。

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

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

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

Linux

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

    前往 VM 執行個體

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

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

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

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

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

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

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

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

      更改下列內容:

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

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

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

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

  5. 按一下 [儲存]。

    系統會開啟 Compute 執行個體的詳細資料頁面。

  6. 按一下「重設」。

  7. 連線至序列控制台。

  8. 按照系統提示輸入登入資訊。

Windows

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

    前往 VM 執行個體

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

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

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

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

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

    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. 按一下 [儲存]。

    系統會開啟 Compute 執行個體的詳細資料頁面。

  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 字串,您可以使用這個 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:如果您搭配 *.googleapis.com 的 DNS 萬用字元使用 Private Google Access,序列控制台端點 (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 行)。

  • 舉例來說,如果您從電腦 A 使用 SSH 連線至電腦 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

設定重播選項

根據預設,每次連線至序列埠控制台時,系統都會重播最後 10 行資料,無論其他 SSH 用戶端是否已看過這 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) 來中斷連線。

後續步驟