GRUB の復旧への Linux 仮想マシンの起動

適用対象: ✔️ Linux VM

注:

この記事で参照されている CentOS は Linux ディストリビューションであり、EOL (End Of Life) に到達します。 適宜、使用と計画を検討してください。 詳細については、「 CentOS End Of Life ガイダンスを参照してください。

まとめ

この記事では、GRUB の救助の問題を引き起こす複数の条件について説明し、トラブルシューティングのガイダンスを提供します。

ブート プロセス中に、ブート ローダーは Linux カーネルを見つけ、ブート コントロールを引き渡そうとします。 このハンドオフを実行できない場合、仮想マシン (VM) は GRUB の復旧コンソールに入ります。 GRUB の復旧コンソールプロンプトはAzureシリアル コンソール ログには表示されませんが、Azureブート診断のスクリーンショットに表示できます。

GRUB の救助の問題を特定する

Azure ポータルの VM Boot diagnostics ページで>ブート診断のスクリーンショット

次のテキストは、GRUB の救助の問題の例です。

error: file '/boot/grub2/i386-pc/normal.mod' not found.  
Entering rescue mode...  
grub rescue>

GRUB の復旧に関する問題をオフラインでトラブルシューティングする

  1. GRUB の復旧に関する問題のトラブルシューティングを行うには、復旧/修復 VM が必要です。 vm 修復コマンドを使用して影響を受ける VM の OS ディスクのコピーがアタッチされた修復 VM を作成します。 chrootを使用して、修復 VM に OS ファイル システムのコピーをマウントします。

    注:

    または、Azure ポータルを使用して、手動で復旧 VM を作成することもできます。 詳細については、「Azure ポータルを使用して OS ディスクを復旧 VM に接続して Linux VM をトラブルシューティングするを参照してください。

  2. GRUB の救助の問題を特定。 次のいずれかの GRUB 復旧の問題が発生した場合は、対応するセクションに移動して解決します。

  3. GRUB の復旧に関する問題が解決されたら、次の操作を実行します。

    1. 復旧/修復 VM からファイル システムのコピーのマウントを解除します。

    2. az vm repair restore コマンドを実行して、修復された OS ディスクを VM の元の OS ディスクにスワップします。 詳細については、「Azure仮想マシンの修復コマンドを使用して Linux VM を修復する」の手順 5 を参照>。

    3. AZUREシリアル コンソールを確認するか、VM に接続して VM を起動できるかを確認します。

  4. /bootパーティション全体またはその他の重要なコンテンツが見つからないので復旧できない場合は、バックアップから VM を復元することをお勧めします。 詳細については、「Azure ポータルで VM データAzure復元する方法を参照してください。

詳細なエラー、考えられる原因、および解決策については、次のセクションを参照してください。

注:

以降のセクションで説明するコマンドで、 /dev/sdX を対応するオペレーティング システム (OS) ディスク デバイスに置き換えます。

Azure Linux 自動修復を使用して GRUB を再インストールし、GRUB 構成ファイルを再生成する。

Azure Linux 自動修復 (ALAR) スクリプトは、Azure Linux 自動修復 (ALAR) を使用して Linux VM を修正する に記載されている VM 修復拡張機能の一部です。 ALAR では、GRUB の復旧に関する問題など、複数の修復シナリオの自動化について説明します。

ALAR スクリプトでは、修復拡張機能 repair-button を使用して、第 1 世代 VM に --button-command grubfix を指定するか、第 2 世代 VM に --button-command efifix を指定して GRUB の問題を修正します。 このパラメーターは、自動回復をトリガーします。 GRUB を再インストールし、対応する構成ファイルを再生成することで、一般的な GRUB エラーの修正を自動化するには、次のコマンドを実装します。

  • UEFI を使用しない Linux VM (BIOS ベース - Gen1):

    az extension add -n vm-repair
    az extension update -n vm-repair
    az vm repair repair-button --button-command 'grubfix' --verbose $RGNAME --name $VMNAME
    
  • UEFI (Gen2) を使用する Linux VM:

    az extension add -n vm-repair
    az extension update -n vm-repair
    az vm repair repair-button --button-command 'efifix' --verbose $RGNAME --name $VMNAME
    

重要

それに応じて、リソース グループ名 $RGNAME と VM 名 $VMNAME 置き換えます。

