系統引導管理器grub初學者指南(轉)
系統引導管理器grub初學者指南(轉)[@more@]一、什麼是多重作業系統引導管理器,什麼是GRUB;1、什麼是多重作業系統引導管理器及工作原理;系統啟動引導管理器,是在計算機啟動後執行的第一個程式,他是用來負責載入、傳輸控制到作業系統的核心,一旦把核心掛載,系統引導管理器的任務就算完成退出,系統引導的其它部份,比如系統的初始化及啟動過程則完全由核心來控制完成;Briefly, boot loader is the first software program that runs when a computer starts. It is responsible for loading and transferring control to the operating system kernel software (such as the Hurd or the Linux). The kernel, in turn, initializes the rest of the operating system (e.g. GNU).在X86 架構的機器中,Linux、BSD 或其它Unix類的作業系統中GRUB、LILO 是大家最為常用,應該說是主流;Windows也有類似的工具NTLOADER;比如我們在機器中安裝了Windows 98後,我們再安裝一個Windows XP ,在機器啟動的會有一個選單讓我們選擇進入是進入Windows 98 還是進入Windows XP。NTLOADER就是一個多系統啟動引導管理器,NTLOADER 同樣也能引導Linux,只是極為麻煩罷了;在Powerpc 架構的機器中,如果安裝了Linux的Powerpc 版本,大多是用yaboot 多重引導管理器,比如Apple機目前用的是IBM Powerpc處理器,所以在如果想在Apple機上,安裝Macos 和Linux Powerpc 版本,大多是用yaboot來引導多個作業系統;因為目前X86架構的機器仍是主流, 所以目前GRUB和LILO 仍然是我們最常用的多重作業系統引導管理器;2、什麼是GRUB;為什麼我要選擇GRUB;1)什麼是GRUB;GNU GRUB 是一個多重作業系統啟動管理器。GNU GRUB 是由GRUB(GRand Unified Bootloader) 派生而來。GRUB 最初由Erich Stefan Boleyn 設計和應用;GNU GRUB is a Multiboot boot loader. It was derived from GRUB, GRand Unified Bootloader, which was originally designed and implemented by Erich Stefan Boleyn.2)“GRUB太不好用”──對GRUB的認識的誤區;GRUB真的不好用嗎?不是的,透過LinuxSir.Org 社群近四年來的執行,我發現了大多新手弟兄還是不太瞭解GRUB;當然這也有中文Linux社群的責任,雖然也有GRUB的中文譯本,初學Linux的弟兄可能有點看不懂;我們欣喜的看到LinuxSir.Org 社群的好多弟兄都曾經或正在寫GRUB實踐文件,也有的弟兄也總結了GRUB的一些基礎知識,比如 probing兄弟的 《GRUB 學習筆記》;由於每個人的寫文件時風格不同,可能同一份文件不同的人來寫就有不同的風格;所以今天也抖膽也一篇入門級的教程,由於北南不會寫高階教程,所以還得請高手弟兄指教,先謝過;3)為什麼要選擇GRUB;基於在X86架構的CPU而開發作業系統,系統引導管理器不僅僅有GRUB ,而且也有LILO,但對於多重系統引導管理器,你只能選擇其一而用;不能兩個同時使用;目前這兩個多重系統引導管理器是大家最常用的,也是主流Linux發行版而採用的;有的弟兄喜歡GRUB,比如我個人,有的弟兄喜歡LILO ,比如etony兄(誰是etony,請參見 );主流發行版 Fedora、Redhat、Centos等基於RPM包的系統,在最新版本中都預設GRUB引導;Slackware 目前仍採用LILO;而Debian發行版目前最新的版本也是採用GRUB;從目前看來,GRUB有逐漸取代LILO之勢,GRUB 2.0正在開發之中;所以我們有理由用GRUB,我也有理由寫GRUB使用教程;二、GRUB軟體包版本選擇和安裝;1、GRUB的版本選擇,Linux版本的GRUB及Windows版本的GRUB的說明;GRUB不但有Linux版本,也有Windows版本;現我們一一介紹;如前面所說,目前在在Unix類的作業系統中,大多是都有GRUB;GRUB幾乎能引導所有X86架構的作業系統;功能之強,使用簡單是GRUB最大的賣點;由於Windows 作業系統的先入為主的優勢,使得大家對Windows的NTLOADER瞭解的比較多,而對開源社群的GRUB顯得有點寞生,由此而帶來使用上的“心理恐懼”;究其初學者對GRUB“恐懼”的主要原因還是對GRUB沒有太多的瞭解和深入;無論是WINGRUB還是Linux版本的GRUB,最方便的還是對 GRUB命令列的操作;一談到命令列(Command)的操作,可能初學者對此恐懼;其實沒有什麼難的,象北南這樣低階的寫手,還能操作得起來,您也應該能行;2、GRUB的Windows版本WINGRUB;請參考:《以WINGRUB 引導安裝Fedora 4.0 為例,詳述用WINGRUB來引導Linux的安裝》3、GRUB的Linux版本軟體包的安裝;其實對於Linux的GRUB,幾乎所有的Linux主流發行版都有打包,如果您安裝了Linux,並且在開機後出現GRUB字樣的,證明您已經安裝了GRUB;而無需再次安裝;Linux的GRUB軟體包安裝部份並不是本文的重點;如果您的Linux系統沒有安裝GRUB,或者採用的是LILO,而您想用GRUB,可以用系統安裝盤自帶GRUB軟體包來安裝,或者到相關發行版本的軟體倉庫下載後安裝;GRUB 的Linux版本目前在各大發行版中都有打包;比如Fedora/Redhat/Centos/Mandrive/Mandriva/SuSE等以RPM包管理機制的系統,可以透過如下的命令來安裝;請參考《Fedora / Redhat 軟體包管理指南》[root@localhost ~]# rpm -ivh grub*.rpm如果是Slackware 您可以用如下的辦法來安裝;[root@localhost ~]# installpkg grub*.tgz其它的發行版本請用其自己特色的軟體包管理工具來安裝;當然您也可以透過原始碼包,在任何Linux的發行版上安裝;至於原始碼包的安裝方法;請參考:《如何編譯安裝原始碼包軟體》[root@localhost ~]#tar zxvf grub*.tar.gz[root@localhost ~]#cd grub-xxx[root@localhost ~]#./configure;make;make install確認您是否成功安裝了GRUB,您可以測試是否有如下兩個命令;[root@localhost ~]# grub[root@localhost ~]# grub-install如果您不能找到這兩個命令,可能您的可執行程式的路徑沒有設定;請參考:《設定可執行程式路徑》,當然您可以用絕對路徑;比如下面的;[root@localhost ~]# /usr/sbin/grub[root@localhost ~]# /usr/sbin/grub-install如果您還是找不到GRUB軟體包安裝在哪了;您可以用下面的命令來解決和查詢;[root@localhost ~]# updatedb 注:這個要花很長時間;是索引slocate 的庫,然後再透過locate來查詢;[root@localhost ~]# locate grub比如找到的是有類似如下的;[root@localhost ~]# locate grub/sbin/grub-md5-crypt/sbin/grub/sbin/grub-install/sbin/grub-terminfo在一般情況下,在路徑中帶有bin或sbin中字樣的,這些路徑下都是可執行程式;sbin 是超級許可權使用者才能使用的管理命令;要使用這些命令一般的情況下得切換到root使用者下才能使用;比如[beinan@localhost ~]$ su - 注:切換到root使用者,並且切換到其家目錄;Password:[root@localhost ~]#/sbin/grub 注:用絕對路徑來執行grub命令;三、在Linux中,GRUB的配置中的安裝和寫入硬碟的MBR;1、在Linux中,GRUB配置過程中的安裝grub-install;grub-install 命令有何用呢?其實就是把我們前面已經安裝的軟體包中的一些檔案複製到 /boot/grub中;對於新安裝GRUB軟體包後,也是一個必經的過程;我們前面所說的GRUB軟體包的安裝;而現在我們說的是GRUB配置的過程中的安裝;雖然在洋文中都是install ,但表達的意思是不一樣的;我們首先要執行 fdisk -l 來確認到底是硬碟的標識;這個過程主要是確認硬碟的標識是哪個調備,到底是/dev/hda還是/dev/hdb 還是其它的;[root@localhost ~]# fdisk -lDisk /dev/hda: 80.0 GB, 80026361856 bytes255 heads, 63 sectors/track, 9729 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesDevice Boot Start End Blocks Id System/dev/hda1 * 1 970 7791493+ 7 HPFS/NTFS/dev/hda2 971 9729 70356667+ 5 Extended/dev/hda5 971 2915 15623181 b W95 FAT32/dev/hda6 2916 4131 9767488+ 83 Linux/dev/hda7 4132 5590 11719386 83 Linux/dev/hda8 5591 6806 9767488+ 83 Linux/dev/hda9 6807 9657 22900626 83 Linux/dev/hda10 9658 9729 578308+ 82 Linux swap / Solaris如果透過fdisk -l 出現有/dev/hda字樣的,我們就要用下面的命令來安裝;[root@localhost ~]# grub-install /dev/hdaInstallation finished. No error reported.This is the contents of the device map /boot/grub/device.map.Check if this is correct or not. If any of the lines is incorrect,fix it and re-run the script `grub-install'.(fd0) /dev/fd0(hd0) /dev/hda如果是您fdisk -l 出現的有/dev/hdb呢,那就如下執行;[root@localhost ~]# grub-install /dev/hdb如果既有/dev/hda和/dev/hdb 就安裝到/dev/hda中;[root@localhost ~]# grub-install /dev/hda值得注意的是如果您有一個/boot分割槽,應該用如下的辦法來安裝;[root@localhost ~]#grub-install --root-directory=/boot /dev/hda[root@localhost ~]#grub-install --root-directory=/boot /dev/hdb註解:具體是/dev/hda還是/dev/hdb,請以fdisk -l 為準;如果兩個都有,就看您把/boot分割槽是放在第一塊硬碟還是第二塊硬碟上了,以實際情況為準;2、設定GRUB的/boot分割槽並寫入MBR;;在Linux中,GRUB軟體包的安裝,及在配置過程中安裝grub到 /boot中還是不夠的, 還要把GRUB,寫入MBR才行;有時我們重新安裝了Windows,Windows會把MBR 重寫,這樣GRUB就消失了;如果您出現這樣的情況,就要進行這個過程;[root@localhost ~]# grub會出現grub>提示符,這是grub命令列模式 ,如果能在開機中出現提示符,沒有引導不起來的系統,除非您的系統破壞的極為嚴重。如果僅僅是GRUB被破壞了,GRUB命令列是能讓作業系統引導起來的;接著看例子,我們要找到 /boot/grub/stage1的,在grub>後面輸入;grub> find /boot/grub/stage1(hd0,6)(fd0) 注:這個是軟碟機;現在很少用軟碟機了,如果您有這方面的需要,自己看GRUB的DOC吧;註解:(hd0,6) 這是/boot所在的分割槽;不要誤解為是Linux 的/所在的分割槽,這是值得注意的;(fd0) 注:這個是軟碟機;現在很少用軟碟機了,如果您有這方面的需要,自己看GRUB的DOC吧;grub>root (hd0,6) 注:這是/boot所在的分割槽;grub>setup (hd0) 注:把GRUB寫到MBR上;註解:上面這步驟是根據 find /boot/stage1而來的,仔細看一下就明白了;現在我們一般安裝很少會把/boot分割槽列為一個單獨的分割槽;不過有的弟兄可能也喜歡這麼做;所以還是有必要說一下為好;四、GRUB的配置檔案的menu.lst的寫法;對於GRUB來說,如果沒有配置menu.lst,無論是Linux版本的GRUB,還是WINGRUB,都會有命令列可用,透過命令列是一樣能把作業系統引導起來的;有些弟兄總以為menu.lst 配置錯了,或者在機器啟動後出現grub>命令列模式就要重新安裝系統,其實根本沒有這個必要;只要學會GRUB的命令列的用法,根本沒有必要重灌系統;menu.lst 位於/boot/grub目錄中,也就是/boot/grub/menu.lst 檔案;您可以用vi或您喜歡的編輯器來編輯他;如果您不會用vi,還是去學習一下吧;簡單的用法怎麼也得會,對不對?畢竟這個文件不是講vi的用法的;有的弟兄會說,我沒有menu.lst怎麼辦?那就建立一個;用下面的命令;[root@localhost ~]# touch /boot/grub/menu.lst然後我們再做一個/boot/grub/menu.lst 的連結 /boot/grub/grub.conf[root@localhost ~]# cd /boot/grub[root@localhost ~]# ln -s menu.lst grub.conf現在我們來寫GRUB的menu.lst了,因為/boot/grub/grub.conf是 /boot/grub/menu.lst的連結檔案,改哪個都行。連結檔案相當於Windows的快捷方式,這樣可能能更好的理解;1、menu.lst的寫法之一;首先我們看一下我的Fedora 4.0 中的/boot/grub/menu.lst 的內容;default=0timeout=5#splashimage=(hd0,6)/boot/grub/splash.xpm.gzhiddenmenutitle Fedora Core (2.6.11-1.1369_FC4)root (hd0,6)kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/initrd /boot/initrd-2.6.11-1.1369_FC4.imgtitle WinXprootnoverify (hd0,0)chainloader +1註解:default=0default=0 是預設啟動哪個系統,從0開始;每個作業系統的啟動的定義都從title開始的,第一個title 在GRUB的啟動選單上顯示為0,第二個啟動為1,以此類推;timeout=5注:表示在開機後,GRUB畫面出現幾秒後開始以預設啟動;如果在啟動時,移動上下鍵,則解除這一規則;#splashimage=(hd0,6)/boot/grub/splash.xpm.gz 注:GRUB的背景畫面,這個是可選項;我不喜歡GRUB的背景畫面,所以加#號注掉,也可以刪除;hiddenmenu註解:隱藏GRUB的啟動選單,這項也是可選的,也可以用#號注掉;一般的情況下對Linux作業系統的啟動,一般要包括四行;title 行;root行;kernel 行;initrd 行;1)在menu.lst中 ,透過 root (hd[0-n],y)來指定/boot 所在的分割槽;title XXXXX 注:title 後面加一個空格,title 是小寫的,後面可以自己定義;比如FC4,自己定義一個名字就行;root (hd[0-n],y) ,在本例中,我們看到的是root (hd0,6) ,root (hd[0-n],y)表示的是/boot所在的分割槽;有時我們安裝Linux的時候,大多是不設定/boot的,這時/boot和/所在的同一個分割槽;這個root (hd[0-n],y)很重要,因為/boot目錄中雖然有grub目錄,最為重要的是還有kernel 和initrd檔案,這是Linux能啟動起來最為重要東西;有的弟兄會問,root (hd[0-n],y)是怎麼來的?請參考:《在Linux系統中儲存裝置的兩種表示方法》2)在menu.lst中,kernel 命令列的寫法;kernel 一行,是通指定核心及Linux的/分割槽所在位置;比如例子中是;kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/在這裡以kernel 起始,指定Linux的核心的檔案所處的絕對路徑;因為核心是處在/boot目錄中的, 如果/boot是獨立的一個分割槽,則需要把boot省略;如果/boot是獨立的分割槽,這行要寫成:kernel /vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/因為/boot所處的分割槽已經在title 下一行root (hd[0-n],y)中指定了,所以就無需要再指明核心處在哪個分割槽了;另外Linux系統的硬碟分割槽的掛載配置檔案在/etc/fstab ,原理是透過 mount /dev/hd[a-z]X /boot 來進行的;您可以對照著來理解;ro 表示只讀; root=LABEL=/ 來表示Linux的根所處的分割槽。LABEL=/ 這是硬碟分割槽格式化為相應檔案系統後所加的標籤;如果您不瞭解什麼是標籤,也可以直接以/dev/hd[a-z]X 或者/dev/sd[a-z]X來表示;就看您的Linux是根分割槽是在哪個分割槽了。比如我的是在/dev/hda7 ,那這裡就可以寫成root=/dev/hda7;如果檢視系統執行所掛載的分割槽,請用 df -lh 來檢視,就能明白是不是/boot是獨立的分割槽,或者檢視/etc/fstab也能知道;[root@localhost ~]# df -lhFilesystem 容量 已用 可用 已用% 掛載點/dev/hda7 11G 9.2G 1.2G 90% //dev/shm 236M 0 236M 0% /dev/shm在這個例子中,我們可以發現 /boot並沒有出現只有/dev/hda7,這表示/boot並不是獨立的一個分割槽;所有的東西都包含在/中;於是我們在/boot中檢視核心版本;[root@localhost ~]# ls /boot/vmlinuz*/boot/vmlinuz-2.6.11-1.1369_FC4 注:看到核心vmlinuz所處的目錄;於是我們就可以這樣kernel 這行了;kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda73)initrd 命令列的寫法;如果是/boot獨立一個分割槽,initrd 一行要把/boot中省略;如果/boot不是處於一個分割槽,而是和Linux的/分割槽處於同一分割槽,不應該省略;比如我們在2)中用的例子;現在拿到這裡,我們應該首先檢視 /boot中的initrd的檔名到底是什麼;[root@localhost ~]# ls /boot/initrd*/boot/initrd-2.6.11-1.1369_FC4.img如果是透過df -lh 得知或檢視/etc/fstab 也行, 得知/boot是獨立的分割槽;這時initrd 應該寫成;initrd /initrd-2.6.11-1.1369_FC4.img如果是 /boot不是獨處一個分割槽,而是在/同一處一個分割槽, 則要寫成;initrd /boot/initrd-2.6.11-1.1369_FC4.img4)menu.lst第一種寫法的總結和實踐;在這裡,我們只說重要的,不重要的就一帶而過了;1]用fdisk -l ;df -lh ;more /etc/fstab來確認分割槽情況;我們過fdisk -l ;df -lh ; more /etc/fstab 來確認/boot所在的分割槽,及Linux的根分割槽所在位置;比如我們確認/boot和Linux的/分割槽同處一個分割槽;[root@localhost ~]# df -lhFilesystem 容量 已用 可用 已用% 掛載點/dev/hda7 11G 9.2G 1.2G 90% //dev/shm 236M 0 236M 0% /dev/shm然後我們/etc/fstab 中,檢視/分所在的分割槽或分割槽標籤是什麼;[root@localhost ~]# more /etc/fstab# This file is edited by fstab-sync - see 'man fstab-sync' for detailsLABEL=/ / ext3 defaults 1 1/dev/devpts /dev/pts devpts gid=5,mode=620 0 0/dev/shm /dev/shm tmpfs defaults 0 0/dev/proc /proc proc defaults 0 0/dev/sys /sys sysfs defaults 0 0LABEL=SWAP-hda1 swap swap defaults 0 0/dev/hdc /media/cdrecorder auto pamconsole,exec,noauto,managed 0 0經過上面的df -lh 和more /etc/fstab 的對照中得知,/boot並是獨處一個分割槽,而是和/在同一個分割槽;這個Linux系統安裝在/dev/hda7上,檔案系統(此分割槽)的標籤為 LABEL=/ ,/boot也是處於/dev/hda7 ,/dev/hda7也可以說是 root (hd0,6);2]檢視核心vmlinuz的和initrd檔名的全稱;[root@localhost ~]# ls -lh /boot/vmlinuz*-rw-r--r-- 1 root root 1.6M 2005-06-03 /boot/vmlinuz-2.6.11-1.1369_FC4[root@localhost ~]# ls -lh /boot/initrd*-rw-r--r-- 1 root root 1.1M 11月 26 22:30 /boot/initrd-2.6.11-1.1369_FC4.img3]開始寫menu.lst ;我們根據上面所提到的,可以寫成如下的樣子;default=0timeout=5title FC4root (hd0,6)kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/initrd /boot/initrd-2.6.11-1.1369_FC4.img也可以寫成;default=0timeout=5title FC4root (hd0,6)kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7initrd /boot/initrd-2.6.11-1.1369_FC4.img註解:上面兩個不同之處在於一指定Linux的根/所在的分割槽時,一個是用了檔案系統的標籤,另一個沒有用標籤;2、menu.lst的寫法之二,精簡型;本寫法主要是把指定/boot所位於的所分割槽直接寫入kernel 指令行;這樣就省略了透過root (hd[0-n],y)來指定/boot所位於的分割槽;1)第一種情況:/boot和Linux的/根分割槽在同一個分割槽;有前面的那麼多的講解,menu.lst寫法之二就好理解多了;也得分兩種情況,我們們先把/boot並不是獨處一個分割槽,而是和Linux的根分割槽處於同一個分割槽;我們以 4)menu.lst第一種方法的寫法總結 的例項為例子;default=0timeout=5title FC4xkernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7initrd (hd0,6)/boot/initrd-2.6.11-1.1369_FC4.img註解:title FC4x 注:自己為這個Linux 起個簡單的名,以title開頭,然後一個空格,後面就自己發揮吧,FC4或FC4x都行;kernel 空格 (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 空格 ro 空格 root=/dev/hda7kernel 這行這樣理解 kernel (boot所在的分割槽)/boot/核心檔案件全稱 ro root=Linux根所位於的分割槽或標籤initrd 空格 (hd0,6)/boot/initrd-2.6.11-1.1369_FC4.imginitrd 這行可以這樣理解 initrd (/boot所在的分割槽)/boot/核心檔名全稱2)第二種情況:/boot獨立一個分割槽,和Linux的根分割槽不是同一個分割槽;比如我們檢視到df -lh 得到的是[root@localhost ~]# df -lhFilesystem 容量 已用 可用 已用% 掛載點/dev/hda6 200M 120M 80M 60% /boot/dev/hda7 11G 9.2G 1.2G 90% /我們再進一行檢視/etc/fstab 得知;LABEL=/ / ext3 defaults 1 1LABEL=/boot /boot ext3 defaults 1 2所以我們應該寫成如下的;title FC4xkernel (hd0,5)/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/initrd (hd0,5)/initrd-2.6.11-1.1369_FC4.img因為Linux的根分割槽是/dev/hda7,透過/etc/fstab和df -h的內容得知標籤為 LABEL=/的分割槽就是/dev/hda7 ,所以有;title FC4xkernel (hd0,5)/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7initrd (hd0,5)/initrd-2.6.11-1.1369_FC4.img五、透過GRUB命令列來啟動Linux作業系統;GRUB的命令列才是王道,如果知道怎麼用命令列來啟動作業系統,那理解menu.lst的寫法也不難;也就是說在開機的時候,不用GRUB的選單,透過GRUB的命令也是一樣能把作業系統引導起來。因為menu.lst的內容就是GRUB的一個一個的指令集合;是不是Linux這玩意很神奇?1、為什麼需要學習GRUB的命令列;當我們把GRUB的menu.lst寫錯的時候,或者丟掉了menu.lst的時,比如在開機的時候,GRUB會出現grub>類似的命令提示符,這時需要我們用命令列啟動系統;當然您可以不用定義GRUB的選單 ,直接用命令列來啟動系統,比如我現在就是,為了寫GRUB的文件,就把menu.lst 刪除了,直接用命令來啟動系統;2、用命令列來引導Linux作業系統的步驟;透過命令列來引導作業系統的流程,也沒有什麼難的;無非是把指令手工輸入到grub>提示符的後面;在這個過程中,tab鍵的命令補齊功能就顯得很重要了。如果您不知道有哪些命令,可以輸入help;1)進入GRUB的命令列模式 grub>如果開機時,GRUB出現的是grub>,說明你沒有/etc/grub/menu.lst ,您需要自己寫一個才會GRUB的選單,讓我們來選擇進入哪個系統。如果有GRUB的選單,您可以按Ctrl+c組合鍵進入GRUB的命令列模式,會出現grub> 提示符;grub>2)獲取幫助GRUB的 help只要您在grub>提示符的後面輸入help 就能得到GRUB所有的命令提示;grub> helpblocklist FILE bootcat FILE chainloader [--force] FILEclear color NORMAL [HIGHLIGHT]configfile FILE device DRIVE DEVICEdisplayapm displaymemfind FILENAME geometry DRIVE [CYLINDER HEAD SECTOR [halt [--no-apm] help [--all] [PATTERN ...]hide PARTITION initrd FILE [ARG ...]kernel [--no-mem-option] [--type=TYPE] makeactivemap TO_DRIVE FROM_DRIVE md5cryptmodule FILE [ARG ...] modulenounzip FILE [ARG ...]pager [FLAG] partnew PART TYPE START LENparttype PART TYPE quitreboot root [DEVICE [HDBIAS]]rootnoverify [DEVICE [HDBIAS]] serial [--unit=UNIT] [--port=PORT] [--setkey [TO_KEY FROM_KEY] setup [--prefix=DIR] [--stage2=STAGE2_terminal [--dumb] [--no-echo] [--no-ed terminfo [--name=NAME --cursor-addresstestvbe MODE unhide PARTITIONuppermem KBYTES vbeprobe [MODE]如果需要得到某個指令的幫助,就在 help 後面空一格,然後輸入指令,比如;grub>help kernel3)cat的用法;cat指令是用來檢視檔案內容的,有時我們不知道Linux的/boot分割槽,以及/根分割槽所在的位置,要檢視/etc/fstab的內容來得知,這時,我們就要用到cat (hd[0-n],y)/etc/fstab 來獲得這些內容;注意要學會用tab鍵命令補齊的功能;grub> cat ( 按tab 鍵會出來hd0或hd1之類的;grub> cat (hd0, 注:輸入hd0,然後再按tab鍵;會出來分割槽之類的;grub> cat (hd0,6)Possible partitions are:Partition num: 0, Filesystem type unknown, partition type 0x7Partition num: 4, Filesystem type is fat, partition type 0xbPartition num: 5, Filesystem type is reiserfs, partition type 0x83Partition num: 6, Filesystem type is ext2fs, partition type 0x83Partition num: 7, Filesystem type unknown, partition type 0x83Partition num: 8, Filesystem type is reiserfs, partition type 0x83Partition num: 9, Filesystem type unknown, partition type 0x82grub> cat (hd0,6)/etc/fstab 注:比如我想檢視一下 (hd0,6)/etc/fstab的內容就這樣輸入;LABEL=/ / ext3 defaults 1 1/dev/devpts /dev/pts devpts gid=5,mode=620 0 0/dev/shm /dev/shm tmpfs defaults 0 0/dev/proc /proc proc defaults 0 0/dev/sys /sys sysfs defaults 0 0LABEL=SWAP-hda1 swap swap defaults 0 0/dev/hdc /media/cdrecorder auto pamconsole,exec,noauto,managed 0 0有的弟兄可能會說,我不知道Linux安裝在了哪個分割槽。那根據檔案系統來判斷一個一個的嘗試總可以吧我;只要能cat出/etc/fstab就能為以後引導帶來方便;主要檢視/etc/fstab中的內容,主要是Linux的/分割槽及/boot是否是獨立的分割槽;如果沒有/boot類似的行,證明/boot和 Linux的/處於同一個硬碟分割槽;比如上面的例子中LABEL=/ 這行是極為重要的;說明Linux系統就安在標籤為LABEL=/的分割槽中;如果您的Linux系統/boot和/沒有位於同一個分割槽,可能cat (hd[a-n],y) 查到的是類似下面的;LABEL=/ / ext3 defaults 1 1LABEL=/boot /boot ext3 defaults 1 24) root (hd[0-n,y) 指令來指定/boot所在的分割槽;其實這個root (hd[0,n],y)是可以省略的,如果省略了,我們要在kerenl 命令中指定;我們前面已經說過 (hd[0-n],y) 硬碟分割槽的表示方法的用途;主要是用來指定 /boot所在的分割槽;比如我們確認/boot和 (hd0,6),所以就可以這樣來輸入root (hd0,6)grub> root (hd0,6)如果發現不對,可以重新來過;沒有什麼大不了的;5) kernel 指令,用來指定Linux的核心,及/所在的分割槽;kernel 這個指令可能初學者有點怕,不知道核心在哪個分割槽,及核心檔名的全稱是什麼。不要忘記tab鍵的命令補齊的應用;如果我們已經透過root (hd[0-n],y) 指定了/boot所在的分割槽,語法有兩個:如果/boot和Linux的/位於同一個分割槽,應該是下面的一種格式;kernel /boot/vmlinuz在這裡按tab鍵來補齊,就看到核心全稱了 ro root=/dev/hd[a-z]X如果/boot有自己獨立的分割槽,應該是;kernel /vmlinuz在這裡按tab鍵來補齊,就看到核心全稱了 ro root=/dev/hd[a-z]X在這裡 root=/dev/hd[a-z]X 是Linux 的/根所位於的分割槽,如果不知道是哪個分割槽,就用tab出來的來計算,一個一個的嘗試;或用cat (hd[0-n],y)/etc/fstab 中得到Linux的/所在的分割槽或分割槽的標籤;grub> kernel /boot/在這裡按tab鍵;這樣就列出/boot中的檔案了;Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4 grubBAK memtest86+-1.55.1 xen-syms xen.gzgrub> kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/[Linux-bzImage, setup=0x1e00, size=0x18e473]註解: root=LABEL=/ 是Linux的/所在的分割槽的檔案系統的標籤;如果您知道Linux的/在哪個具體的分割槽,用root=/dev/hd[a-z]X來指定也行。比如下面的一行也是可以的;grub> kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7也可以把/boot所在的分割槽的指定 root (hd[0-n],y)這行省掉,直接在kernel 中指定/boot所在的分割槽;所以就在下面的語法;如果是/boot和Linux的根同處一個分割槽;kernel (hd[0-n],y)/boot/vmlinuz ro root=/dev/hd[a-z]X比如:grub>kernel如果是/boot和Linux所在的根不在一個分割槽;則是;kernel (hd[0-n],y)/vmlinuz ro root=/dev/hd[a-z]Xgrub> kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7[Linux-bzImage, setup=0x1e00, size=0x18e473]或下面的輸入,以cat 出/etc/fstab內容為準;grub> kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/[Linux-bzImage, setup=0x1e00, size=0x18e473]6)initrd 命令列來指定initrd檔案;grub> initrd /boot/initrd在這裡tab 來補齊;grub> initrd /boot/initrd-2.6.11-1.1369_FC4.img[Linux-initrd @ 0x2e1000, 0x10e685 bytes]如果/boot是獨立的一個分割槽,應該是如下樣子的語法;比如下面的;grub> initrd /initrd在這裡tab 來補齊;grub> initrd /initrd-2.6.11-1.1369_FC4.img[Linux-initrd @ 0x2e1000, 0x10e685 bytes]7)boot 引導系統;grub>boot前面的幾個步驟都弄好 。就進入引導;嘗試一下就知道了。。8)引導Linux系統例項全程回放;例項:/boot和Linux的/處於同一個硬碟分割槽;grub> cat (hd0,6)/etc/fstab# This file is edited by fstab-sync - see 'man fstab-sync' for detailsLABEL=/ / ext3 defaults 1 1/dev/devpts /dev/pts devpts gid=5,mode=620 0 0/dev/shm /dev/shm tmpfs defaults 0 0/dev/proc /proc proc defaults 0 0/dev/sys /sys sysfs defaults 0 0LABEL=SWAP-hda1 swap swap defaults 0 0/dev/hdc /media/cdrecorder auto pamconsole,exec,noauto,managed 0 0grub> root (hd0,6)Filesystem type is ext2fs, partition type 0x83grub> kernel /boot/在這裡按tab補齊,全列出/boot所有的檔案;Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4memtest86+-1.55.1 xen-syms xen.gzgrub> kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7 注:輸入[Linux-bzImage, setup=0x1e00, size=0x18e473]grub> initrd /boot/在這裡按tab補齊Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4memtest86+-1.55.1 xen-syms xen.gzgrub> initrd /boot/initrd-2.6.11-1.1369_FC4.img 注;輸入intrd檔名的全名;[Linux-initrd @ 0x2e1000, 0x10e685 bytes]grub> boot我們指定Linux的根時,可以用cat出來的fstab的內容中Linux的/分割槽檔案系統標籤來替代;也就是kernel 那行中 root=/dev/hd[a-z]X;grub> cat (hd0,6)/etc/fstab# This file is edited by fstab-sync - see 'man fstab-sync' for detailsLABEL=/ / ext3 defaults 1 1/dev/devpts /dev/pts devpts gid=5,mode=620 0 0/dev/shm /dev/shm tmpfs defaults 0 0/dev/proc /proc proc defaults 0 0/dev/sys /sys sysfs defaults 0 0LABEL=SWAP-hda1 swap swap defaults 0 0/dev/hdc /media/cdrecorder auto pamconsole,exec,noauto,managed 0 0grub> root (hd0,6)Filesystem type is ext2fs, partition type 0x83grub> kernel /boot/在這裡按tab補齊,全列出/boot所有的檔案;Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4memtest86+-1.55.1 xen-syms xen.gzgrub> kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/[Linux-bzImage, setup=0x1e00, size=0x18e473]grub> initrd /boot/在這裡按tab補齊Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4 grubBAKmemtest86+-1.55.1 xen-syms xen.gzgrub> initrd /boot/initrd-2.6.11-1.1369_FC4.img 注;輸入intrd檔名的全名;[Linux-initrd @ 0x2e1000, 0x10e685 bytes]grub> boot如果是/boot和Linux的根分割槽不在同一個分割槽,要把kernel和initrd 指令中的/boot去掉,也就是/vmlinuzMMMMMM 或 /initrdNNNN也可以不用root (hd[0-n]來指定/boot所在分割槽,要在kernel 和initrd 中指定;比如Linux的/根所位於的分割槽和/boot所位於的分割槽都是(hd0,6),並且我們cat出來的/etc/fstab是Linux的/根分割槽的檔案系統的標籤為LABEL=/,引導作業系統的例子如下;grub>kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/grub>initrd (hd0,6)/boot/initrd-2.6.11-1.1369_FC4.imggrub>boot或grub>kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7grub>initrd (hd0,6)/boot/initrd-2.6.11-1.1369_FC4.imggrub>boot如果/boot位於 /dev/hda6,也就是(hd0,5),Linux的根/位於分割槽/dev/hda7,並且我們cat 出來的/etc/fstab 中/分割槽的標籤為 LABEL=/。下面的兩種方法都可以引導;grub>kernel (hd0,5)/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/grub>initrd (hd0,5)/initrd-2.6.11-1.1369_FC4.imggrub>boot或grub>kernel (hd0,5)/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7grub>initrd (hd0,5)/initrd-2.6.11-1.1369_FC4.imggrub>boot六、透過GRUB引導Windows作業系統;1、透過編輯 menu.lst 來引導Windows 系統;如果您的Windows所處於的分割槽在(hd0,0),可以在menu.lst 加如下的一段就能引導起來了;title WinXprootnoverify (hd0,0)chainloader +1如果您的機器有兩塊硬碟,而Windows 位於第二個硬碟的第一個分割槽,也就是(hd1,0)您可以用grub的map來指令來操作把兩塊硬碟的序列對調,這樣就不用在BIOS中設定了;在menu.lst中加如下的內容,比如下面的;title WinXpmap (hd0) (hd1)map (hd1) (hd0)rootnoverify (hd0,0)chainloader +1makeactive如果Windows的分割槽不位於硬碟的第一個分割槽怎麼辦呢?比如在(hd0,2);這個也好辦吧,把rootnoverify 這行的(hd0,0)改為 (hd0,2)title WinXprootnoverify (hd0,2)chainloader +1makeactive如果Windows的在第二個硬碟的某個分割槽,比如說是位於(hd1,2),則要用到map指令;title WinXpmap (hd0) (hd1)map (hd1) (hd0)rootnoverify (hd1,2)chainloader +1makeactive如果有多個Windows 系統,怎麼才能引匯出來呢?應該用hide 和unhide指令操作;比如我們安裝了兩個Windows ,一個是位於(hd0,0)的windows 98 ,另一個是安裝的是位於(hd0,1)的WindowsXP;這時我們就要用到hide指令了;title Win98unhide (hd0,0)hide (hd0,1)rootnoverify (hd0,0)chainloader +1makeactivetitle WinXPunhide (hd0,1)hide (hd0,0)rootnoverify (hd0,1)chainloader +1makeactive2、透過GRUB指令來引導Windows ;其實我們會寫menu.lst了,在menu.lst中的除了title外,都是一條條指令;如果我們啟動Windows ,只是輸入指令就行了;比如 Windows的分割槽在 (hd0,0),我們在開機後,按ctrl+c ,進入GRUB的命令模式;就可以用下面的grub> rootnoverify (hd0,0)grub> chainloader +1grub> boot其它同理... ...七、GRUB丟失或損壞的應對策略;如果GRUB是Linux版本才出會這樣的問題;WINGRUB可以不寫在MBR上;所以不會出現這樣的問題。WINGRUB用起來比較簡單。menu.lst 和命令列的用法和Linux版本的GRUB是一樣的;1、由於重新安裝Windows或其它未知原因而導致GRUB的丟失;您可以透過系統安裝盤、livecd進入修復模式;請參考:《Linux 系統的單使用者模式、修復模式、跨控制檯登入在系統修復中的運用》首先:您根據前面所說grub-install來安裝GRUB到/boot所在的分割槽;要仔細看文件,/boot是不是處於一個獨立的分割槽是重要的,執行的命令也不同;其次:要執行grub ,然後透過 root (hd[0-n],y)來指定/boot所位於的分割槽,然後接著執行 setup (hd0),這樣就寫入MBR了,比如下面的例子;grub>root (hd0,6)grub>setup (hd0)grub>quit重新引導就會再次出現MBR的選單了或命令列的提示符了;2、如果出現GRUB提示符,而不出現GRUB的選單,如何引導系統;存在的問題可能是/boot/grub/menu.lst丟失,要自己寫一個才行;您可以用命令列來啟動系統,進入系統後寫一寫menu.lst就OK了。前面已經談過了;寫好後還要建一個grub.conf的連結,如下:[root@localhost ~]# cd /boot/grub[root@localhost grub]# ln -s menu.lst grub.conf八、關於GRUB的未盡事宜;GRUB有很多內容,比如對BSD的引導,還有一些其它指令的用法,我並沒有在本文提到;主要我目前還未用到,如果您需要了解更多,請檢視 《GNU GRUB 手冊和FAQ》九、關於本文;十、參考文件;《GNU GRUB 手冊和FAQ》十一、相關文件;《以WINGRUB 引導安裝Fedora 4.0 為例,詳述用WINGRUB來引導Linux的安裝》《系統引導管理器GRUB學習筆記》《在Linux系統中儲存裝置的兩種表示方法》《合理規劃您的硬碟分割槽》《系統引導過程及硬碟分割槽結構論述》《Linux 檢視磁碟分割槽、檔案系統、使用情況的命令和相關工具介紹》《例項解說 fdisk 使用方法》《在Fedora core 4.0 載入NTFS和FAT32分割槽詳述》《Fedora Core 4.0 HAL配置即插即用移動儲存(USB及1394)的實踐
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-938346/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 妙手回春——GRUB系統引導器恢復指南薦
- 雙硬碟grub引導9個作業系統(轉)硬碟作業系統
- 筆記本雙系統的grub系統引導恢復(轉)筆記
- Ubuntu/Linux入門介紹-引導管理器Grub(轉)UbuntuLinux
- RMAN初學者指南(轉)
- 模板初學者指南1 (轉)
- 模板初學者指南2 (轉)
- HTML初學者指南(九)(轉)HTML
- HTML初學者指南(七)(轉)HTML
- HTML初學者指南(六)(轉)HTML
- HTML初學者指南(四)(轉)HTML
- HTML初學者指南(三)(轉)HTML
- HTML初學者指南(二)(轉)HTML
- HTML初學者指南(一)(轉)HTML
- 玩轉grub的開機引導(轉)
- 初學者指南
- Linunx系統引導過程及MBR/GRUB故障
- 【Linux】grub命令列引導進入windows系統Linux命令列Windows
- 已有一個LINUX系統用GRUB引導硬碟安裝紅旗(轉)Linux硬碟
- apache+mod_ssl初學者指南(轉)Apache
- Nginx初學者指南Nginx
- Groovy初學者指南
- RMAN 初學者指南
- 引導系統-MBR(轉)
- 透過GRUB Multiboot2引導自制作業系統boot作業系統
- 程式設計“初學者”入門指南 (轉)程式設計
- Linux初學者Patch使用指南(轉)Linux
- linux系統初學者Linux
- OAuth 2.0初學者指南OAuth
- Kotlin初學者指南Kotlin
- 【譯】GraphQL 初學者指南
- Apache Hudi初學者指南Apache
- Linux引導過程和GRUB引導器Linux
- 建立多重引導系統(轉)
- linux系統引導失敗,出現grub rescure恢復介面Linux
- zt:Grub引導的Linux系統下使用MaxDos V6.0Linux
- 用 Win7 引導 grub4dos,以及用 grub 引導 Win7Win7
- 初學者 (轉)