シリアル コンソールとのやり取り

このページでは、インスタンスのシリアル コンソールへのインタラクティブ アクセスを有効にして、起動やネットワークの問題のデバッグ、不具合のあるインスタンスのトラブルシューティング、GRand Unified Bootloader(GRUB)の操作、その他のトラブルシューティングを実行する方法を説明します。

仮想マシン インスタンスには 4 つの仮想シリアルポートがあります。シリアルポートの操作は、入力と出力の全体がテキストモードになり、グラフィカル ユーザー インターフェースやマウスのサポートがないという点で、ターミナル ウィンドウを使用する場合に似ています。インスタンスのオペレーティング システム、BIOS、その他のシステムレベルのエンティティは多くの場合、出力をシリアルポートに書き込み、コマンドやプロンプトへの応答などの入力にアクセスできます。通常、これらのシステムレベルのエンティティは最初のシリアルポート(ポート 1)を使用します。多くの場合、シリアルポート 1 はシリアル コンソールと呼ばれます。

シリアル コンソールにコマンドを発行せずにシリアルポート出力を表示するだけの場合は、getSerialPortOutput メソッドを呼び出すか、または Stackdriver Logging を使用して、インスタンスがシリアルポートに書き込んだ情報を読み込みます。シリアルポート ログの表示をご覧ください。ただし、SSH 経由でのインスタンスへのアクセスで問題が発生した場合や、完全に起動していないインスタンスのトラブルシューティングを行う必要がある場合は、シリアル コンソールへのインタラクティブ アクセスを有効にすると、任意のインスタンスのシリアルポートへの接続と操作が可能になります。たとえば、シリアルポートで直接コマンドを実行したりプロンプトに応答できます。

始める前に

このタスクに必要な権限

このタスクを実行するには、次の権限が必要です。

  • 特定のインスタンスのインタラクティブ アクセスを有効にする場合、インスタンスに対する compute.instances.setMetadata
  • プロジェクト全体でインタラクティブ アクセスを有効にする場合、プロジェクトに対する compute.projects.setCommonInstanceMetadata

シリアル コンソールでのインタラクティブ アクセスの有効化

個々の VM インスタンスまたはプロジェクト全体についてインタラクティブ シリアル コンソール アクセスを有効にします。

プロジェクトのアクセスを有効にする

プロジェクトでインタラクティブ シリアル コンソール アクセスを有効にすると、そのプロジェクトに属するすべての VM インスタンスにアクセスできるようになります。

デフォルトでは、インタラクティブ シリアルポート アクセスは無効です。serial-port-enable キーを 1 ではなく 0 に設定することで、これを明示的に無効にできます。いずれの場合も、インスタンス単位の設定はプロジェクト レベルの設定またはデフォルト設定よりも優先されます。

Console

  1. [メタデータ] ページに移動します。
  2. [編集] をクリックして、メタデータ エントリを編集します。
  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 メソッドに対するリクエストを実行します。リクエストの本文で、値を 1 に設定して serial-port-enable キーを指定します。

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

VM インスタンスのアクセスを有効にする

特定のインスタンスについてインタラクティブ シリアル コンソール アクセスを有効にします。インスタンス単位の設定が存在する場合は、プロジェクト レベルの設定より優先されます。プロジェクト レベルでアクセスが有効になっていても、serial-port-enable1 の代わりに 0 に設定して、特定のインスタンスのアクセスを無効にすることもできます。同様に、プロジェクトに対して明示的にまたはデフォルトでアクセスが無効になっている場合でも、1 つ以上のインスタンスに対してアクセスを有効にできます。

Console

  1. [VM インスタンス] ページに移動します。

    [VM インスタンス] ページに移動

  2. アクセスを有効にするインスタンスをクリックします。
  3. [編集] をクリックします。
  4. [リモート アクセス] セクションで、[シリアルポート接続を有効化] チェックボックスをオンにします。
  5. 変更を保存します。

gcloud

gcloudコマンドライン ツールで instances add-metadata コマンドを使用します。

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

API

