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


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

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

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

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

事前準備

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

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. After installing the Google Cloud CLI, initialize it by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    2. Set a default region and zone.

    REST

    To use the REST API samples on this page in a local development environment, you use the credentials you provide to the gcloud CLI.

      After installing the Google Cloud CLI, initialize it by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    For more information, see Authenticate for using REST in the Google Cloud authentication documentation.

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

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

針對專案啟用存取權

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

根據預設,互動式序列埠存取權為停用。您也可以將 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"
  }
 ]
}

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

您可以針對特定執行個體啟用互動式序列主控台存取權。如果有個別執行個體設定,該設定會覆寫任何專案層級的設定。即使專案層級已啟用此存取權,您也可將 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 指令列介面和 Google Cloud 控制台會自動為您將安全殼層金鑰新增至專案。如果您使用第三方用戶端,可能需要手動新增安全殼層金鑰。

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

主控台

如要連線至 VM 的區域序列主控台,請執行下列步驟:

  1. 前往 Google Cloud 控制台的「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

如要連線至 VM 的區域序列主控台,請使用 gcloud compute connect-to-serial-port 指令

  gcloud compute connect-to-serial-port VM_NAME 
--port=PORT_NUMBER

更改下列內容:

  • VM_NAME:要連線的 VM 序列控制台名稱。
  • PORT_NUMBER:要連線的通訊埠號碼。針對 Linux VM,請使用 1,針對 Windows VM,請使用 2。如要進一步瞭解通訊埠編號,請參閱「瞭解序列埠編號」。

其他安全殼層用戶端

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

如要連線至 VM 的區域序列主控台,請根據 VM 的作業系統執行下列其中一項指令:

  • 如要連線至 Linux VM,請按照下列步驟操作:

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

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

更改下列內容:

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

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

驗證第三方安全殼層用戶端連線

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

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

  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 支援團隊聯絡。請勿在主機驗證失敗的情況下,透過連線提供任何憑證。

中斷與序列主控台的連線

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

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

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

man ssh

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

  • CTRL+ALT+DELETE 按鍵組合或其他類似組合。這麼做無法運作,因為序列主控台無法辨識 PC 鍵盤組合。

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

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

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

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

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

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

您可以使用開機指令碼設定本機密碼,這樣在建立 VM 期間或之後,就能連線至序列控制台。

如要在現有 VM 中設定本機密碼,請選取下列任一選項:

Linux

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

    前往 VM 執行個體

  2. 在「Name」欄中,按一下要新增本機密碼的 VM 名稱。

    VM 的詳細資料頁面隨即開啟。

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

    編輯 VM 詳細資料的頁面隨即開啟。

  4. 在「Metadata」 專區中,執行下列操作:

    1. 如果 VM 已有開機指令碼,請將其移除,並將指令碼儲存在安全的位置。

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

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

      更改下列內容:

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

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

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

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

  5. 按一下 [儲存]

    VM 的詳細資料頁面隨即開啟。

  6. 按一下「重設」

  7. 連線至序列主控台

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

Windows

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

    前往 VM 執行個體

  2. 在「Name」欄中,按一下要新增本機密碼的 VM 名稱。

    VM 的詳細資料頁面隨即開啟。

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

    編輯 VM 詳細資料的頁面隨即開啟。

  4. 在「Metadata」專區中,執行下列操作:

    1. 如果 VM 已有開機指令碼,請將指令碼儲存在安全的地方,然後按一下 「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. 按一下 [儲存]

    VM 的詳細資料頁面隨即開啟。

  6. 按一下「重設」

  7. 連線至序列主控台

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

建立使用者後,請將啟動指令碼換成您儲存在本節中的啟動指令碼。

在 VM 上使用 passwd 設定本機密碼

以下操作說明如何在 VM 上為使用者設定本機密碼,以便使用者可以使用指定密碼登入該 VM 的序列主控台。

  1. 連線至 VM。將 instance-name 換成您的執行個體名稱。

    gcloud compute ssh instance-name
  2. 在 VM 上,使用下列指令建立本機密碼。這樣會按照您目前登入使用的身分設定使用者密碼。

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

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

  5. 在提示時輸入登入資訊。

在其他序列埠中設定登入

根據預設,大部分 Linux 作業系統的通訊埠 1 上都會啟用登入提示。 但是,通訊埠 1 通常會被記錄資料及輸出至通訊埠的其他資訊癱瘓。您可以選擇在其他通訊埠上啟用登入提示,例如通訊埠 2 (ttyS1),方法是在您的 VM 上執行下列其中一個指令。如要查看 VM 的可用通訊埠清單,請參閱「瞭解序列埠編號」。

下表列出已使用序列主控台登入預先設定的映像檔,以及預設通訊埠。

作業系統 預設會顯示登入提示的通訊埠 服務管理
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 檔案並修改這個檔案,從而建立新的 /etc/init/ttyS1.conf 檔案,以反映 ttyS1。例如:

    • 在 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 &#39;s/^#T([01])/T\1/&#39; /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. 前往 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 此項目適用的使用者可理解訊息。

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

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

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

專案擁有者與編輯者,以及已授予 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 VM,且遇到 UNAUTHENTICATED 錯誤,請確認公開安全殼層金鑰已發布至專案或執行個體中繼資料。詳情請參閱「管理中繼資料中的安全殼層金鑰」。

  • 設定位元率 (也稱為傳輸速率):您可以隨意設定任何位元率 (例如 stty 9600),但功能通常會將有效速率強制設為 115,200 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 工作階段,如果您想使用 tilde (~) 指令來中斷連線或傳送序列中斷信號,就必須在指令中加入足夠的 tilde 字元,才能取得正確的 SSH 用戶端。A 機器上的安全殼層用戶端會解譯單一 tilde 後的指令;B 機器上的用戶端則負責解譯兩個連續 tilde (Enter~~) 後的指令,依此類推。您只需要按 Enter 一次,就會一直執行到最內層的安全殼層目的地。使用任何提供 tilde 逸出功能的安全殼層用戶端均是如此。

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

進階選項

您也可以在序列埠中使用下列進階選項。

控制連線數上限

您可以設定 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) 來中斷連線。

後續步驟