Win7系統重裝,Ubuntu LINUX啓動項丟失,如何恢復(終極版)

實驗室一臺Intel服務器上安裝了3個子系統: windows, Ubuntu LINUX 和 Ubuntu Wubi 僞LINUX系統。Linux系統下安裝了hadoop集羣。這幾天實驗室服務器重裝了Windows 7(Win7),結果LINUX啓動菜單項全部丟失。只能進入Win7,無法進入Linux hadoop。

由於是兩個Ubuntu Linux系統啓動菜單項丟失,所以 恢復起來麻煩了很多。最後的恢復竟然如此簡單:easybcd + linux命令(grub-mkconfig -o grub.cfg)。

難度大一點的方法是: 安裝grub4dos在C:\盤,然後編輯啓動菜單menu.lst。可參照menu.lst樣本,修改下。這是個可行的方法。或者 安裝 grub2win在C:\盤,然後編輯C:\grub\grub.cfg。menu.lst是grub 1的配置文件,grub.cfg是grub 2的配置文件。有一個比較大的命令差別,grub 1的分區號從0開始。例如:(hd0,8)是第一塊硬盤(hd0)的9號分區,等價於 grub 2 的 (hd0,msdos9)或(hd0,9)。

grub4dos與Grub2Win是一個將Linux下的GNU GRUB啓動引導程序移植到dos和windows的一個分支,是一個大幅度提高了軟件和硬件兼容性的啓動引導程序。後面再說。

安裝了多操作系統(Win,Linux)的電腦啓動時候,會出現啓動菜單項,這個菜單項是由引導器加載的。

Windows的引導器是 ntloader(WinNT,Win2K,XP), bootmgr(Win7)。

Linux的引導器Lilo, grub, grub2。Lilo是遠古時代的主流引導器,現在是grub2時代了。

其他Unix(Solaris, AIX, HP-UX, IRIX, SCO UNIX等)各有法寶引導系統。

grub 是一個來自GNU項目的多操作系統啓動程序。允許用戶在計算機啓動時選擇希望運行的操作系統。grub 可用於選擇操作系統分區上的不同內核,也可用於向這些內核傳遞啓動參數。

grub比較中立,可引導啓動Windows與Linux。

磁盤分區情況:
--------------------------------------------------
C:Win7 | Swap | Linux | D: | E:Win + ubuntu | F: |
--------------------------------------------------
第一主分區安裝Win7,第二(Swap)、第三(Linux / ext4類型)主分區安裝 ubuntu Linux(kernel 3.5), 剩下三個分區D:/E:/F:是Win7邏輯分區。

其中,E:\ubuntu\用wubi安裝了第2個Ubuntu Linux系統(kernel 3.2)。這其實是一個僞Linux系統,linux被安裝在Win7 NTFS盤內。當進入僞linux後,E:\ubuntu\disks\root.disk被加載爲/分區,swap.disk被加載爲交換分區,即虛存。

一、假若我的Ubuntu 僞Linux安裝在E:\ubuntu, 如何恢復?

1. 最簡單的方法如下(easybcd):
(1)拷貝 E:/ubuntu/winboot/下的 wubidr和wubidr.mbr文件拷到C:\
這2個文件是 ubuntu wubi引導ubuntu linux的引導器。

(2)添加Win7啓動菜單項 Ubuntu Linux:
easybcd 是一個方便的 Windows7 的啓動菜單編輯器程序,Win7 自帶的是 bcdedit指令, 在命令提示符窗口 操作比較麻煩:
=========================================================
a. 創建菜單項, 得到菜單項id:
bcdedit /create /d "Ubuntu Linux" /application bootsector

會有回顯,類似如下格式:
項 {5aaafed3-e895-11e2-a7a0-80bcca81b8b7} 成功創建。
5aaafed3-e895-11e2-a7a0-80bcca81b8b7 是我的菜單項 id。

b. 設置菜單項內容:
bcdedit /set {5aaafed3-e895-11e2-a7a0-80bcca81b8b7} device partition=E:
bcdedit /set {5aaafed3-e895-11e2-a7a0-80bcca81b8b7} path \ubuntu\winboot\wubildr.mbr
bcdedit /set {5aaafed3-e895-11e2-a7a0-80bcca81b8b7} description "Ubuntu Linux"
bcdedit /displayorder {id} /addlast

這裏,wubildr.mbr 是Ubuntu wubi引導器。新加的菜單項放在最後一條(/addlast)。

(上述bcdedit命令必須以管理員身份執行,否則報錯)
(太複雜了。改用如下的easybcd)
=========================================================

安裝easybcd 中文版,添加多個啓動菜單項(grub,grub2),圖形操作,完全傻瓜式,無需鍵入 bededit 指令去添加。上述bcdedit指令太複雜,用easybcd吧。一次添加2個Ubuntu的啓動菜單。


二、恢復了一個linux,假若還想恢復第二個linux呢?
或者,我想看看系統是怎麼寫啓動菜單項的(grub menu.lst或grub2 grub.cfg)?

