VM の起動のトラブルシューティング

このドキュメントでは、割り当てエラーブートディスク起動スクリプトが原因で VM の起動時に発生する問題のトラブルシューティングについて説明します。

割り当てのエラー

インスタンスを起動しようとしたときに割り当てエラーが発生する場合は、追加の CPU 割り当てをリクエストする必要があります。詳細については、リソースの割り当てドキュメントの VM インスタンスのセクションをご覧ください。

ブートディスク

インスタンスが起動せず、インスタンスに接続できないかインタラクティブ シリアル コンソールからログインできない場合、ブートディスクの起動プロセスが完了しない理由を確認します。

ブートディスクが起動しない理由を特定する

  • ブートディスクに空き容量があることを確認する。

    ブートディスクの空き容量がまったくなく、オペレーティング システムで自動サイズ変更がサポートされていない場合は、インスタンスに接続できません。新しいインスタンスを作成し、ブートディスクを再作成する必要があります。アクセスできないインスタンスや完全なブートディスクの復元をご覧ください。

  • 仮想マシン インスタンスのシリアルポート出力を確認する。

    インスタンスの BIOS、ブートローダー、カーネルは、インスタンスのシリアルポート出力にデバッグ メッセージを出力します。そこには、インスタンスで発生したエラーや問題に関する貴重な情報が含まれています。Cloud Logging へのシリアルポート出力ロギングを有効にすると、インスタンスが実行されていない場合でも、この情報にアクセスできます。

  • シリアル コンソールへのインタラクティブ アクセスを有効にする。

    インスタンスのシリアル コンソールへのインタラクティブ アクセスを有効にすると、インスタンスが完全に起動しなくても、インスタンスにログインして起動の問題をデバッグできます。詳細については、シリアル コンソールとのやり取りをご覧ください。

  • ディスクに有効なファイル システムがあることを確認する。

    ファイル システムが破損しているなど、有効でない場合は、インスタンスを起動することはできません。ディスクのファイル システムを確認します。

    1. 問題のディスクを接続先のインスタンスから接続解除します(該当する場合)。

      gcloud compute instances delete old-instance --keep-disks boot

    2. Google が提供する最新のイメージを使用して新しいインスタンスを作成します。

      gcloud compute instances create debug-instance

    3. 問題のディスクを非ブートディスクとしてアタッチします。マウントはしないでください。次の例の DISK を問題のディスクの名前に置き換えます。インスタンス上のディスクを識別するデバイス名をメモします。

      gcloud compute instances attach-disk debug-instance 
      --disk DISK
      --device-name debug-disk

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

      gcloud compute ssh debug-instance

    5. ディスクのルート パーティションを見つけます。part1 と記載されているのがルート パーティションです。この例では、ディスクのルート パーティションは /dev/sdb1 にあります。

      ls -l /dev/disk/by-id
      total 0
      lrwxrwxrwx 1 root root  9 Jan 22 17:09 google-debug-disk -> ../../sdb
      lrwxrwxrwx 1 root root 10 Jan 22 17:09 google-debug-disk-part1 -> ../../sdb1
      lrwxrwxrwx 1 root root  9 Jan 22 17:02 google-persistent-disk-0 -> ../../sda
      lrwxrwxrwx 1 root root 10 Jan 22 17:02 google-persistent-disk-0-part1 -> ../../sda1
      lrwxrwxrwx 1 root root  9 Jan 22 17:09 scsi-0Google_PersistentDisk_debug-disk -> ../../sdb
      lrwxrwxrwx 1 root root 10 Jan 22 17:09 scsi-0Google_PersistentDisk_debug-disk-part1 -> ../../sdb1
      lrwxrwxrwx 1 root root  9 Jan 22 17:02 scsi-0Google_PersistentDisk_persistent-disk-0 -> ../../sda
      lrwxrwxrwx 1 root root 10 Jan 22 17:02 scsi-0Google_PersistentDisk_persistent-disk-0-part1 -> ../../sda1
      
    6. ルート パーティションでファイル システム チェックを実行します。

      sudo fsck /dev/sdb1
      fsck from util-linux 2.20.1
      e2fsck 1.42.5 (29-Jul-2012)
      /dev/sdb1: clean, 19829/655360 files, 208111/2621184 blocks
      

    7. ファイル システムをマウントします。

       sudo mkdir /mydisk
      
       sudo mount /dev/sdb1 /mydisk
      
    8. ディスクにカーネル ファイルがあることを確認します。

       ls /mydisk/boot/vmlinuz-*
      /mydisk/boot/vmlinuz-3.2.0-4-amd64
      
  • ディスクに有効なマスター ブートレコード(MBR)があることを確認する。

    永続ブートディスクがアタッチされたデバッグ インスタンス(/dev/sdb など)で次のコマンドを実行します。

     sudo parted /dev/sdb print
    

    MBR が有効であれば、ファイル システムに関する情報が表示されます。

     Disk /dev/sdb: 10.7GB
     Sector size (logical/physical): 512B/4096B
     Partition Table: msdos
     Disk Flags:
     Number  Start   End     Size    Type     File system  Flags
      1      2097kB  10.7GB  10.7GB  primary  ext4         boot
     

