首先我們來看下以下別人博客的解決方案:
第一種情況:
是由於grub中的grub.conf文件損壞,開機後直接進入到了grub>命令行模式下。下面將圖解此過程
這時可以使用help看一下grub可支持命令有那些,以便供修復時使用。
第二個使用的命令是find (hd0,0)/按tab如果能補全就表示系統在此分區上。
各個參數說明:
這時要注意,當你指定內核後,但未指定內核後面的參數(ro root=(此處未指定的話))將無法正常啓動,報:請給root參數,一般情況下是系統是可以自動探測到,但這個功能並不靠譜,那麼只能靠備份或你的記憶將參數補上(所以定期備份/etc/fstab、與grub.conf、是多麼重要的事情,原因你懂的。)註釋:root=/dev/sd? 指向的是根目錄的掛載分區,這個也我實驗中不成功的地方,一定要在系統中備份自己的fstab文件!!
注意:其中initrd 下有兩個文件 initramfs -xx.img和initrd-2.XXkdump.img(這個是系統崩潰的是儲存機制,不要選取。不是系統文件。本人在這個地方失敗多次!!)
如下圖:
而這時就看到你平時的習慣了,備份相當重要
當正常登錄系統後,將grub.conf文件重新寫就可以了。(上圖的完整路徑是root=/dev/mapper/vg_www-lv_root,寫全了就看不到了,所以在此特別說明)(原作者做了lvm盤。所以他的位置是vg_www_lv_root)
看到title了吧
過了下面這張圖就說明系統是可以正常啓動了
第一種情況順利解決!a_c
第二種情況:
grub損壞(最明顯的提示爲:Operating System not found)
如mbr數據損壞(注僅是bootloader損壞,分區表是好的),如果沒有重新啓動還可能修復,但是如果是重啓後發現grub損壞,那麼只能掛載光盤進入緊急救援模式。(以下將以掛載光盤說明)
dd執行之後的景象,是不是好驚悚a_c
掛載光盤進入緊急救援模式,在BIOS中將光盤設置爲第一引導設備。
在菜單中選擇"Rescue installed system"
之後將對:語言----》鍵盤設置
是否啓用網絡(不需要,則No,如果選擇了Yes將要求選擇獲取IP地址的方式)
正式進入救援模式
原系統己經掛載的位置,如何切換到原系統下
開啓一個shell
切換到原系統
這時可以直接輸入grub命令進入grub中(這個grub是光盤中的)
直接使用 help setup會顯示setup的使用方法。
設置root(root默認分區)如(hd0,0),此分區一定要root所在的系統分區,之後使用setup安裝,命令是setup(hd0)(由於mbr並屬於分區,所以將grub安裝到hd0設備即可),如果是成功了會有succeeded提示。quit退出即可
重啓系統,取出光盤,有如下信息就表示修復完成
如果grub目錄都損壞,無法正常啓動。或者你進入系統了 從別的服務上拷貝了grub.conf 。重啓系統是不行的。一定要修改kernel /vmlinuz-XXX.XXX ro root=uuid=中的uuid值 每個值都是不一樣的。(用blkid)
一篇的文章也可以借鑑下:
首先來看一下/boot/grub/menu.lst中的內容:
==========================================================
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,0)
# kernel /boot/vmlinuz-version ro root=/dev/hda1
# initrd /boot/initrd-version.img
#boot=/dev/hda
default=0
timeout=5
splashp_w_picpath=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title Fedora Core (2.6.18-1.2798.fc6)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-1.2798.fc6 ro root=LABEL=/ rhgb quiet
selinux=0
initrd /boot/initrd-2.6.18-1.2798.fc6.img
title Windows XP
rootnoverify (hd0,3)
chainloader +1
===========================================================
其中:
1,default=0
表示默認啓動的第0號的操作系統,在GRUB中,title定義了啓動的操作系統,從第1個開
始,GRUB中是0,而第2個是1,依次類推...
2,timeout=5
表示的是出現GRUB界面後,無操作情況下進入default設定的操作系統的時間,如果上下
移動選擇,則該選項無效
3,splashp_w_picpath=(hd0,6)/boot/grub/splah.xpm.gz
表示的是允許出現的GRUB背景的path,顯然(hd0,6)指定了分區(不知能否這麼解釋,呵
呵),而後邊的則是正常的path(在例子中,用#把它註釋,爲一可選項)
4,hiddenmenu
表示隱藏GRUB的啓動菜單,直接進入由default廟宇的操作系統中去,爲一可選項.
linux類
其格式一般爲:
title (......)
root (hd[0-n],x)
kernel (......)
initrd (......)
其中:
title行,是定義一個啓動操作系統,而後邊可以自己隨便寫上喜歡的名字,呵,當然最起
碼你得寫得要自己能認出來,沒必要把linux寫成windows吧?!
root行,指定相應的linux所有的/boot,如果在寫分區和掛載時沒有單獨掛載,那麼就和
/在同一個分區中,hd[0-n]表示的是第幾個硬盤,而x則表示的是[第幾個分區-1],即x比
分區號小1,特別要注意.
kernel行,在這裏以kernel 起始,指定Linux的內核的文件所處的絕對路徑(通過在終
端輸入命令:ls /boot/vmlinuz*來看內核的全名);因爲內核是處在/boot目錄中的,
而如果/boot是獨立的一個分區,則需要把boot省略,因爲 /boot所在的分區在root
(hd[0-n],x)中指定了,所以就無需要再指明內核處在哪個分區了;ro 表示只讀;
root=LABEL=/ 來表示Linux的根所處的分區。LABEL=/ 這是硬盤分區格式化爲相應文
件系統後所加的標籤;如果您不瞭解什麼是標籤,也可以直接以/dev/hd[a-z]X 或
者/dev/sd[a-z]X來表示;就看您的Linux是根分區是在哪個分區了。比如我的是
在/dev/hda3, 那這裏就可以寫成root=/dev/hda3;
initrd行,如果是/boot獨立一個分區,initrd 一行要把/boot中省略;如果/boot不是
處於一個分區,而是和Linux的/分區處於同一分區,不應該省略;我們通過查看/boot
中的 initrd的文件名到底是什麼來寫這一行代碼,在終端輸入:ls /boot/initrd*
很容易能得到initrd文件名,然後寫入.
在瞭解了以上情況之後,我們就很容易地理解另一種寫法了:
title (......)
kernel (hd[0-n],y)(/boot)...... ro root=..(根目錄的位置)....
initrd (hd[0-n],y)(/boot)......
其實只是省略的root很實在地寫在了kernel和initrd行中去了而已
附:
其 實在GRUB啓動菜單不能工作的時候,進入GRUB命令行(可按CTRL+C鍵)後,我們同樣可
以一步一步地把系統啓動起來,其實在menu.lst中, 除title不是指令外,其餘的都是
GRUB指令,我們只要一步步地輸入它們(錯了要從新開始),中間輸入關於kernel和
initrd要利用TAB鍵補齊寫好,最後只要boot一下就行了.
用GRUB指令引導windows:
GRUB> rootnoverify (hd0,0)
GRUB> chainloader +1
GRUB> boot