grub 工作目錄是 /boot/grub

在linux下執行: grub-mkconfig -o grub.cfg
該命令會自動偵測系統的其他linux系統,加入菜單項, -o 生成grub菜單文件。

當然,先把原先的grub.cfg備份一份:
cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bak
grub-mkconfig -o /boot/grub/grub.cfg

重啓系統,發現多了幾個菜單。

其關鍵的菜單項是怎麼寫的?對於書寫你的 grub menu.lst(grub4dos menu.lst) 或 grub2 grub.cfg有幫助。

1. 我的Ubuntu 僞Linux 安裝在E:\ubuntu(kernel 3.2)
E:盤是Win7 NTFS格式。該僞linux如何工作?首先,linux會把root.disk文件加載爲根分區(/ ext4格式)。就像加載iso光盤一樣(loopback)。

E:\ubuntu\disk\root.disk 怎麼能找到呢?- 通過 分區卷標Label 或者 文件號uuid 找到。如:我的E:盤 Label是 DataLab, uuid是 6CE8A383E8A34A62, grub分區是 (hd0,msdos7)。第一個硬盤hd0的第七個分區msdos7。
磁盤分區情況:
--------------------------------------------------
C:Win7 | Swap | Linux | D: | E:Win + ubuntu | F: |
--------------------------------------------------
msdos1msdos5 msdos9 msdos6msdos7msdos8
這是我的 分區。你的呢?

search 查詢語句語法:
search [--file|--label|--fs-uuid] [--set [var]] [--no-floppy] name

search --fs-uuid 6CE8A383E8A34A62 或者
search --label DataLab

--set root 意思是設置查詢起點/

--no-floppy 表示不去檢索軟驅。

分區不記得了,咋辦?一個個去試探。進入grub命令行。
insmod ntfs# 安裝win ntfs模塊
ls# 查看所有硬盤和分區
ls (hd0,x)/# x是安裝linux分區號, msdosx也行
ls (hd0,7)/# 查看7號分區文件,msdos7也行
ls (hd0,7)# 查看7號分區: uuid, lable

找到了你的ubuntu linux?是的: (hd0,7)。hd0表示第一塊硬盤。
set root=(hd0,7)# 7 是 ubuntu分區號, 我的E:盤
search --no-floppy --fs-uuid --set=root 6CE8A383E8A34A62
#這裏的 uuid是 E:盤的 uuid = 6CE8A383E8A34A62

有童鞋問,幹嘛不直接說 E:盤?set root=E:?E:盤是Windows的標記,Unix或Linux沒有這一說。就像武漢人說喫早餐爲:過早,其他地方可不懂什麼是過早了。廣東人說 喝早茶。可不是喫早餐就喝一點茶水喔^_^

我的電腦裏,(hd0,7) 就是 第一塊硬盤的E:盤。當然,這臺入門級服務器只有一塊sata硬盤。

### 設置啓動菜單項 /etc/grub.d/10_lupin ###
# 這裏面是 grub命令喔
insmod part_msdos
insmod ntfs
set root='(hd0,msdos7)'
search --no-floppy --fs-uuid --set=root 6CE8A383E8A34A62
loopback loop0 /ubuntu/disks/root.disk
set root=(loop0)
linux /boot/vmlinuz-3.2.0-29-generic-pae root=UUID=6CE8A383E8A34A62 loop=/ubuntu/disks/root.disk ro   quiet splash vt.handoff=7
initrd /boot/initrd.img-3.2.0-29-generic-pae

loopback loop0 /ubuntu/disks/root.disk
是加載 e:\ubuntu\disks\root.disk文件。就像iso光盤鏡像一樣加載。

注意:unix/linux是沒有盤符的(e:), 盤符e:是windows的標記。目錄分隔符也不同,unix/linux是/, windows是\。

set root=(loop0)# 重設root
加載後 作爲 linux系統的/根分區。就像C:\(windows)。

linux /boot/vmlinuz-3.2.0 ... 加載內核vmlinuz
initrd /boot/initrd.img-3.2.0 ... 加載初始化ramdisk

這裏,比較有趣的是(加載內核,指定根分區):
(就像我的Win7指定C:盤是系統啓動盤,C:\是Win7系統根\分區)
linux /boot/vmlinuz-3.2.0 ... root=UUID=6CE8A383E8A34A62 ...

通常是:
linux /boot/vmlinuz-3.2.0 ... root=/dev/sda7 ...

有點暈?我畫圖說明:
磁盤分區情況:
--------------------------------------------------
C:Win7 | Swap | Linux | D: | E:Win + ubuntu | F: |
--------------------------------------------------
msdos1msdos5 msdos9 msdos6msdos7msdos8
這是我的 分區。
Windows是用盤符C: D: E: F:指定每個win分區,無法標記linux分區。

linux用符號表示分區設備(sda - scsi硬盤, hda - ide硬盤):
C:- sda1
D: - sda6
E: - sda7, uuid = 6CE8A383E8A34A62
F:- sda8
Swap交換分區 - sda5
Linux分區 - sda9