修復 VM スクリプトは、ALAR スクリプトと組み合わせて、リソース グループ、修復 VM、および影響を受ける VM の OS ディスクのコピーを一時的に作成します。 GRUB を再インストールし、対応する GRUB 構成ファイルを再生成した後、破損した VM の OS ディスクをコピーした固定ディスクと交換します。 最後に、 repair-button スクリプトは、一時的な修復 VM を含むリソース グループを自動的に削除します。

GRUB を再インストールし、GRUB 構成ファイルを手動で再生成する

  1. 復旧/修復 VM が作成されたかどうかを確認します。 作成されていない場合は、 GRUB の復旧に関する問題をオフラインでトラブルシューティング の手順 1 に従って VM を作成します。 //bootを含め、必要なすべてのファイル システムを復旧/修復 VM にマウントし、chroot 環境に入ります。

  2. 次のいずれかのコマンドを使用して、GRUB を再インストールし、対応する GRUB 構成ファイルを再生成します。

    • UEFI を使用しない RHEL/CentOS/Oracle 7.x/8.x/9.x Linux VM (BIOS ベース - Gen1)

      grub2-install /dev/sdX
      grub2-mkconfig -o /boot/grub2/grub.cfg
      sed -i 's/hd2/hd0/g' /boot/grub2/grub.cfg
      
    • RHEL/CentOS/Oracle 7.x/8.x/9.x Linux VM と UEFI (Gen2)

      yum reinstall grub2-efi-x64 shim-x64
      grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
      sed -i 's/hd2/hd0/g' /boot/efi/EFI/redhat/grub.cfg
      

      VM が CentOS を実行している場合は、redhatcentos ファイルの絶対パス /boot/efi/EFI/centos/grub.cfg 内のに置き換えます。

    • SLES 12/15 Gen1 と Gen2

      grub2-install /dev/sdX
      grub2-mkconfig -o /boot/grub2/grub.cfg
      sed -i 's/hd2/hd0/g' /boot/grub2/grub.cfg
      
    • Ubuntu Gen1 と Gen2

      grub-install /dev/sdX
      update-grub
      
  3. 「GRUB の復旧に関する問題をオフラインでトラブルシューティング」の手順3に移動して、OS ディスクを交換します。

エラー: 不明なファイルシステム

次のスクリーンショットは、エラー メッセージを示しています。

grub 不明なファイル システム エラーのスクリーンショット。

このエラーは、次のいずれかの問題に関連付けられている可能性があります。

/boot ファイル システムの破損を修正する

ファイル システム /boot 破損を修正するには、次の手順に従います。

  1. 復旧/修復 VM が作成されたかどうかを確認します。 作成されていない場合は、 GRUB の復旧に関する問題をオフラインでトラブルシューティング の手順 1 に従って VM を作成します。

  2. 対応する/bootパーティションの破損の問題を解決するには、Azure Linux のファイルシステムの破損エラーをトラブルシューティングを参照してください。

  3. オフラインで GRUB のレスキュー問題をトラブルシューティングの手順 3 に進み、OS ディスクを交換します。

エラー 15: ファイルが見つかりません

次のスクリーンショットは、エラー メッセージを示しています。

grub エラー 15 ファイルが見つからないスクリーンショット。

この問題を解決するには、次の手順を実行します。

  1. 復旧/修復 VM が作成されたかどうかを確認します。 作成されていない場合は、 GRUB の復旧に関する問題をオフラインでトラブルシューティング の手順 1 に従って VM を作成します。 //bootを含め、必要なすべてのファイル システムを復旧/修復 VM にマウントし、chroot 環境に入ります。

  2. /bootファイル システムの内容を調べて、不足しているものを特定します。

  3. GRUB 構成ファイルがない場合は、GRUB を再インストールし、手動で GRUB 構成ファイルを再生成します。

  4. /boot ファイル システムのファイルアクセス許可が OK であることを確認します。 同じ Linux バージョンを実行している別の VM を使用して、アクセス許可を比較できます。

  5. /boot パーティション全体またはその他の重要な内容が見つからないので復旧できない場合は、バックアップから VM を復元することをお勧めします。 詳細については、「Azure ポータルで VM データAzure復元する方法を参照してください。

  6. 問題が解決したら、「 GRUB の復旧に関する問題をオフラインでトラブルシューティングする」の手順 3 に進み OS ディスクを交換します。

エラー: ファイル '/boot/grub2/i386-pc/normal.mod' が見つかりません

次のスクリーンショットは、エラー メッセージを示しています。

