共用方式為


Linux 虛擬機開機到 GRUB 救援

注意事項

本文中參考的 CentOS 是 Linux 發行版,並會到達生命周期結束 (EOL) 。 請考慮您的使用並據以規劃。 如需詳細資訊,請 參閱 CentOS 生命週期結束指引

本文討論造成 GRUB 救援問題的多個條件,並提供疑難解答指引。

在開機程式期間,開機載入器會嘗試找出Linux核心並關閉開機控件。 如果無法執行此遞交,虛擬機 (VM) 進入 GRUB 救援控制台。 GRUB 救援控制台提示不會顯示在 Azure 序列控制台記錄中,但可在 Azure 開機診斷螢幕快照中顯示。

識別 GRUB 救援問題

在 Azure 入口網站 的 [VM 開機診斷] 頁面中檢視開機診斷螢幕快照。 此螢幕快照有助於診斷 GRUB 修復問題,並判斷開機錯誤是否會造成問題。

下列文字是 GRUB 救援問題的範例:

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

針對 GRUB 離線的救援問題進行疑難解答

  1. 若要針對 GRUB 救援問題進行疑難解答,必須要有救援/修復 VM。 使用 vm repair 命令 來建立已鏈接受影響 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 入口網站 中還原 Azure VM 數據

如需詳細的錯誤、可能的原因和解決方案,請參閱下列各節。

注意事項

在下列各節所述的命令中,將 取代 /dev/sdX 為對應的操作系統 (OS) 磁碟裝置。

錯誤:未知的文件系統

下列螢幕快照顯示錯誤訊息:

Grub 未知文件系統錯誤的螢幕快照。

此錯誤可能與下列其中一個問題相關聯:

修正 /boot 檔案系統損毀

  1. 檢查是否已建立救援/修復 VM。 如果未建立,請遵循 針對離線 GRUB 修復問題進行疑難解答 中的步驟 1 來建立 VM。

  2. 請參閱針對 Azure Linux 中的文件系統損毀錯誤進行疑難解答 ,以解決對應 /boot 磁碟分區中的損毀問題。

  3. 移至針對 離線的 GRUB 修復問題進行疑難解答 中的步驟 3,以交換 OS 磁碟。

重新安裝 GRUB 並重新產生 GRUB 組態檔

  1. 檢查是否已建立救援/修復 VM。 如果未建立,請遵循 針對離線 GRUB 修復問題進行疑難解答 中的步驟 1 來建立 VM。 在修復/修復 VM 中掛接所有必要的文件系統,包括 / 和 /boot,然後進入 Chroot 環境。

  2. 使用下列其中一個命令,重新安裝 GRUB 並重新產生對應的 GRUB 組態檔:

    • RHEL/CentOS/Oracle 7.x/8.x 沒有 UEFI 的 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
      
    • 具有 UEFI 的 RHEL/CentOS/Oracle 7.x/8.x Linux VM (Gen2)

      grub2-install /dev/sdX
      grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
      sed -i 's/hd2/hd0/g' /boot/efi/EFI/redhat/grub.cfg
      

      如果 VM 正在執行 CentOS,請以 grub.cfg 檔案絕對路徑 /boot/efi/EFI/centos/grub.cfg 中的 取代 redhatcentos

    • 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 18.04/20.04

      grub-install /dev/sdX
      update-grub
      
  3. 移至針對 離線的 GRUB 修復問題進行疑難解答 中的步驟 3,以交換 OS 磁碟。

錯誤 15:找不到檔案

下列螢幕快照顯示錯誤訊息:

找不到 grub 錯誤 15 檔案的螢幕快照。