grub用(hdn,x)符號表示分區設備:
C:- (hd0,1)
D: - (hd0,6)
E: - (hd0,7), uuid = 6CE8A383E8A34A62
F:- (hd0,8)
Swap交換分區 - (hd0,5)
Linux分區 - (hd0,9)
上述,這是我的 分區。

當遇到故障,進入grub命令行,無法啓動時,可輸入上述命令:
insmod part_msdos
insmod ntfs
set root='(hd0,msdos7)'
search --no-floppy --fs-uuid --set=root 6CE8A383E8A34A62
loopback loop0 /ubuntu/disks/root.disk
set root=(loop0)
linux /boot/vmlinuz-3.2.0-29-generic-pae root=UUID=6CE8A383E8A34A62 loop=/ubuntu/disks/root.disk ro   quiet splash vt.handoff=7
initrd /boot/initrd.img-3.2.0-29-generic-pae
boot

回車後 可以進入linux系統了,修復grub引導文件:
update-grub2
reboot

或者 生成新的 正確的 grub.cfg。
當然,先把原先的grub.cfg備份一份:
cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bak
grub-mkconfig -o /boot/grub/grub.cfg

重啓系統,發現多了幾個菜單。

再看下 分區下安裝linux的情況。
### 設置啓動菜單項 /etc/grub.d/30_os-prober ###
# 這裏面是 grub命令喔
insmod part_msdos
insmod ext2
set root='(hd0,msdos9)'
search --no-floppy --fs-uuid --set=root d05e35b2-e458-41ef-ae22-4e4023302c4c
linux /boot/vmlinuz-3.5.0-26-generic root=UUID=d05e35b2-e458-41ef-ae22-4e4023302c4c ro quiet splash $vt_handoff
initrd /boot/initrd.img-3.5.0-26-generic

其中 有一句也可改寫爲:
linux /boot/vmlinuz-3.5.0-26-generic root=/dev/sda9 ro quiet splash $vt_handoff


弄清楚了嗎?

那麼,如果用grub4dos(windows版本的grub),先把grub4dos安裝於C:\下,簡單。然後修改 C:\menu.lst,也不難了(Win7 bootmgr作主引導器):
default 0
timeout 10

title Ubuntu hadoop AS (3.5.0-23-generic)
set root='(hd0,msdos9)'
search --no-floppy --fs-uuid --set=root d05e35b2-e458-41ef-ae22-4e4023302c4c
linux /boot/vmlinuz-3.5.0-26-generic root=UUID=d05e35b2-e458-41ef-ae22-4e4023302c4c ro quiet splash $vt_handoff
initrd /boot/initrd.img-3.5.0-26-generic

title Ubuntu hadoop AS (3.2.0-29-generic)
set root='(hd0,msdos7)'
search --no-floppy --fs-uuid --set=root 6CE8A383E8A34A62
loopback loop0 /ubuntu/disks/root.disk
set root=(loop0)
linux /boot/vmlinuz-3.2.0-29-generic-pae root=UUID=6CE8A383E8A34A62 loop=/ubuntu/disks/root.disk ro   quiet splash vt.handoff=7
initrd /boot/initrd.img-3.2.0-29-generic-pae

grub2使用grub.cfg替代 grub menu.lst。但會用menu.lst的符號鏈接(類似Win7的快捷方式)指向grub.cfg。




實驗室一臺Intel服務器上安裝了3個子系統: windows, Ubuntu LINUX 和 Ubuntu Wubi 僞LINUX系統。Linux系統下安裝了hadoop集羣。這幾天實驗室服務器重裝了Windows 7(Win7),結果LINUX啓動菜單項全部丟失。只能進入Win7,無法進入Linux hadoop。

由於是兩個Ubuntu Linux系統啓動菜單項丟失,所以 恢復起來麻煩了很多。最後的恢復竟然如此簡單:easybcd + linux命令(grub-mkconfig -o grub.cfg)。

難度大一點的方法是: 安裝grub4dos在C:\盤,然後編輯啓動菜單menu.lst。可參照menu.lst樣本,修改下。這是個可行的方法。或者 安裝 grub2win在C:\盤,然後編輯C:\grub2\grub.cfg。menu.lst是grub 1的配置文件,grub.cfg是grub 2的配置文件。有一個比較大的命令差別,grub 1的分區號從0開始。例如:(hd0,8)是第一塊硬盤(hd0)的9號分區,等價於 grub 2 的 (hd0,msdos9)或(hd0,9)。

grub4dos是一個將Linux下的GNU GRUB啓動引導程序移植到dos和windows的一個分支,是一個大幅度提高了軟件和硬件兼容性的啓動引導程序。後面再說。

安裝了多操作系統(Win,Linux)的電腦啓動時候,會出現啓動菜單項,這個菜單項是由引導器加載的。

Windows的引導器是 ntloader(WinNT,Win2K,XP), bootmgr(Win7)。

Linux的引導器Lilo, grub, grub2。Lilo是遠古時代的主流引導器,現在是grub2時代了。

