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

本頁面說明如何啟用對執行個體序列主控台的互動式存取權以偵錯啟動與網路問題、疑難排解發生異常的執行個體、與 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」頁面。

    前往中繼資料

  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-enableTRUE

{
 "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. 在「Remote access」(遠端存取) 區段下,勾選「Enable connecting to serial ports」(啟用序列埠連線) 核取方塊。
  5. 儲存變更。

gcloud

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

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

REST

透過 API 向 instances().setMetadata 方法發出要求,鍵與值分別為 serial-port-enableTRUE

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.5kB/sec)。如果速度較慢,可能會導致主控台輸出內容亂碼或遺失。

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

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

console=ttyS0,115200

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

serial --speed=115200

請務必更新實際的啟動載入程式設定。這項操作可透過 update-grubgrub2-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。如要進一步瞭解通訊埠編號,請參閱「瞭解序列埠編號」。

其他安全殼層用戶端

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

如要連線至運算執行個體的區域序列埠控制台,請視執行個體的作業系統執行下列其中一個指令:

  • 如要連線至 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 和 4)。如要進一步瞭解通訊埠編號,請參閱瞭解序列埠編號。若省略,則會連線至序列埠 1。

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

驗證第三方 SSH 用戶端連線

使用非 Google Cloud CLI 的第三方安全殼層用戶端時,建議您檢查 Google 的序列埠安全殼層主機金鑰,確保您不會受到冒用身分或攔截式攻擊。如要設定系統檢查 SSH 主機金鑰,請完成下列步驟:

  1. 下載要使用的序列控制台安全殼層主機金鑰:

    • 如為區域連線,區域的 SSH 主機金鑰位於 https://www.gstatic.com/vm_serial_port_public_keys/REGION/REGION.pub

    • 如要進行全球連線,請下載 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 序列埠安全殼層主機金鑰。如果用戶端無法驗證伺服器金鑰,請立即結束連線嘗試,並完成先前的步驟,下載新的 Google 序列埠安全殼層主機金鑰。

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

中斷與序列主控台的連線

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

控制台

在 Google Cloud 控制台中,執行下列操作來中斷與序列主控台的連線:

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

gcloud

在 Google Cloud CLI 中,執行下列操作來中斷與序列埠的連線:

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

其他安全殼層用戶端

在其他 SSH 用戶端中,請執行下列操作來中斷與序列主控台的連線:

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

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

man ssh

請勿嘗試使用下列任何方法中斷連線:

  • CTRL+ALT+DELETE 按鍵組合或其他類似組合。不能使用這些組合,因為序列主控台無法辨識 PC 鍵盤組合。

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

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

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

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

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

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

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

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

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. 如果運算執行個體已有開機指令碼,請將指令碼儲存在安全的地方,然後按一下「刪除項目」刪除指令碼。

    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 會將序列埠稱為 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. 前往 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"
  }
}

提示與祕訣

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

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

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

  • 某些 OS 映像檔的序列埠預設行為使用起來較不方便。舉例來說,在 CentOS 7 中,主控台 Enter 鍵的預設 stty icrnl 是傳送 CR,又稱 ^M。由於 bash 殼層的緣故,在您嘗試設定密碼卻似乎在 password: 提示出現後就停止不動之前,您可能都不會察覺到這個情況。

  • 如果您使用特定方式將殼層附加至通訊埠,部分公開映像檔可以操控預設停用的工作控制鍵,其中包括 ^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 列)。

  • 舉例來說,如果您使用 SSH 從機器 A 連線至機器 B,然後連線至機器 C,建立巢狀 SSH 工作階段,並想使用波浪號 (~) 指令中斷連線或傳送序列中斷訊號,則必須在指令中加入足夠的額外波浪號字元,才能連線至正確的 SSH 用戶端。A 機器上的安全殼層 (SSH) 用戶端會解譯單一波浪符後的指令;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,會忽略所有其他重播選項。

使用 Google Cloud CLI,將下列內容附加至 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 指令啟用中斷連線。

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

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

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

後續步驟