スクリーンショット: grub エラー normal.mod が見つからない。

  1. 復旧/修復 VM が作成されたかどうかを確認します。 作成されていない場合は、「 GRUB の復旧に関する問題をオフラインでトラブルシューティングする の手順 1 に従って作成します。 //bootを含め、必要なすべてのファイル システムを復旧/修復 VM にマウントし、chroot 環境に入ります。

  2. 破損エラーが原因で /boot ファイル システムをマウントできない場合は、/boot ファイル システムの破損 修正

  3. chroot 内にある場合は、 /boot/grub2/i386-pc ディレクトリ内の内容を確認します。 コンテンツが見つからない場合は、 /usr/lib/grub/i386-pcから内容をコピーします。 これを行うには、次のコマンドを使用します。

    ls -l /boot/grub2/i386-pc
    cp -rp /usr/lib/grub/i386-pc /boot/grub2
    
  4. /boot パーティションの内容が空の場合は、次のコマンドを使用して再作成します。

    注:

    次の手順は、UEFI を使用しない RHEL/CentOS/Oracle 7.x/8.x Linux VM (BIOS ベース - Gen1) に適用されます。

    1. chroot プロセスの下で、grub を再インストールします。 それに応じて /dev/sd[X] 修復/復旧 VM に接続されている OS ディスクの対応するコピーに置き換えます。

      grub2-install /dev/sd[X]
      
    2. リポジトリの名前を解決するために、 /etc/resolv.conf に有効な DNS エントリがあることを確認します。

      cat /etc/resolv.conf
      
    3. カーネルを再インストールします。

      yum reinstall $(rpm -qa | grep -i kernel)
      
    4. grub.cfg ファイルを作成します。

      grub2-mkconfig -o /boot/grub2/grub.cfg
      sed -i 's/hd2/hd0/g' /boot/grub2/grub.cfg
      
  5. 「GRUB の復旧に関する問題をオフラインでトラブルシューティング」ガイドの手順 3に進み、OS ディスクを入れ替えます。

エラー: そのようなパーティションはありません

次のスクリーンショットは、エラー メッセージを示しています。

このようなパーティションがない grub エラーのスクリーンショット。

このエラーは、次のいずれかのシナリオで RHEL ベースの VM (Red Hat、Oracle Linux、CentOS) で発生します。

  • /bootパーティションは誤って削除されます。
  • 間違った開始セクターと終了セクターを使用して、 /boot パーティションが再作成されます。

解決策: /boot パーティションを再作成する

/boot パーティションがない場合は、次の手順に従って再作成します。

  1. 復旧/修復 VM が作成されたかどうかを確認します。 作成されていない場合は、 GRUB の復旧に関する問題をオフラインでトラブルシューティング の手順 1 に従って VM を作成します。

  2. 次のコマンドを使用して、パーティション テーブルが dos または GPT 型として作成されているかどうかを確認します。

    sudo fdisk -l /dev/sdX
    
    • DOS パーティション・テーブル

      dos 型のパーティション テーブルを使用したブートを示すスクリーンショット。

    • GPT パーティション テーブル

      GPT 型パーティション テーブルでのブートを示すスクリーンショット。

  3. パーティション テーブルにパーティション テーブルの種類としてdosがある場合は、dos システムで /boot パーティションを作成。 パーティション テーブルの種類としてパーティション テーブルに GPT がある場合は、GPT システムで /boot パーティションを作成

  4. 適切なディスクを使用して GRUB ブート ローダーがインストールされていることを確認します。 GRUB を再インストールし、GRUB 構成ファイルを手動で再生成してインストールと構成を行うことができます。

  5. Troubleshoot GRUB の復旧問題オフライン の手順 3 に進んで、OS ディスクを交換します。