若要解決此問題,請遵循下列步驟:

  1. 檢查是否已建立救援/修復 VM。 如果未建立,請遵循 針對離線 GRUB 修復問題進行疑難解答 中的步驟 1 來建立 VM。 在修復/修復 VM 中掛接所有必要的文件系統,包括 / 和 /boot ,然後進入 Chroot 環境。

  2. 檢查 /boot 文件系統內容,並判斷遺漏的內容。

  3. 如果遺漏 GRUB 組態檔, 請重新安裝 GRUB 並重新產生 GRUB 組態檔

  4. 確認 /boot 檔案系統中的檔案許可權是否正常。 您可以使用另一個執行相同 Linux 版本的 VM 來比較許可權。

  5. 如果遺漏整個 /boot 磁碟分區或其他重要內容,且無法復原,建議您從備份還原 VM。 如需詳細資訊,請參閱如何在 Azure 入口網站 中還原 Azure VM 數據

  6. 問題解決之後,請移至 針對離線 GRUB 修復問題進行疑難解答 中的步驟 3,以交換 OS 磁碟。

錯誤:找不到檔案 '/boot/grub2/i386-pc/normal.mod'

下列螢幕快照顯示錯誤訊息:

找不到 grub 錯誤 normal.mod 的螢幕快照。

  1. 檢查是否已建立救援/修復 VM。 如果未建立,請遵循 針對 GRUB 離線問題進行疑難解答 中的步驟 1 來建立一個。 在修復/修復 VM 中掛接所有必要的文件系統,包括 / 和 /boot,然後進入 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 ,請使用下列命令來重新建立它:

    注意事項

    下列步驟適用於 RHEL/CentOS/Oracle 7.x/8.x Linux VM,而不需要 UEFI (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. Create 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. 使用下列命令,識別資料分割資料表是否建立為 dosGPT 類型:

    sudo fdisk -l /dev/sdX
    
    • Dos 資料分割數據表

      此螢幕快照顯示具有 dos 類型數據分割數據表的開機。

    • GPT 磁碟分區數據表

      此螢幕快照顯示具有 GPT 類型資料分割數據表的開機。

  3. 如果數據分割數據表具有做為數據分割數據表類型的 dos ,請 在 dos 系統中重新建立 / boot 磁碟分區。 如果數據分割數據表具有 GPT 作為資料分割資料表類型,請 在 GPT 系統中重新建立 /boot 磁碟分區

  4. 請確定已使用適當的磁碟安裝 GRUB 開機載入器。 您可以遵循 重新安裝 GRUB 和重新產生 GRUB 組態檔 中的步驟來安裝和設定它。

  5. 請繼續進行針對 離線 GRUB 修復問題進行疑難解答 中的步驟 3,以交換 OS 磁碟。

在 dos 系統中重新建立 /boot 磁碟分區

  1. 使用下列命令重新建立 /boot 磁碟分區:

    sudo fdisk /dev/sdX
    

    使用 [第一個 ] 和 [ 最後 一個] 扇區中的預設值,並將 數據分割類型 (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 文件系統。 您應該能夠看到遺漏 /boot 磁碟分區) (專案 /dev/sdX1

    sudo blkid /dev/sdX1
    
    sudo blkid /dev/sdc1
    /dev/sdc1: UUID="<UUID>" TYPE="ext4"
    
  3. 如果在重新建立數據分割之後,在 中看不到 blkid /boot 文件系統,這表示 /boot 數據已不存在。 您必須使用 /etc/fstab /boot 專案) 中相同的 UUID 和文件系統格式,重新建立 /boot 文件系統 (,然後 從備份還原其內容

在 GPT 系統中重新建立 /boot 磁碟分區

  1. 使用下列命令重新建立 /boot 磁碟分區:

    sudo gdisk /dev/sdX
    

    使用 第一個最後 一個扇區中的預設值,以及 (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
    

    您應該能夠看到遺漏 /boot 磁碟分區) (專案 /dev/sdX1

    sudo blkid /dev/sdc1
    /dev/sdc1: UUID="<UUID>" BLOCK_SIZE="4096" TYPE="xfs" PARTLABEL="Linux filesystem" PARTUUID="<PARTUUID>"
    
  3. 如果重新建立數據分割之後看不到 /boot 文件系統,這表示 /boot 數據已不存在。 您必須使用 /etc/fstab /boot 專案) 中的相同 UUID,重新建立 /boot 文件系統 (,然後 從備份還原其內容

錯誤:找不到符號 'grub_efi_get_secure_boot'

下列螢幕快照顯示錯誤訊息:

找不到 grub 錯誤 'grub_efi_get_secure_boot' 的螢幕快照。

SLES 12 SP5) 中使用的 Linux 核心版本 4.12.14 (不支援 [安全開機 ] 選項。 因此,如果在部署 VM (期間啟用安全開機,也就是 [ 安全性類型 ] 字段會設定為 [ 信任的啟動虛擬機) ,當您嘗試在 Gen2 VM 映射上使用此 SUSE 核心版本時,虛擬機會透過控制台產生安全開機錯誤。

解決方案

若要解決開機錯誤,請遵循下列步驟:

  1. 檢查是否已建立救援/修復 VM。 如果未建立,請遵循 針對離線 GRUB 修復問題進行疑難解答 中的步驟 1 來建立 VM。 掛接所有必要的文件系統,包括 / 和 /boot,然後進入 Chroot 環境。

  2. 在 chroot 環境中執行下列 YaST 命令:

    yast2 bootloader
    
  3. 從 [ 啟用安全開機支援 ] 選項清除 “x”,然後選取 F10 以儲存變更。

    SUSE 控制台中 YaST2 開機載入器設定的螢幕快照。

  4. 請遵循針對 離線 GRUB 修復問題進行疑難解答 中的步驟 3 來交換 OS 磁碟。

其他 GRUB 救援錯誤

下列螢幕快照顯示錯誤訊息:

另一個 Grub 救援問題的螢幕快照。

下列其中一種情況會觸發這種錯誤:

  • GRUB 組態檔遺失。
  • 使用錯誤的 GRUB 組態。
  • /boot 磁碟分區或其內容遺失。

若要解決此錯誤,請遵循下列步驟:

  1. 檢查是否已建立救援/修復 VM。 如果未建立,請遵循 針對離線 GRUB 修復問題進行疑難解答 中的步驟 1 來建立 VM。 掛接所有必要的文件系統,包括 / 和 /boot,然後進入 Chroot 環境。

  2. 請確定已設定 /etc/default/grub 組態檔。 已 背書的 Azure Linux 映像 已經有必要的設定。 如需詳細資訊,請參閱下列文章:

  3. 重新安裝 GRUB 並重新產生 GRUB 組態檔

    注意事項

    如果遺漏的檔案是 /boot/grub/menu.lst,則此錯誤適用於 RHEL 6.x、Centos 6.x 和 Ubuntu 14.04) (舊版操作系統。 命令會有所不同,因為 GRUB 第 1 版會改用在這些系統中。 本文未涵蓋 GRUB 第 1 版。

  4. 如果遺漏整個 /boot 磁碟分區,請遵循 錯誤:沒有這類數據分割中的步驟。

  5. 問題解決之後,請移至 針對離線 GRUB 修復問題進行疑難解答 中的步驟 3,以交換 OS 磁碟。

後續步驟

如果特定開機錯誤不是 GRUB 修復問題,請參閱針對 Azure Linux 虛擬機器 開機錯誤進行疑難解答,以取得進一步的疑難解答選項。

協力廠商資訊免責聲明

本文提及的協力廠商產品是由與 Microsoft 無關的獨立廠商所製造。 Microsoft 不以默示或其他方式,提供與這些產品的效能或可靠性有關的擔保。

協力廠商連絡資訊免責聲明

Microsoft 提供第三方連絡資訊,協助您尋找有關本主題的其他資訊。 此連絡資訊如有變更,恕不另行通知。 Microsoft 不保證第三方聯繫人信息的正確性。

與我們連絡,以取得說明

如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以將產品意見反應提交給 Azure 意應見反社群