其他Unix(Solaris, AIX, HP-UX, IRIX, SCO UNIX等)各有法寶引導系統。

grub 是一個來自GNU項目的多操作系統啓動程序。允許用戶在計算機啓動時選擇希望運行的操作系統。grub 可用於選擇操作系統分區上的不同內核,也可用於向這些內核傳遞啓動參數。

grub比較中立,可引導啓動Windows與Linux。

磁盤分區情況:
--------------------------------------------------
C:Win7 | Swap | Linux | D: | E:Win + ubuntu | F: |
--------------------------------------------------
第一主分區安裝Win7,第二(Swap)、第三(Linux / ext4類型)主分區安裝 ubuntu Linux(kernel 3.5), 剩下三個分區D:/E:/F:是Win7邏輯分區。

其中,E:\ubuntu\用wubi安裝了第2個Ubuntu Linux系統(kernel 3.2)。這其實是一個僞Linux系統,linux被安裝在Win7 NTFS盤內。當進入僞linux後,E:\ubuntu\disks\root.disk被加載爲/分區,swap.disk被加載爲交換分區,即虛存。

一、假若我的Ubuntu 僞Linux安裝在E:\ubuntu, 如何恢復?

1. 最簡單的方法如下(easybcd):
(1)拷貝 E:/ubuntu/winboot/下的 wubidr和wubidr.mbr文件拷到C:\
這2個文件是 ubuntu wubi引導ubuntu linux的引導器。

(2)添加Win7啓動菜單項 Ubuntu Linux:
easybcd 是一個方便的 Windows7 的啓動菜單編輯器程序,Win7 自帶的是 bcdedit指令, 在命令提示符窗口 操作比較麻煩:
=========================================================
a. 創建菜單項, 得到菜單項id:
bcdedit /create /d "Ubuntu Linux" /application bootsector

會有回顯,類似如下格式:
項 {5aaafed3-e895-11e2-a7a0-80bcca81b8b7} 成功創建。
5aaafed3-e895-11e2-a7a0-80bcca81b8b7 是我的菜單項 id。

b. 設置菜單項內容:
bcdedit /set {5aaafed3-e895-11e2-a7a0-80bcca81b8b7} device partition=E:
bcdedit /set {5aaafed3-e895-11e2-a7a0-80bcca81b8b7} path \ubuntu\winboot\wubildr.mbr
bcdedit /set {5aaafed3-e895-11e2-a7a0-80bcca81b8b7} description "Ubuntu Linux"
bcdedit /displayorder {id} /addlast

這裏,wubildr.mbr 是Ubuntu wubi引導器。新加的菜單項放在最後一條(/addlast)。

(上述bcdedit命令必須以管理員身份執行,否則報錯)
(太複雜了。改用如下的easybcd)
=========================================================

安裝easybcd 中文版,添加多個啓動菜單項(grub,grub2),圖形操作,完全傻瓜式,無需鍵入 bededit 指令去添加。上述bcdedit指令太複雜,用easybcd吧。一次添加2個Ubuntu的啓動菜單。


二、恢復了一個linux,假若還想恢復第二個linux呢?
或者,我想看看系統是怎麼寫啓動菜單項的(grub menu.lst或grub2 grub.cfg)?

grub 工作目錄是 /boot/grub

在linux下執行: grub-mkconfig -o grub.cfg
該命令會自動偵測系統的其他linux系統,加入菜單項, -o 生成grub菜單文件。

當然,先把原先的grub.cfg備份一份:
cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bak
grub-mkconfig -o /boot/grub/grub.cfg

重啓系統,發現多了幾個菜單。

其關鍵的菜單項是怎麼寫的?對於書寫你的 grub menu.lst(grub4dos menu.lst) 或 grub2 grub.cfg有幫助。

1. 我的Ubuntu 僞Linux 安裝在E:\ubuntu(kernel 3.2)
E:盤是Win7 NTFS格式。該僞linux如何工作?首先,linux會把root.disk文件加載爲根分區(/ ext4格式)。就像加載iso光盤一樣(loopback)。

E:\ubuntu\disk\root.disk 怎麼能找到呢?- 通過 分區卷標Label 或者 文件號uuid 找到。如:我的E:盤 Label是 DataLab, uuid是 6CE8A383E8A34A62, grub分區是 (hd0,msdos7)。第一個硬盤hd0的第七個分區msdos7。
磁盤分區情況:
--------------------------------------------------
C:Win7 | Swap | Linux | D: | E:Win + ubuntu | F: |
--------------------------------------------------
msdos1msdos5 msdos9 msdos6msdos7msdos8
這是我的 分區。你的呢?

search 查詢語句語法:
search [--file|--label|--fs-uuid] [--set [var]] [--no-floppy] name

search --fs-uuid 6CE8A383E8A34A62 或者
search --label DataLab

--set root 意思是設置查詢起點/

--no-floppy 表示不去檢索軟驅。