起動に関する問題を解決する

起動処理が失敗する場所を特定したら、次のいずれかのアクションを実行して問題を修正できます。

スタンドアロン ブートディスクの作成

インポートしたイメージを、一時 VM インスタンスにアタッチされているセカンダリ ディスクにマウントします。Cloud Console または gcloud ツールを使用して、アップロードしたイメージからスタンドアロン ディスクを作成し、スタンドアロン ディスクがアタッチされた一時 VM を作成します。このインスタンスを使用することで、スタンドアロン ディスクのファイルの変更や、イメージの起動の失敗に関する問題を解決できます。

Console

インポートしたブートディスク イメージからスタンドアロン ディスクを作成します。あるいは、ブートディスクをインスタンスから接続解除し、接続解除したブートディスクを代わりに使用してインスタンスを作成することもできます。

  1. Cloud Console で、[ディスク] ページに移動します。

    [ディスク] に移動

  2. [ディスクを作成] をクリックします。
  3. [ディスクの作成] ページで、次の属性を指定します。
    • ゾーン: Select a zone near you. You must use this same zone when you create your temporary instance.
    • ディスクソース タイプ: 画像
    • ソースイメージ: Specify the name of the boot disk image that you imported.
  4. ディスクを作成するには、[作成] をクリックします。

スタンドアロン ディスクをアタッチする一時インスタンスを作成し、Cloud Console 環境で機能するようにブートローダーを構成します。

  1. Google Cloud Console で、[VM インスタンス] ページに移動します。

    [インスタンス] に移動

  2. [インスタンスを作成] ボタンをクリックします。

  3. [インスタンスの作成] ページで、インスタンスの名前と、インスタンスを配置するゾーンを指定します。このゾーンは、スタンドアロン ディスクを作成したのと同じゾーンである必要があります。

  4. [管理、セキュリティ、ディスク、ネットワーク、単一テナンシー] セクションを展開します。

  5. [ディスク] タブの [追加ディスク] セクションで、[既存のディスクを接続] をクリックします。新しいセクションが表示されます。

  6. [ディスク] セクションで、作成したスタンドアロン ディスクをプルダウン リストから選択します。これによりスタンドアロン ディスクがインスタンスに接続されるため、ディスクをマウントしてディスクのコンテンツを後で変更できるようになります。

  7. [完了] をクリックしてディスクの接続を完了します。

  8. [作成] ボタンをクリックしてインスタンスを作成します。

gcloud

インポートしたブートディスク イメージからスタンドアロン ディスクを作成します。あるいは、ブートディスクをインスタンスから接続解除し、接続解除したブートディスクを代わりに使用してインスタンスを作成することもできます。

 gcloud compute disks create DISK_NAME 
--zone ZONE
--image IMAGE_NAME

次のように置き換えます。

  • DISK_NAME: 新しいスタンドアロン ディスクの名前。
  • ZONE: 近辺のゾーン。一時インスタンスを作成するときも、これと同じゾーンを使用する必要があります。
  • IMAGE_NAME: インポートしたブートディスク イメージの名前。

スタンドアロン ディスクをアタッチする一時インスタンスを作成し、Cloud Console 環境で機能するようにブートローダーを構成します。

gcloud compute instances create INSTANCE_NAME --zone ZONE --disk name=DISK_NAME

次のように置き換えます。

  • INSTANCE_NAME: インスタンスの一意の名前
  • ZONE: スタンドアロン ディスクを作成したゾーン
  • DISK_NAME: インポートしたブートディスク イメージから作成したスタンドアロン ディスクの名前

アタッチしたスタンドアロン ディスクを使用してインスタンスを作成すると、仮想環境が作成されます。この環境で、元のブートディスク イメージからブートローダーを変更できます。

ブートディスクの構成

