Ubuntu

Ubuntu 伺服器、gpt 分區表、mdadm、grub 啟動失敗

  • May 7, 2012

基本工作系統細節:

我使用 Ubuntu 12.04 伺服器 CD 安裝伺服器。

我有 4 個磁碟。在所有磁碟上,我執行了以下操作,類似於這個 howto

  • 創建了一個 2GB 的交換分區
  • 創建了一個 256 GB /boot 分區
  • 創建了一個 64 GB RAID10 分區(用於 root)
  • 創建了一個大的 RAID10 分區來佔用剩餘空間

我將引導格式化為ext3。我在根分區和大分區上設置了 RAID10。我將根目錄格式化為 ext4。我在大卷上創建了一個邏輯卷,並將其格式化為 ext4。

生成的系統工作正常,並且啟動正常。

問題詳情:

然後我決定記錄一個失敗的過程。作為第一步,我決定重新安裝 grub。

# grub-install /dev/sda
warn: This GPT partition label has no BIOS Boot Partition; embedding won't be possible!.
error: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and their use is discouraged..
# grub-install /dev/sdb
warn: This GPT partition label has no BIOS Boot Partition; embedding won't be possible!.
error: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and their use is discouraged..

所以看起來它失敗了,但也似乎它放棄了並且沒有做出改變。所以我重新啟動了。引導失敗。它只是掛在黑屏上,游標閃爍大約 4 行。如果我啟動時按住“Shift”鍵,我會在游標左側看到“GRUB”一詞,但沒有互動式提示。

此時,我使用boot-repair-disk生成了這個報告: http: //paste.ubuntu.com/966531/

請注意,在上面的報告中,它說引導載入程序沒有指向 core.img 的正確扇區。(sda是虛擬光碟;sdb是啟動盤;sdc是sdb的鏡像,但是boot沒有鏡像,只是有一個獨立的不相關分區,格式化了ext3;sdd和sde有引導空間但是沒有格式化)

然後我從 Ubuntu 伺服器 CD 啟動,啟動救援系統,並發出以下命令,完成沒有錯誤(其中 sda 是虛擬 CD,b、c、d、e 是磁碟,分別是 a、b、c ,d 在前面的 grub 命令中):

# parted /dev/sdb set 2 bios_grub on
# parted /dev/sdc set 2 bios_grub on
# grub-install /dev/sdb
# grub-install /dev/sdc

此時,我使用boot-repair-disk生成了這個報告: http: //paste.ubuntu.com/966561/

請注意,在上面的報告中,關於 core.img 的問題已經消失。它似乎指向正確的部門。

現在,如果我嘗試啟動,我會收到 grub 提示。如果我執行“set”,我會看到找到並設置了 root。如果我執行“ls /”,我會從 raid 卷中看到我的根目錄,包括 vmlinuz 核心文件。如果我輸入“ls /vmlinuz”,它會顯示“錯誤:找不到文件”。如果我使用“linux”命令嘗試載入核心,它會說同樣的錯誤。如果我使用“ls -l /”,則不會列出 vmlinuz 文件。

過於冗長的細節,以防您想遵循:

我注意到也沒有/boot/grub/grub.cfg,所以我跑了

# grub-mkconfig -o /boot/grub/grub.cfg

但問題依然存在。

如果我使用“gptsync”工具,這種行為沒有變化。

boot-repair-disk 不會修復系統,因為它希望我使用啟用 EFI 的 bios 啟動。我簡要地研究了這個,但我不知道它是如何工作的。我在啟動選項中找到了一個 UEFI shell,但我對此一無所知,也看不到如何從那裡更改啟動(例如,從那個 EFI shell 啟動 CD)。

我也讀過這個頁面,但是 Ubuntu 沒有附帶“grub”命令,所以我不能完全按照它。我可以簡單地安裝該命令,但我更想知道 Ubuntu 安裝程序是如何安裝它的,而不是使用不同的設置。它使用了阻止列表嗎?

這是在boot-repair-disk上啟動時 parted 的輸出(這裡 sdb 是第一個硬碟,從磁碟啟動時是 sda,第二個粘貼連結中的“boot”更改為“bios_grub”):

Model: ATA Hitachi HUA72303 (scsi)
Disk /dev/sdb: 3001GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system     Name   Flags
1      17.4kB  2000MB  2000MB  linux-swap(v1)  swap1
2      2000MB  2256MB  256MB   ext3            boot1  boot (this says bios_grub in 2nd link)
3      2256MB  66.3GB  64.0GB                  root1  raid
4      66.3GB  3001GB  2934GB                  data1  raid

這是一個無關的超級舊虛擬機進行比較(對於不熟悉boot-repair-disk的任何人): http: //paste.ubuntu.com/966799/

這是問題系統的最新粘貼,在執行上述 grub-mkconfig 後,還將“bios_grub”設置回“boot”。 http://paste.ubuntu.com/966808/

比較兩者,這看起來很有趣:

sdb2: __________________________________________________________________________

File system:       
Boot sector type:  Grub2's core.img
Boot sector info: 
Mounting failed:   mount: unknown filesystem type ''

md/bcserver8:0: ________________________________________________________________