分區不記得了,咋辦?一個個去試探。進入grub命令行。
insmod ntfs# 安裝win ntfs模塊
ls# 查看所有硬盤和分區
ls (hd0,x)/# x是安裝linux分區號, msdosx也行
ls (hd0,7)/# 查看7號分區文件,msdos7也行
ls (hd0,7)# 查看7號分區: uuid, lable

找到了你的ubuntu linux?是的: (hd0,7)。hd0表示第一塊硬盤。
set root=(hd0,7)# 7 是 ubuntu分區號, 我的E:盤
search --no-floppy --fs-uuid --set=root 6CE8A383E8A34A62
#這裏的 uuid是 E:盤的 uuid = 6CE8A383E8A34A62

有童鞋問,幹嘛不直接說 E:盤?set root=E:?E:盤是Windows的標記,Unix或Linux沒有這一說。就像武漢人說喫早餐爲:過早,其他地方可不懂什麼是過早了。廣東人說 喝早茶。可不是喫早餐就喝一點茶水喔^_^

我的電腦裏,(hd0,7) 就是 第一塊硬盤的E:盤。當然,這臺入門級服務器只有一塊sata硬盤。

### 設置啓動菜單項 /etc/grub.d/10_lupin ###
# 這裏面是 grub命令喔
insmod part_msdos
insmod ntfs
set root='(hd0,msdos7)'
search --no-floppy --fs-uuid --set=root 6CE8A383E8A34A62
loopback loop0 /ubuntu/disks/root.disk
set root=(loop0)
linux /boot/vmlinuz-3.2.0-29-generic-pae root=UUID=6CE8A383E8A34A62 loop=/ubuntu/disks/root.disk ro   quiet splash vt.handoff=7
initrd /boot/initrd.img-3.2.0-29-generic-pae

loopback loop0 /ubuntu/disks/root.disk
是加載 e:\ubuntu\disks\root.disk文件。就像iso光盤鏡像一樣加載。

注意:unix/linux是沒有盤符的(e:), 盤符e:是windows的標記。目錄分隔符也不同,unix/linux是/, windows是\。

set root=(loop0)# 重設root
加載後 作爲 linux系統的/根分區。就像C:\(windows)。

linux /boot/vmlinuz-3.2.0 ... 加載內核vmlinuz
initrd /boot/initrd.img-3.2.0 ... 加載初始化ramdisk

這裏,比較有趣的是(加載內核,指定根分區):
(就像我的Win7指定C:盤是系統啓動盤,C:\是Win7系統根\分區)
linux /boot/vmlinuz-3.2.0 ... root=UUID=6CE8A383E8A34A62 ...

通常是:
linux /boot/vmlinuz-3.2.0 ... root=/dev/sda7 ...

有點暈?我畫圖說明:
磁盤分區情況:
--------------------------------------------------
C:Win7 | Swap | Linux | D: | E:Win + ubuntu | F: |
--------------------------------------------------
msdos1msdos5 msdos9 msdos6msdos7msdos8
這是我的 分區。
Windows是用盤符C: D: E: F:指定每個win分區,無法標記linux分區。

linux用符號表示分區設備(sda - scsi硬盤, hda - ide硬盤):
C:- sda1
D: - sda6
E: - sda7, uuid = 6CE8A383E8A34A62
F:- sda8
Swap交換分區 - sda5
Linux分區 - sda9

grub用(hdn,x)符號表示分區設備:
C:- (hd0,1)
D: - (hd0,6)
E: - (hd0,7), uuid = 6CE8A383E8A34A62
F:- (hd0,8)
Swap交換分區 - (hd0,5)
Linux分區 - (hd0,9)
上述,這是我的 分區。

當遇到故障,進入grub命令行,無法啓動時,可輸入上述命令:
insmod part_msdos
insmod ntfs
set root='(hd0,msdos7)'
search --no-floppy --fs-uuid --set=root 6CE8A383E8A34A62
loopback loop0 /ubuntu/disks/root.disk
set root=(loop0)
linux /boot/vmlinuz-3.2.0-29-generic-pae root=UUID=6CE8A383E8A34A62 loop=/ubuntu/disks/root.disk ro   quiet splash vt.handoff=7
initrd /boot/initrd.img-3.2.0-29-generic-pae
boot

回車後 可以進入linux系統了,修復grub引導文件:
update-grub2
reboot

或者 生成新的 正確的 grub.cfg。
當然,先把原先的grub.cfg備份一份:
cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bak
grub-mkconfig -o /boot/grub/grub.cfg

重啓系統,發現多了幾個菜單。

再看下 分區下安裝linux的情況。
### 設置啓動菜單項 /etc/grub.d/30_os-prober ###
# 這裏面是 grub命令喔
insmod part_msdos
insmod ext2
set root='(hd0,msdos9)'
search --no-floppy --fs-uuid --set=root d05e35b2-e458-41ef-ae22-4e4023302c4c
linux /boot/vmlinuz-3.5.0-26-generic root=UUID=d05e35b2-e458-41ef-ae22-4e4023302c4c ro quiet splash $vt_handoff
initrd /boot/initrd.img-3.5.0-26-generic