dos システムで /boot パーティションを再作成する

  1. 次のコマンドを使用して、復旧/修復 VM から /boot パーティションを再作成します。

    sudo fdisk /dev/sdX
    

    First および Last セクター、およびパーティションの種類 (83) の既定値を使用します。 次の出力に示すように、/boot パーティション テーブルが、a ツールの fdisk オプションを使用して起動可能としてマークされていることを確認します。

    sudo fdisk /dev/sdc
    
    The device presents a logical sector size that is smaller than
    the physical sector size. Aligning to a physical sector (or optimal
    I/O) size boundary is recommended, or performance may be impacted.
    Welcome to fdisk (util-linux 2.23.2).
    
    Changes will remain in memory only, until you decide to write them.
    Be careful before using the write command.
    
    Command (m for help): n
    Partition type:
       p   primary (1 primary, 0 extended, 3 free)
       e   extended
    Select (default p): p
    Partition number (1,3,4, default 1): 1
    First sector (2048-134217727, default 2048):
    Using default value 2048
    Last sector, +sectors or +size{K,M,G} (2048-2099199, default 2099199):
    Using default value 2099199
    Partition 1 of type Linux and of size 1 GiB is set
    
    Command (m for help): t
    Partition number (1,2, default 2): 1
    Hex code (type L to list all codes): 83
    Changed type of partition 'Linux' to 'Linux'
    
    Command (m for help): a
    Partition number (1,2, default 2): 1
    
    Command (m for help): p
    
    Disk /dev/sdc: 68.7 GB, 68719476736 bytes, 134217728 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 4096 bytes
    I/O size (minimum/optimal): 4096 bytes / 4096 bytes
    Disk label type: dos
    Disk identifier: 0x000b7179
    
    Device Boot      Start         End      Blocks   Id  System
    /dev/sdc1   *        2048     2099199     1048576   83  Linux
    /dev/sdc2         2099200   134217727    66059264   8e  Linux LVM
    
    Command (m for help): w
    The partition table has been altered!
    
    Calling ioctl() to re-read partition table.
    
  2. 不足している /boot パーティションを再作成した後、 /boot ファイル システムが検出されたかどうかを確認します。 /dev/sdX1 (不足している /boot パーティション) のエントリが表示されるはずです。

    sudo blkid /dev/sdX1
    
    sudo blkid /dev/sdc1
    /dev/sdc1: UUID="<UUID>" TYPE="ext4"
    
  3. パーティションを再作成した後に /boot ファイル システムが blkid に表示されない場合は、 /boot データが存在しなくなったことを意味します。 (/boot/etc/fstab エントリにあるのと同じ UUID 形式とファイル システム形式を使用して) /bootファイル システムを再作成し、その内容をバックアップから再ストアする必要があります

GPT システムで /boot パーティションを再作成する

  1. 次のコマンドを使用して、復旧/修復 VM から /boot パーティションを再作成します。

    sudo gdisk /dev/sdX
    

    次の出力に示すように、 First および Last セクター、および パーティションの種類 (8300) の既定値を使用します。

    sudo gdisk /dev/sdc
    GPT fdisk (gdisk) version 1.0.3
    
    Partition table scan:
      MBR: protective
      BSD: not present
      APM: not present
      GPT: present
    
    Found valid GPT with protective MBR; using GPT.
    
    Command (? for help): n
    Partition number (1-128, default 1): 1
    First sector (34-134217694, default = 1026048) or {+-}size{KMGTP}:
    Last sector (1026048-2050047, default = 2050047) or {+-}size{KMGTP}:
    Current type is 'Linux filesystem'
    Hex code or GUID (L to show codes, Enter = 8300):
    Changed type of partition to 'Linux filesystem'
    
    Command (? for help): p
    Disk /dev/sdc: 134217728 sectors, 64.0 GiB
    Model: Virtual Disk
    Sector size (logical/physical): 512/4096 bytes
    Disk identifier (GUID): 6D915856-445A-4513-97E4-C55F2E1AD6C0
    Partition table holds up to 128 entries
    Main partition table begins at sector 2 and ends at sector 33
    First usable sector is 34, last usable sector is 134217694
    Partitions will be aligned on 2048-sector boundaries
    Total free space is 6076 sectors (3.0 MiB)
    
    Number  Start (sector)    End (sector)  Size       Code  Name
       1         1026048         2050047   500.0 MiB   8300  Linux filesystem
       2         2050048       134215679   63.0 GiB    8E00
      14            2048           10239   4.0 MiB     EF02
      15           10240         1024000   495.0 MiB   EF00  EFI System Partition
    
    Command (? for help): w
    
    Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
    PARTITIONS!!
    
    Do you want to proceed? (Y/N): Y
    OK; writing new GUID partition table (GPT) to /dev/sdc.
    Warning: The kernel is still using the old partition table.
    The new table will be used at the next reboot or after you
    run partprobe(8) or kpartx(8)
    The operation has completed successfully.
    
  2. 次のコマンドを使用して、 /boot ファイル システムがシステムによって検出されているかどうかを確認します。

    sudo blkid /dev/sdX1
    

    /dev/sdX1のエントリ (不足している/boot パーティション) を確認できる必要があります。

    sudo blkid /dev/sdc1
    /dev/sdc1: UUID="<UUID>" BLOCK_SIZE="4096" TYPE="xfs" PARTLABEL="Linux filesystem" PARTUUID="<PARTUUID>"
    
  3. パーティションを再作成した後に /boot ファイル システムが表示されない場合は、 /boot データが存在しなくなったことを意味します。 (/boot/etc/fstab エントリにあるのと同じ UUID を使用して) /bootファイル システムを再作成し、その内容をバックアップから再ストアする必要があります