インスタンスに接続し、スタンドアロン ディスクをマウントして、Compute Engine で正常に起動するようにブートローダーを構成します。

  1. ブラウザから SSH を使用するか gcloud compute ssh コマンドを使用して、一時インスタンスに接続します。
  2. blkid コマンドを使用して、変更するディスクと、マウントする必要のあるパーティションを識別します。この例では、/dev/sdb は、インポートしたディスクです。

    lsblk
    
    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda      8:0    0   10G  0 disk
    └─sda1   8:1    0   10G  0 part /
    sdb      8:16   0  100G  0 disk
    ├─sdb1   8:17   0   96G  0 part
    ├─sdb2   8:18   0    1K  0 part
    └─sdb5   8:21   0    4G  0 part
    
  3. スタンドアロン ディスクのルート パーティションを /tmp ディレクトリにマウントします。この例では、/dev/sdb1 がルート パーティションであり、他のパーティションについては変更する必要はありません。パーティション スキームによっては、複数のパーティションをマウントしなければ、変更する必要のあるすべてのファイルにアクセスできない場合もあります。

    sudo mount /dev/sdb1 /tmp
    
  4. ディスクの起動プロセスが失敗する原因となっている可能性のあるファイルを編集します。詳細については、ブートローダーの構成手順をご覧ください。

  5. 一時インスタンスからブートディスクのマウントを解除します。

    sudo umount /tmp
    

ブートディスクの使用

このディスクの構成が完了したら、ディスクを切断して、新しいインスタンスのブートディスクとして使用します。

Console

一時インスタンスからスタンドアロン ディスクを切断します。

  1. Google Cloud Console で、[VM インスタンス] ページに移動します。

    [インスタンス] に移動

  2. インスタンスのリストから、スタンドアロン ブートディスクを変更した一時インスタンスの名前をクリックします。インスタンスの詳細ページが開きます。

  3. インスタンス詳細ページの一番上で [編集] をクリックします。

  4. [追加ディスク] で、スタンドアロン ディスクの横にある [X] をクリックして、一時インスタンスからの切断を指定します。

  5. [保存] をクリックして、変更を保存します。

切断したスタンドアロン ディスクを使用してインスタンスを作成します。

  1. Google Cloud Console で、[VM インスタンス] ページに移動します。

    [インスタンス] に移動

  2. [インスタンスを作成] ボタンをクリックします。

  3. [インスタンスの作成] ページで、インスタンスの名前と、インスタンスを配置するゾーンを指定します。このゾーンは、スタンドアロン ディスクを作成したのと同じゾーンである必要があります。

  4. [ブートディスク] で [変更] をクリックし、ブートディスクの構成を開始します。

  5. [既存のディスク] タブで、スタンドアロン ブートディスクを選択し、新しいインスタンスのブートディスクとして使用します。

  6. [作成] ボタンをクリックしてインスタンスを作成します。

gcloud

一時インスタンスからスタンドアロン ディスクを切断します。

gcloud compute instances detach-disk INSTANCE_NAME --disk DISK_NAME

次のように置き換えます。

  • INSTANCE_NAME: インスタンスの一意の名前。
  • DISK_NAME: 新しいスタンドアロン ディスクの名前。

切断したスタンドアロン ディスクを使用してインスタンスを作成します。

gcloud compute instances create INSTANCE_NAME --zone ZONE --disk name=DISK_NAME,boot=yes

次のように置き換えます。

  • INSTANCE_NAME: インスタンスの一意の名前
  • ZONE: スタンドアロン ディスクが配置されているゾーン
  • DISK_NAME: インポートしたブートディスク イメージから作成したスタンドアロン ディスクの名前

変更したブートディスクを使用して、作成したインスタンスをテストします。インスタンスに接続できない状態のままである場合は、シリアル コンソールの出力を読み、起動プロセスが失敗した場所をもう一度確認します。ブートディスク イメージの問題が修正されるまで、トラブルシューティングの処理を繰り返します。

起動スクリプト

起動スクリプトの問題は、メタデータ サーバーとのネットワーク接続に関連している可能性があります。

  • Linux VM の場合、Compute Engine は、メタデータ サーバーとの接続を確認してから、メタデータ サーバーからカスタム起動スクリプトやシャットダウン スクリプトなどの情報を取得します。メタデータ サーバーが応答していないか、ネットワークが構成されていない場合、VM は起動を完了しません。

  • v20160606 より前のイメージを使用する Linux VM の場合、シリアルポート出力に "Waiting for metadata server, attempt N" が表示されます。N は試行回数を表します。

    この問題は、一時的なネットワークの問題によって最大 7 分間続く場合がありますが、自動的に解決されます。7 分経っても問題が自動的に解決されない場合は、VM インスタンスを再作成してください。