其中 有一句也可改寫爲:
linux /boot/vmlinuz-3.5.0-26-generic root=/dev/sda9 ro quiet splash $vt_handoff


弄清楚了嗎?

那麼,如果用grub4dos(windows版本的grub),先把grub4dos安裝於C:\下,簡單。然後修改 C:\menu.lst,或者,安裝 grub2Win於C:\下,修改C:\grub2\grub.cfg,也不難了(Win7 bootmgr作主引導器 如下是grub2 語法):
default 0
timeout 10

title Ubuntu hadoop AS (3.5.0-23-generic)
set root='(hd0,msdos9)'
search --no-floppy --fs-uuid --set=root d05e35b2-e458-41ef-ae22-4e4023302c4c
linux /boot/vmlinuz-3.5.0-26-generic root=UUID=d05e35b2-e458-41ef-ae22-4e4023302c4c ro quiet splash $vt_handoff
initrd /boot/initrd.img-3.5.0-26-generic

title Ubuntu hadoop AS (3.2.0-29-generic)
set root='(hd0,msdos7)'
search --no-floppy --fs-uuid --set=root 6CE8A383E8A34A62
loopback loop0 /ubuntu/disks/root.disk
set root=(loop0)
linux /boot/vmlinuz-3.2.0-29-generic-pae root=UUID=6CE8A383E8A34A62 loop=/ubuntu/disks/root.disk ro   quiet splash vt.handoff=7
initrd /boot/initrd.img-3.2.0-29-generic-pae

grub2使用grub.cfg替代 grub menu.lst。但會用menu.lst的符號鏈接(類似Win7的快捷方式)指向grub.cfg。

實驗室一臺Intel服務器上安裝了3個子系統: windows, Ubuntu LINUX 和 Ubuntu Wubi 僞LINUX系統。Linux系統下安裝了hadoop集羣。這幾天實驗室服務器重裝了Windows 7(Win7),結果LINUX啓動菜單項全部丟失。只能進入Win7,無法進入Linux hadoop。

由於是兩個Ubuntu Linux系統啓動菜單項丟失,所以 恢復起來麻煩了很多。最後的恢復竟然如此簡單:easybcd + linux命令(grub-mkconfig -o grub.cfg)。

難度大一點的方法是: 安裝grub4dos在C:\盤,然後編輯啓動菜單menu.lst。可參照menu.lst樣本,修改下。這是個可行的方法。或者 安裝 grub2win在C:\盤,然後編輯C:\grub2\grub.cfg。menu.lst是grub 1的配置文件,grub.cfg是grub 2的配置文件。有一個比較大的命令差別,grub 1的分區號從0開始。例如:(hd0,8)是第一塊硬盤(hd0)的9號分區,等價於 grub 2 的 (hd0,msdos9)或(hd0,9)。

grub4dos是一個將Linux下的GNU GRUB啓動引導程序移植到dos和windows的一個分支,是一個大幅度提高了軟件和硬件兼容性的啓動引導程序。後面再說。

安裝了多操作系統(Win,Linux)的電腦啓動時候,會出現啓動菜單項,這個菜單項是由引導器加載的。

Windows的引導器是 ntloader(WinNT,Win2K,XP), bootmgr(Win7)。

Linux的引導器Lilo, grub, grub2。Lilo是遠古時代的主流引導器,現在是grub2時代了。

其他Unix(Solaris, AIX, HP-UX, IRIX, SCO UNIX等)各有法寶引導系統。

grub 是一個來自GNU項目的多操作系統啓動程序。允許用戶在計算機啓動時選擇希望運行的操作系統。grub 可用於選擇操作系統分區上的不同內核,也可用於向這些內核傳遞啓動參數。

grub比較中立,可引導啓動Windows與Linux。

磁盤分區情況:
--------------------------------------------------
C:Win7 | Swap | Linux | D: | E:Win + ubuntu | F: |
--------------------------------------------------
第一主分區安裝Win7,第二(Swap)、第三(Linux / ext4類型)主分區安裝 ubuntu Linux(kernel 3.5), 剩下三個分區D:/E:/F:是Win7邏輯分區。

其中,E:\ubuntu\用wubi安裝了第2個Ubuntu Linux系統(kernel 3.2)。這其實是一個僞Linux系統,linux被安裝在Win7 NTFS盤內。當進入僞linux後,E:\ubuntu\disks\root.disk被加載爲/分區,swap.disk被加載爲交換分區,即虛存。

一、假若我的Ubuntu 僞Linux安裝在E:\ubuntu, 如何恢復?

1. 最簡單的方法如下(easybcd):
(1)拷貝 E:/ubuntu/winboot/下的 wubidr和wubidr.mbr文件拷到C:\
這2個文件是 ubuntu wubi引導ubuntu linux的引導器。

(2)添加Win7啓動菜單項 Ubuntu Linux:
easybcd 是一個方便的 Windows7 的啓動菜單編輯器程序,Win7 自帶的是 bcdedit指令, 在命令提示符窗口 操作比較麻煩:
=========================================================
a. 創建菜單項, 得到菜單項id:
bcdedit /create /d "Ubuntu Linux" /application bootsector