エラー: シンボル 'grub_efi_get_secure_boot' が見つかりません

次のスクリーンショットは、エラー メッセージを示しています。

grub エラー 'grub_efi_get_secure_boot' が見つからないスクリーンショット。

Linux カーネル バージョン 4.12.14 (SLES 12 SP5 で使用) では、 セキュア ブート オプションはサポートされていません。 そのため、VM のデプロイ中にセキュア ブートが有効になっている場合 (つまり、 Security type フィールドが Trusted launch virtual machines に設定されている場合、Gen2 VM イメージでこの SUSE カーネル バージョンを使用して起動しようとすると、仮想マシンはコンソールからセキュア ブート エラーを生成します。

ソリューション

ブート エラーを解決するには、次の手順に従います。

  1. 復旧/修復 VM が作成されたかどうかを確認します。 作成されていない場合は、 GRUB の復旧に関する問題をオフラインでトラブルシューティング の手順 1 に従って VM を作成します。 //bootなど、必要なすべてのファイル システムをマウントし、chroot 環境に入ります。

  2. chroot 環境で次の YaST コマンドを実行します。

    yast2 bootloader
    
  3. Enable Secure Boot Support オプションから "x" をクリアし、F10 を選択して変更を保存します。

    SUSE コンソールの YaST2 ブート ローダー設定のスクリーンショット。

  4. GRUB の復旧に関する問題をオフラインでトラブルシューティングの手順 3 に従って、OS ディスクを交換します。

その他の GRUB の復旧エラー

次のスクリーンショットは、エラー メッセージを示しています。

別の grub rescue 問題のスクリーンショット。

この種のエラーは、次のいずれかのシナリオでトリガーされます。

  • GRUB 構成ファイルがありません。
  • 間違った GRUB 構成が使用されています。
  • /boot パーティションまたはその内容が見つかりません。

この問題を解決するには、次の手順を実行します。

  1. 復旧/修復 VM が作成されたかどうかを確認します。 作成されていない場合は、 GRUB の復旧に関する問題をオフラインでトラブルシューティング の手順 1 に従って VM を作成します。 //bootなど、必要なすべてのファイル システムをマウントし、chroot 環境に入ります。

  2. /etc/default/grub構成ファイルが構成されていることを確認します。 保証済みのAzure Linux イメージには、既に必要な構成があります。 詳細については、次の記事を参照してください。

  3. GRUB を再インストールし、GRUB 構成ファイルを手動で再生成します

    注:

    不足しているファイルが /boot/grub/menu.lstされている場合、このエラーは古い OS バージョン (RHEL 6.x、Centos 6.x、Ubuntu 14.04) に対して発生します。 代わりに GRUB バージョン 1 がこれらのシステムで使用されるため、コマンドは異なります。 GRUB バージョン 1 については、この記事では説明しません。

  4. /boot パーティション全体が見つからない場合は、「エラー: そのようなパーティションがない」の手順に従います。

  5. 問題が解決したら、「 GRUB の復旧に関する問題をオフラインでトラブルシューティングする」の手順 3 に進み OS ディスクを交換します。

次のステップ

特定のブート エラーが GRUB の復旧の問題でない場合は、Azure Linux Virtual Machines のブート エラーのトラブルシューティング オプションを参照して、さらなるトラブルシューティング オプションを確認してください。

サードパーティの情報に関する免責事項

この記事で説明するサードパーティ製品は、Microsoftに依存しない企業によって製造されています。 Microsoftは、これらの製品の性能または信頼性について、黙示的またはその他の方法で何の保証も行いません。

サードパーティのお問い合わせ窓口に関する免責事項

Microsoftは、このトピックに関する追加情報を見つけるのに役立つサード パーティの連絡先情報を提供します。 この連絡先情報は予告なしに変更されることがあります。 Microsoftは、第三者の連絡先情報の正確性を保証するものではありません。