instances().setMetadata メソッドに対するリクエストを実行します。リクエストの本文で、値を 1 に設定して serial-port-enable キーを指定します。

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 Console、gcloud コマンドライン ツール、サードパーティの SSH クライアントのいずれかを使用します。

シリアル コンソールは、SSH 認証鍵を使用してユーザーを認証します。具体的には、SSH 公開鍵をプロジェクトまたはインスタンスのメタデータに追加し、秘密鍵は接続元にするローカルマシンに保存する必要があります。gcloud ツールと Google Cloud Console を使用すると、プロジェクトに SSH 認証鍵が自動的に追加されます。サードパーティのクライアントを使用している場合は、SSH 認証鍵を手動で追加しなければならない場合があります。

Console

  1. [VM インスタンス] ページに移動します。

    [VM インスタンス] ページに移動

  2. 接続先のインスタンスをクリックします。
  3. [リモート アクセス] で、[シリアル コンソールに接続] をクリックして、デフォルト ポート(ポート 1)に接続します。
  4. 別のシリアルポートに接続する場合は、[シリアル コンソールに接続] ボタンの横にある下矢印をクリックして、必要に応じてポート番号を変更します。
  5. Windows インスタンスの場合は、ボタンの横にあるプルダウン メニューから [ポート 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 以下を指定できます。ポート番号の詳細については、シリアルポート番号についてをご覧ください。

その他の SSH クライアント

クライアントが TCP ポート 9600 に接続できる限り、他のサードパーティの SSH クライアントを使用してインスタンスのシリアル コンソールに接続できます。

たとえば、次の SSH コマンドは、プロジェクト ID が myproject のプロジェクトにおけるユーザー名が janeexample-instance という名前のインスタンスのデフォルト シリアルポート (1) に接続します。インスタンスはゾーン 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 に接続します。

Windows VM インスタンスに接続する場合は、次のコマンドを使用してポート 2 経由で接続します。

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

サードパーティの SSH クライアントを使用して接続できない場合は、--dry-run コマンドライン オプションを付けて gcloud compute connect-to-serial-port を実行できます。自動的に実行される SSH コマンドを確認し、コマンドとオプションを比較してください。

安全な接続の設定

gcloud コマンドライン ツール以外のサードパーティの SSH クライアントを使用し、Google のシリアルポート サーバーの SSH 認証鍵を確認することで、なりすまし攻撃や中間者攻撃を防ぐことができます。サーバーの SSH 認証鍵を確認するためにシステムを設定する手順は次のとおりです。

  1. Google のシリアルポート サーバーの SSH 認証鍵をダウンロードします。
  2. 既知のホストファイルを開きます。通常は ~/.ssh/known_hosts にあります。
  3. サーバーの SSH 認証鍵の内容を、鍵の先頭に ssh-serialport.googleapis.com を付加した上で追加します。たとえば、サーバーキーに ssh-rsa AAAAB3NzaC1yc... が含まれている場合、~/.ssh/known_hosts には次の行が必要になります。

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

セキュリティ上の理由により、Google は Google シリアルポート サーバーの SSH 認証鍵を変更することがあります。クライアントがサーバーキーを認証できない場合は、すぐに接続の試行を中止し、上記の手順で新しい Google シリアルポート サーバーの SSH 認証鍵をダウンロードします。

ホストキーを更新しても引き続きクライアントでホスト認証エラーが発生する場合は、シリアルポートへの接続の試行を中止し、Google サポートにお問い合わせください。ホスト認証が失敗している接続では、認証情報を入力しないでください。

シリアル コンソールからの接続解除

シリアル コンソールから接続を解除するには:

  1. ENTER キーを押します。
  2. ~.」(チルダとピリオド)を入力します。

その他のコマンドを検索するには、~? を入力します。または、SSH のマニュアル ページを調べることができます。

man ssh

次のいずれかのコマンドを使用して切断しないでください。

  • CTRL+ALT+DELETE キーの組み合わせまたは他の類似した組み合わせ。シリアル コンソールは PC キーボードのキーの組み合わせを認識しないため、これは機能しません。

  • exit または logout コマンド。ゲストはネットワークまたはモデムの接続を認識しないため、これらのコマンドは機能しません。このコマンドを使用すると、コンソールが閉じてから再び開き、セッションに接続された状態が維持されます。セッションに対して exit コマンドと logout コマンドを有効にする場合は、on-dtr-low オプションを設定します。

ログイン プロンプトを使用したシリアル コンソールへの接続

完全に起動したインスタンスの問題や、インスタンスが過去のシングル ユーザーモードを起動した後で発生する問題をトラブルシューティングしようとしている場合は、シリアル コンソールにアクセスしようとしたときに、ログイン情報を求めるプロンプトが表示される場合があります。

デフォルトでは、Google が提供するシステム イメージは、ローカル ユーザーにパスワード ベースのログインを許可するよう構成されていません。インスタンスが実行しているイメージにシリアルポートのログインが事前に構成されている場合は、仮想マシンのインスタンスにローカル パスワードを設定し、シリアル コンソールにログインできます。

ローカル パスワードの設定

仮想マシンのインスタンス上でユーザーのローカル パスワードを設定し、そのパスワードを使ってそのインスタンスのシリアル コンソールにログオンできるようにするには、次の手順に従います。

  1. インスタンスに接続します。

    gcloud compute ssh [INSTANCE_NAME]
    
  2. インスタンスで、次のコマンドを使用してローカル パスワードを作成します。このコマンドは、現在ログインしているユーザーのパスワードを設定します。

    sudo passwd `whoami`
    
  3. プロンプトに従ってパスワードを作成します。

  4. 次に、インスタンスからログアウトして、シリアル コンソールに接続します。

  5. プロンプトが表示されたら、ログイン情報を入力します。

他のシリアルポートのログインの設定

ほとんどの Linux オペレーティング システムでは、デフォルトによりポート 1 でログイン プロンプトが有効になっています。しかし、ポート 1 に出力されるロギングデータや他の情報がポートの処理能力を超えることがあります。そのような場合は、次のコマンドのいずれかをインスタンスで実行し、ポート 1 の代わりにポート 2(ttyS1)など、別のポートでログイン プロンプトを有効にできます。インスタンスの利用可能なポートのリストについては、シリアルポート番号についてをご覧ください。

次の表に、シリアル コンソールのログインとデフォルトのポートが事前構成されたイメージを示します。

OS デフォルトのログイン プロンプトが指定されたポート サービス管理
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

シリアルポート番号について

仮想マシン インスタンスには、それぞれ 4 つのシリアルポートがあります。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. Cloud Console の [ログ] ページに移動します。

    [ログ] ページに移動

  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" と記録されます。監査ログエントリは、シリアル コンソールでの各セッションの開始時と終了時に記録されます。

ログタイプに応じてさまざまな監査ログプロパティがあります。たとえば、接続に関する監査ログには接続ログ固有のプロパティがいくつかあるのに対し、接続解除の監査ログには独自のプロパティ セットがあります。また、監査ログの一部のプロパティは、この 2 つのログタイプ間で共有されます。

シリアル コンソールのすべてのログ

プロパティ
requestMetadata.callerIp 接続元の IP アドレスとポート番号。
serviceName ssh-serialport.googleapis.com
resourceName 関連するシリアル コンソールを示すための、プロジェクト ID、ゾーン、インスタンス名、シリアルポート番号を含む文字列。たとえば、projects/myproject/zones/us-east1-a/instances/example-instance/SerialPort/2 は、インスタンス example-instance (COM2 または /dev/ttyS1 とも呼ばれる)のポート番号 2 です。
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 人が読める形式の、このエントリのメッセージ。

インタラクティブ シリアル コンソール アクセスを無効にする

インタラクティブ シリアル コンソール アクセスを無効にするには、特定のインスタンスまたはプロジェクトのメタデータを変更するか、インタラクティブ シリアル コンソール アクセスを無効にする組織ポリシーを組織の一部である 1 つ以上のプロジェクトのすべての 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 でポリシーを設定するには、次の URL に 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 では、以下の URL に対して 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"
  }
}