會有回顯,類似如下格式:
項 {5aaafed3-e895-11e2-a7a0-80bcca81b8b7} 成功創建。
5aaafed3-e895-11e2-a7a0-80bcca81b8b7 是我的菜單項 id。

b. 設置菜單項內容:
bcdedit /set {5aaafed3-e895-11e2-a7a0-80bcca81b8b7} device partition=E:
bcdedit /set {5aaafed3-e895-11e2-a7a0-80bcca81b8b7} path \ubuntu\winboot\wubildr.mbr
bcdedit /set {5aaafed3-e895-11e2-a7a0-80bcca81b8b7} description "Ubuntu Linux"
bcdedit /displayorder {id} /addlast

這裏,wubildr.mbr 是Ubuntu wubi引導器。新加的菜單項放在最後一條(/addlast)。

(上述bcdedit命令必須以管理員身份執行,否則報錯)
(太複雜了。改用如下的easybcd)
=========================================================

安裝easybcd 中文版,添加多個啓動菜單項(grub,grub2),圖形操作,完全傻瓜式,無需鍵入 bededit 指令去添加。上述bcdedit指令太複雜,用easybcd吧。一次添加2個Ubuntu的啓動菜單。


二、恢復了一個linux,假若還想恢復第二個linux呢?
或者,我想看看系統是怎麼寫啓動菜單項的(grub menu.lst或grub2 grub.cfg)?

grub 工作目錄是 /boot/grub

在linux下執行: grub-mkconfig -o grub.cfg
該命令會自動偵測系統的其他linux系統,加入菜單項, -o 生成grub菜單文件。

當然,先把原先的grub.cfg備份一份:
cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bak
grub-mkconfig -o /boot/grub/grub.cfg

重啓系統,發現多了幾個菜單。

其關鍵的菜單項是怎麼寫的?對於書寫你的 grub menu.lst(grub4dos menu.lst) 或 grub2 grub.cfg有幫助。

1. 我的Ubuntu 僞Linux 安裝在E:\ubuntu(kernel 3.2)
E:盤是Win7 NTFS格式。該僞linux如何工作?首先,linux會把root.disk文件加載爲根分區(/ ext4格式)。就像加載iso光盤一樣(loopback)。

E:\ubuntu\disk\root.disk 怎麼能找到呢?- 通過 分區卷標Label 或者 文件號uuid 找到。如:我的E:盤 Label是 DataLab, uuid是 6CE8A383E8A34A62, grub分區是 (hd0,msdos7)。第一個硬盤hd0的第七個分區msdos7。
磁盤分區情況:
--------------------------------------------------
C:Win7 | Swap | Linux | D: | E:Win + ubuntu | F: |
--------------------------------------------------
msdos1msdos5 msdos9 msdos6msdos7msdos8
這是我的 分區。你的呢?

search 查詢語句語法:
search [--file|--label|--fs-uuid] [--set [var]] [--no-floppy] name

search --fs-uuid 6CE8A383E8A34A62 或者
search --label DataLab

--set root 意思是設置查詢起點/

--no-floppy 表示不去檢索軟驅。

分區不記得了,咋辦?一個個去試探。進入grub命令行。
insmod ntfs# 安裝win ntfs模塊
ls# 查看所有硬盤和分區
ls (hd0,x)/# x是安裝linux分區號, msdosx也行
ls (hd0,7)/# 查看7號分區文件,msdos7也行
ls (hd0,7)# 查看7號分區: uuid, lable

找到了你的ubuntu linux?是的: (hd0,7)。hd0表示第一塊硬盤。
set root=(hd0,7)# 7 是 ubuntu分區號, 我的E:盤
search --no-floppy --fs-uuid --set=root 6CE8A383E8A34A62
#這裏的 uuid是 E:盤的 uuid = 6CE8A383E8A34A62

有童鞋問,幹嘛不直接說 E:盤?set root=E:?E:盤是Windows的標記,Unix或Linux沒有這一說。就像武漢人說喫早餐爲:過早,其他地方可不懂什麼是過早了。廣東人說 喝早茶。可不是喫早餐就喝一點茶水喔^_^

我的電腦裏,(hd0,7) 就是 第一塊硬盤的E:盤。當然,這臺入門級服務器只有一塊sata硬盤。

### 設置啓動菜單項 /etc/grub.d/10_lupin ###
# 這裏面是 grub命令喔
insmod part_msdos
insmod ntfs
set root='(hd0,msdos7)'
search --no-floppy --fs-uuid --set=root 6CE8A383E8A34A62
loopback loop0 /ubuntu/disks/root.disk
set root=(loop0)
linux /boot/vmlinuz-3.2.0-29-generic-pae root=UUID=6CE8A383E8A34A62 loop=/ubuntu/disks/root.disk ro   quiet splash vt.handoff=7
initrd /boot/initrd.img-3.2.0-29-generic-pae