File system:       ext4
Boot sector type:  -
Boot sector info: 
Operating System:  Ubuntu 12.04 LTS
Boot files:        /boot/grub/grub.cfg /etc/fstab /boot/grub/core.img

看起來raid有引導文件,sdb2沒有格式化。(儘管如此,系統在執行 grub-install 之前啟動)。從救援 CD 中,“mount -t ext3 /dev/sdb2 /boot”失敗。但這是有道理的,因為 grub 明確使用分區 2(parted 命令中的 2 將 bios_grub 設置為 on)。

所以我做了這樣的事情:

# mkfs.ext3 -L boot1 /dev/sdb2
# mv boot boot_on_root
# mkdir boot
# mount /dev/sdb2 boot
# rsync -avHP boot_on_root/ boot/
# parted /dev/sdb set 2 bios_grub on
# parted /dev/sdc set 2 bios_grub on
# grub-install /dev/sdb
# grub-install /dev/sdc

然後重新啟動,我又黑屏了,沒有提示。 http://paste.ubuntu.com/966848/

所以在這一點上,我的猜測是,當設置 bios_grub 時,grub 沒有安裝到 MBR,也沒有安裝到 ext3 上的 ext3 文件系統,而是安裝在分區本身上,就好像它是 EFI 一樣……這顯然會搞砸在那裡啟動 ext3 文件系統。從我對 EFI 的簡短閱讀中,聽起來 EFI 假設第一個分區是引導,但在我的情況下,第一個分區是交換,然後它應該是 FAT 而不是不可安裝的東西……所以因為這使得很少/沒有感覺,我仍然完全迷失了方向。

$$ EDIT:now I have a clue… skip down a bit for update $$ 現在,當我在boot-repair-disk中點擊修復時,它會詢問其他內容。上次錯誤隱藏在視窗下,我不得不將另一個拖走才能看到它。這次主視窗消失了,新視窗顯示:

GPT detected.       You may want to retry after creating a
BIOS-Boot partition (>1Mo, flag). Do you want to continue?

所以我點擊是,它說它修復成功,並創建另一個粘貼: http: //paste.ubuntu.com/966862/

但我仍然有一個閃爍的游標黑屏。

現在我的理論是引導被一個非胖非 EFI 的東西覆蓋,它只是 grub 程式碼,否則之前會在扇區 0-63 中。幸運的是,我在此頁面上遇到了一個非常明確的聲明,這可能完成了我對這一切意味著什麼的理解。然後在我發現之後,Jeremy 發布了一個答案,如果為真,則確認這是缺少的關鍵概念。 http://blog.psych0tik.net/2011/08/grub-embedding-blocklists-and-bios_grub-partitions/

問題:

到底是怎麼回事?為什麼 grub 無法啟動?為什麼它說“找不到文件”?

如果沒有我用 parted 設置的這個設置(Ubuntu 安裝程序沒有設置),為什麼 grub 不想安裝?我認為我只需要安裝一個單獨的 /boot ,它既不在 LVM 也不在軟體 RAID 中,因為我的根在 RAID 中,分區表是 GPT。

Ubuntu CD 安裝程序如何在沒有此問題且沒有 bios_grub 設置的情況下安裝它?

我也會考慮使用 EFI。如果這是一個好主意,並且有一個標準的設置方法,我總是願意學習新事物。

即使沒有回答我所有的問題,讓我開心的最快答案也是一組命令,我可以從救援 CD 執行這些命令,以與安裝 CD 相同的方式修復引導載入程序。如果我可以使用引導系統而不是 CD 來執行它們,那也將非常好。

解決方法是使用 bios_grub 分區,它與 /boot 分區不同。

預設情況下,bios_grub 分區為 1MiB,並且必須標記為 bios_grub。我的是我磁碟上的第一個分區。如果您的分區 2 實際上是 /boot 如 parted 建議的那樣,那將是不正確的,您應該創建另一個 1MiB 分區。

對於 GPT 和 GRUB2,最小的文件系統具有三個分區:bios_grub、root、swap。(不完全確定需要交換)

為什麼只執行“grub-install”後 grub 無法啟動?

未知…如果它清楚地說它不能嵌入,你會認為它不會修改任何東西,所以它不能工作。

為什麼它說“找不到文件”?

/vmlinuz 是使用引導分區的符號連結,並且引導分區已損壞。bios_grub 程式碼是在其 ext3 結構之上編寫的。這可能意味著 /boot 沒有掛載,並且在那裡看到的 grub 文件實際上位於不包含核心的根系統上。

為什麼 grub 不想在沒有我用 parted 設置的這個設置的情況下安裝

與 MBR 不同,GPT 分區表沒有空間用於引導載入程序。所以必須創建一個特定的分區來保存引導程式碼。在執行“grub-install”之前,使用以下命令指定這個分區:

   parted /dev/sda set 1 bios_grub on

我認為我需要的只是一個單獨的 /boot。Ubuntu CD 安裝程序如何在沒有 bios_grub 設置的情況下安裝它?

這個要求似乎是 Ubuntu 安裝程序所需的全部,但它創建了一個容易損壞的非標準系統。

當 GRUB 顯示“This GPT partition label has no BIOS Boot Partition ”時,它表示 bios_grub 分區,而不是 /boot。

引用自:https://serverfault.com/questions/386041