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

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

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

シリアル コンソールにコマンドを発行せずにシリアルポート出力を表示するだけの場合は、getSerialPortOutput メソッドを呼び出すか、Stackdriver を使用することで、インスタンスがシリアルポートに書き込んだ情報を読み込めます。シリアルポート ログの表示をご覧ください。ただし、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 では、serial-port-enable キーに値 1 を指定して projects().setCommonInstanceMetadata メソッドにリクエストを行います。

{
 "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

serial-port-enable キーに値 1 を指定して instances().setMetadata メソッドにリクエストを行います。

POST https://www.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 Platform Console、gcloud コマンドライン ツール、またはサードパーティの SSH クライアントを使用して、シリアル コンソールに接続できます。

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

Console

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

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

  2. 接続したいインスタンスをクリックします。
  3. [リモート アクセス] で、[シリアル コンソールに接続] をクリックし、デフォルト ポート(ポート 1)で接続します。
  4. 別のシリアルポートに接続する場合は、[シリアル コンソールに接続] ボタンの横にある下矢印をクリックして、必要に応じてポート番号を変更します。
  5. Windows インスタンスの場合は、ボタンの横にあるプルダウン メニューからポート 2 に接続して、シリアル コンソールにアクセスします。

gcloud

gcloud compute connect-to-serial-port サブコマンドを使用し、gcloud コマンドライン ツールを使用して接続します。次に例を示します。

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 ポート 9,600 に接続できる限り、他のサードパーティの SSH クライアントを使用してインスタンスのシリアル コンソールに接続できます。

たとえば、次の SSH コマンドは、プロジェクト ID が myproject であるプロジェクトの example-instance という名前のインスタンスに、ユーザー名 jane でデフォルトのシリアルポート(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 クライアントを使用した接続で問題が発生した場合は、gcloud compute connect-to-serial-port--dry-run コマンドライン オプションを指定して実行することにより、実行された 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. GCP 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 は、COM2 または /dev/ttyS1 とも呼ばれる、インスタンス example-instance のポート番号 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

また、リクエスト本文が enforced パラメータを false に設定する API リクエストを作成することもできます。

{
  "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 は正常に接続している場合は、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: プロンプトで動作が止まったようになり、理由がわからなくなります。

  • OS イメージによっては、特定の方法でシェルをポートに接続しようとしたときに、デフォルトで無効になるジョブ コントロール キーがあります。これらのキーの例として、^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 クライアントに達するためにはコマンドに余分の ~ 文字を追加する必要があります。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 ドキュメント