loopback loop0 /ubuntu/disks/root.disk
是加載 e:\ubuntu\disks\root.disk文件。就像iso光盤鏡像一樣加載。

注意:unix/linux是沒有盤符的(e:), 盤符e:是windows的標記。目錄分隔符也不同,unix/linux是/, windows是\。

set root=(loop0)# 重設root
加載後 作爲 linux系統的/根分區。就像C:\(windows)。

linux /boot/vmlinuz-3.2.0 ... 加載內核vmlinuz
initrd /boot/initrd.img-3.2.0 ... 加載初始化ramdisk

這裏,比較有趣的是(加載內核,指定根分區):
(就像我的Win7指定C:盤是系統啓動盤,C:\是Win7系統根\分區)
linux /boot/vmlinuz-3.2.0 ... root=UUID=6CE8A383E8A34A62 ...

通常是:
linux /boot/vmlinuz-3.2.0 ... root=/dev/sda7 ...

有點暈?我畫圖說明:
磁盤分區情況:
--------------------------------------------------
C:Win7 | Swap | Linux | D: | E:Win + ubuntu | F: |
--------------------------------------------------
msdos1msdos5 msdos9 msdos6msdos7msdos8
這是我的 分區。
Windows是用盤符C: D: E: F:指定每個win分區,無法標記linux分區。

linux用符號表示分區設備(sda - scsi硬盤, hda - ide硬盤):
C:- sda1
D: - sda6
E: - sda7, uuid = 6CE8A383E8A34A62
F:- sda8
Swap交換分區 - sda5
Linux分區 - sda9

grub用(hdn,x)符號表示分區設備:
C:- (hd0,1)
D: - (hd0,6)
E: - (hd0,7), uuid = 6CE8A383E8A34A62
F:- (hd0,8)
Swap交換分區 - (hd0,5)
Linux分區 - (hd0,9)
上述,這是我的 分區。

當遇到故障,進入grub命令行,無法啓動時,可輸入上述命令:
insmod part_msdos
insmod ntfs
set root='(hd0,msdos7)'
search --no-floppy --fs-uuid --set=root 6CE8A383E8A34A62
loopback loop0 /ubuntu/disks/root.disk
set root=(loop0)
linux /boot/vmlinuz-3.2.0-29-generic-pae root=UUID=6CE8A383E8A34A62 loop=/ubuntu/disks/root.disk ro   quiet splash vt.handoff=7
initrd /boot/initrd.img-3.2.0-29-generic-pae
boot

回車後 可以進入linux系統了,修復grub引導文件:
update-grub2
reboot

或者 生成新的 正確的 grub.cfg。
當然,先把原先的grub.cfg備份一份:
cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bak
grub-mkconfig -o /boot/grub/grub.cfg

重啓系統,發現多了幾個菜單。

再看下 分區下安裝linux的情況。
### 設置啓動菜單項 /etc/grub.d/30_os-prober ###
# 這裏面是 grub命令喔
insmod part_msdos
insmod ext2
set root='(hd0,msdos9)'
search --no-floppy --fs-uuid --set=root d05e35b2-e458-41ef-ae22-4e4023302c4c
linux /boot/vmlinuz-3.5.0-26-generic root=UUID=d05e35b2-e458-41ef-ae22-4e4023302c4c ro quiet splash $vt_handoff
initrd /boot/initrd.img-3.5.0-26-generic

其中 有一句也可改寫爲:
linux /boot/vmlinuz-3.5.0-26-generic root=/dev/sda9 ro quiet splash $vt_handoff


弄清楚了嗎?

那麼,如果用grub4dos(windows版本的grub),先把grub4dos安裝於C:\下,簡單。然後修改 C:\menu.lst,或者,安裝 grub2Win於C:\下,修改C:\grub2\grub.cfg,也不難了(Win7 bootmgr作主引導器 如下是grub2 語法):
default 0
timeout 10

title Ubuntu hadoop AS (3.5.0-23-generic)
set root='(hd0,msdos9)'
search --no-floppy --fs-uuid --set=root d05e35b2-e458-41ef-ae22-4e4023302c4c
linux /boot/vmlinuz-3.5.0-26-generic root=UUID=d05e35b2-e458-41ef-ae22-4e4023302c4c ro quiet splash $vt_handoff
initrd /boot/initrd.img-3.5.0-26-generic

title Ubuntu hadoop AS (3.2.0-29-generic)
set root='(hd0,msdos7)'
search --no-floppy --fs-uuid --set=root 6CE8A383E8A34A62
loopback loop0 /ubuntu/disks/root.disk
set root=(loop0)
linux /boot/vmlinuz-3.2.0-29-generic-pae root=UUID=6CE8A383E8A34A62 loop=/ubuntu/disks/root.disk ro   quiet splash vt.handoff=7
initrd /boot/initrd.img-3.2.0-29-generic-pae

grub2使用grub.cfg替代 grub menu.lst。但會用menu.lst的符號鏈接(類似Win7的快捷方式)指向grub.cfg。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章