Ubuntu 伺服器、gpt 分區表、mdadm、grub 啟動失敗
基本工作系統細節:
我使用 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。