ヒントとアドバイス

  • 標準の SSH クライアントでは接続できないけれども gcloud compute connect-to-serial-port では接続できる場合は、 に --dry-run コマンドライン オプションを指定して実行してみてください。本来実行されるはずの SSH コマンドを確認して、使用しているコマンドとのオプションの違いを比較できます。

  • ビットレート(ボーレート)の設定: stty 9600 などの任意の値を設定できますが、通常は実効レートが強制的に 115,200 bps(約 11.5 kB/sec)に設定されます。これは、多くの OS イメージではデフォルトで 9,600 などの低速なビットレートがシリアル コンソールに設定され、起動に時間がかかるためです。

  • OS イメージによっては、シリアルポートのデフォルト値では都合が悪い場合があります。たとえば、CentOS 7 で Enter キーを使用して(CR すなわち ^M を送信して)適切な操作を実行するようコンソールに指示するには、stty icrnl が必要です。これは、パスワードの設定を開始するまで bash シェルによってマスクされる場合があり、password:password: プロンプトで動作が停止したように見える原因がわからず首をかしげることになります。

  • OS イメージによっては、特定の方法でシェルをポートに接続しようとしたときに、デフォルトで無効になるジョブ コントロール キーがあります。これらのキーの例として、^Z^C が挙げられます。この問題は、setsid コマンドで修正できる場合もありますが、修正できない場合、job control is disabled in this shell メッセージが表示されたら、割り込みが必要なコマンドを実行しないように注意してください。

  • ウィンドウのサイズをシステムに通知すると、bash やエディタはウィンドウを適切に管理できます。サイズを通知しなければ、bash やエディタは使用可能な行数と列数の不正確な想定に基づいてディスプレイを操作しようとするため、ディスプレイの動作に異常をきたすことがあります。設定を確認するには、stty rows Y cols X コマンドと stty -a を使用します。たとえば、ウィンドウが 120 文字 × 60 行の場合は、stty rows 60 cols 120 となります。

  • SSH を使用してマシン A からマシン B に接続し、さらにマシン C などに接続してネストされた SSH セッションを作成した場合、~ コマンドで切断やシリアル ブレーク信号の送信などを行う際は、適切な SSH クライアントに達するのに十分な 文字をコマンドに追加する必要があります。1 つの ~ の後に続くコマンドはマシン A 上の SSH クライアントによって解釈され、2 つの連続した ~ENTER~~)はマシン B 上のクライアントによって解釈されるというように動作します。ENTER は SSH の最も内側の宛先まで渡されるため、押す必要があるのは 1 回のみです。これは、~ のエスケープ機能を備えた SSH クライアントを利用するときに例外なく当てはまります。

    ~ 文字の必要な数がわからなくなった場合は、ENTER キーを押してから、インスタンスが をエコーバックするまで 文字を 1 度に 1 回ずつ押していきます。このときチェーンの終わりに到達したので、ネストの最も奥の SSH クライアントに ~ コマンドを送信するには、入力した回数より 1 回少ない回数 ~ が必要だとわかります。

詳細オプション

最大接続数の管理

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 バイトをリプレイします。Nnew に設定して、クライアントにまだ送信されていないすべての出力をリプレイすることもできます。
  • replay-from=N: ユーザーが指定した絶対バイト インデックス以降の出力をリプレイします。getSerialPortOutput リクエストを行うことで、シリアル コンソール出力の現在のバイト インデックスを取得できます。replay-from を設定すると、他のすべてのリプレイ オプションは無視されます。

gcloud コマンドライン ツールを使用して、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 コマンドによる接続解除を有効にできます。

gcloud コマンドライン ツールで、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

このオプションを有効にすると、インスタンスを再起動しているとき、オペレーティング システムが起動中にシリアルポートをリセットするため、インスタンスで 1 回以上接続の切断が発生する可能性があります。

このオプションのデフォルトの設定は none であり、DTR 行を変更しても何も起こりません。これを none に変更すると、シリアル コンソールから接続を解除しないでインスタンスを再起動できますが、コンソールは exit コマンドや logout コマンドなどの通常のメソッドを使っても、Ctrl+d などの通常のキーの組み合わせを使用しても接続が切断されなくなります。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Compute Engine ドキュメント