首頁 > linux教程 > Linux系統啟動管理 閱讀:0更新時間:2020-03-28 01:03:01

Linux GRUB手動安裝方法詳解

需要手工安裝 GRUB 主要有兩種情況:
  1. linux 系統原先不是使用 GRUB 作為引導程序而現在想要使用 GRUB 來作為引導程序;
  2. MBR 中的引導程序被覆蓋,需要在 MBR 中重新安裝 GRUB,如先安裝了 Linux 系統,后安裝了 Windows 系統。

下面,我們分別介紹這兩種情況如何手工安裝 GRUB 引導程序。

系統中沒有GRUB,需要手工安裝

我們先來講第一種情況,就是 Linux 系統中沒有安裝 GRUB,我們需要重新安裝 GRUB;或者打算把不是啟動分區的某個分區變成啟動分區。比如我的系統中新建了一個分區 /dev/sdb1,并掛載到了 /tdisk/ 目錄上,我們查看一下新建立的分區,命令如下:

[root@localhost ~]# df
文件系統 1K-塊 已用 可用 已用% 掛載點
/dev/sda3 19923216 1787736 17123412 10% /
tmpfs 312672 0 312672 0% /dev/shm
/dev/sda1 198337 26359 161738 15% /boot
/dev/sdb1 2071384 68632 1897528 4% /tdisk

這個分區是我手工建立的,當然不是系統的默認啟動分區(系統默認啟動分區是 /boot 分區)。我們用這個分區模擬一個不是采用 GRUB 作為默認引導程序的 Linux 硬盤,在這個分區中手工安裝 GRUB 引導程序。也就是說,這個實驗成功后,/boot 分區可以啟動系統,/tdisk 分區也可以啟動系統。

具體安裝步驟如下:

1) 使用 grul-install 命令在要啟動的分區中安裝 GRUB 相關文件

在 /boot 分區中有一個 /boot/grub/ 目錄,這個目錄中保存的就是 GRUB 的相關文件(如文件系統的 Stage 1.5 文件)。我們查看一下 /boot 分區中的這個目錄,如下:

[root@localhost ~]#ls /boot/grub/
device.map ffs_stage1_5 jfs_stage1_5 reiserfs_stage1_5 stage2
xfs_stage1_5 e2fs_stage1_5 grub.conf menu.lst splash.xpm.gz
ufs2_stage1_5 fat_stage1_5 iso9660_stage1_5 minix_stage1_5 stage1
vstafs_stage1_5

但是在 /tdisk 目錄中并不存在這些文件,所以第一步就是要在 /tdisk 目錄中安裝這些 GRUB 相關文件,具體采用 grub-install 命令。這個命令的格式如下:

[root@localhost ~]# grub-install [選項] 設備文件名

選項:
  • -root-directory=DIR:DIR 為實際目錄,也就是手工指定 GRUB 相關文件的安裝目錄;

【例 1】命令標準格式。

[root@localhost ~]# gmb-install /dev/sda
#因為默認 GRUB 就是安裝到 /dev/sda 中的,所以不需要指定 --root-directory 選項

我們需要把 GRUB 安裝到 /tdisk 分區,所以需要執行以下命令:

[root@localhost ~]# grub-install --root-directory=/tdisk/dev/sdb1
#把GRUB安裝至/tdisk分區
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
This is the contents of the device map/tdisk/boot/ grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-rnn the script 'grub-install'.
(fd0) /dev/fd0
(hd0) /dev/sda
(hd1) /dev/sdb
#說明安裝的設備文件名

查看一下:

[root@localhost ~]# ll /tdisk/boot/grub/
總用量272
-rw-r--r--. 1 root root 45 5 月 22 23:51 device.map
-rw-r--r--. 1 root root 13392 5 月 22 23:51 e2fs_stage1_5
-rw-r--r--. 1 root root 12632 5 月 22 23:51 fat_stage1_5
-rw-r--r--. 1 root root 11760 5 月 22 23:51 ffs_stage1_5
-rw-r--r--. 1 root root 11768 5 月 22 23:51 iso9660_stage1_5
-rw-r--r--. 1 root root 13280 5 月 22 23:51 jfs_stage1_5
-rw-r--r--. 1 root root 11968 5 月 22 23:51 minix_stage1_5
-rw-r--r--. 1 root root 14424 5 月 22 23:51 reiserfs_stage1_5
-rw-r--r--. 1 root root 512 5月 22 23:51 stage1
-rw-r--r--. 1 root root 125984 5月 22 23:51 stage2
-rw-r--r--. 1 root root 12036 5 月 22 23:51 ufs2_stage1_5
-rw-r--r--. 1 root root 11376 5 月 22 23:51 vstafs_stage1_5
-rw-r--r--. 1 root root 13976 5 月 22 23:51 xfs_stage1_5

GRUB 的相關文件已經安裝到 /tdisk/boot/grub/ 目錄中。當然,這些文件還是需要 GRUB 的配置文件來讀取的。大家注意到了嗎? /tdisk/boot/grub/ 目錄中沒有 grub.conf 或 menu.lst 配置文件,這些配置文件還是需要依賴 /boot/grub/ 目錄的。

注意,如果系統中沒有 grul-install 命令,則說明沒有 GRUB 軟件,這時可以源碼包安裝,也可以 RPM 包安裝。RPM 包的安裝命令如下:

[root@localhost ~]# rpm -ivh /mnt/cdrom/Packages/ grub-0.97-77.el6.i686.rpm

2) 修改GRUB的配置文件

在我們的實驗中,GRUB 是已經安裝好的,所以可以直接修改 /boot/grub/gmb.conf 配置文件。但如果是沒有安裝過 GRUB 的 Linux 系統手工安裝 GURB,就需要自己建立 GRUB 配置文件了。那么我們修改 /boot/grub/grub.conf 配置文件如下:

[root@localhost ~]# vi /boot/gmb/grub.conf
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-279.el6.i686)
root(hd0,0)
kemel/vmlinuz-2.6.32-279.el6.i686 ro
root=UUID=b9a7a1 a8-767f-4a87-8a2ba535edb362c9 rd_NO_LUKS
KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkemel=auto
LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
initrd/initramfs-2.6.32-279.el6.i686.img title CentOS tdisk #給自己這個啟動分區起個名字吧
root(hd1,0)
#注意啟動分區的位置是/dev/sdb1,也就是/tdisk目錄
chainloader +1
#使用當前分區所在的啟動扇區啟動系統

在 title CentOS tdisk 段中不能指定內核鏡像和 initramfs 虛擬文件系統,因為在 /tdisk/boot/ 目錄中只有 grub 目錄,而沒有內核鏡像文件和 initramfs 虛擬文件系統的鏡像文件,所以需要通過 chainloader 來調用啟動扇區。

3) 安裝GRUB到/dev/sdb1分區的啟動扇區中

剛剛通過 GRUB 配置文件中的 chainloader 來調用啟動扇區,但是 /dev/sdb1 這個分區是新建立的,它的啟動扇區中并沒有 GRUB 程序。所以最后一步就是要在 /dev/sdb1 分區的啟動扇區中安裝 GRUB。這時就要利用 GRUB 交互模式了,如下:

[root@localhost boot]# grub
#啟動進入GRUB交互模式
grub> root (hd0,0)
root (hd0,0)
Filesystem type is ext2fs, partition type 0x83
#設定GRUB的主目錄,這里只能是(hd0,0),因為內核和虛擬文件系統安裝在/dev/sdal中,也就是/boot分區中
grub> find /boot/gnab/stagel
find /boot/grub/stagel (hd1,0)
#查詢一下Stage 1安裝的分區
#好像有一點問題,我們在/boot和/tdisk分區中都安裝了GRUB,只看到了/tdisk分區
grub> find /gcub/stagel
find /grub/stagel (hd0,0)
#只有這樣才能看到/boot分區中的Stage 1。因為/boot分區是一個單獨分區。上面能看到是因為/tdisk才是分區,而/boot/grub/只是/tdisk分區中的目錄
grub> find /vmlinuz-2.6.32-279.el6.1686
find /vmlinuz-2.6.32-279.el6.i686 (hd0,0)
#能夠查到內核位置。注意不能通過/boot/vmlinuz-2.6.32-279.el6.i686查詢,還是因為/boot是單獨分區。但是這次/tdisk分區中沒有內核
grub> setup (hd1,0)
setup (hd1,0)
Checking if "/boot/grub/stagel" exists... no
Checking if "/grub/stagel" exists... yes
Checking if "/grub/stage2" exists... yes
Checking if "/grub/e2fs_stage1_5" exists... yes
Running "embed /grub/e2fs_stage1_5 (hd1,0)"... failed (this is not fatal)
Running "embed /grub/e2fs_stage1_5 (hd0,0)"... failed (this is not fatal)
Running "install /grub/stagel d (hd1,0) /grub/stage2 p /grub/grub.conf "...
succeeded
Done
#在/tdisk分區的啟動扇區中安裝GRUB吧。雖然有兩個failed,但這只是兩個文件系統的Stage 1.5文件沒有安裝,并不影響
grub> quit
#退出GRUB交互界面

這時 GRUB 安裝完成了,可以重新啟動試驗一下了。重啟后可以看到圖 1 所示的界面。

圖 1 GRUB界面
當然 /tdisk 分區中并沒有真正的內核,所以最終還是要靠 /boot 分區啟動。如果是多內核并存的,就可以真正啟動了。

總結一下,在 Linux 系統中安裝 GRUB,或者在新分區中安裝 GRUB 的步驟如下:
  • 需要在 Linux 系統的指定分區中安裝 GRUB 的相關文件。這是通過 grub-stall 命令實現的。
  • 需要按照要求修改 GRUB 的配置文件,也就是 /boot/gmb/grub.conf。
  • 需要在分區的啟動扇區中安裝 GRUB,這是通過 grub 命令的交互模式實現的。

MBR中的GRUB被覆蓋,需要重新安裝GRUB

這種情況最常見的就是先安裝了 Linux 系統,后安裝了 Windows 系統,導致 MBR 中的 GRUB 被覆蓋。而 Windows 系統的啟動引導程序又不能識別 Linux 系統,從而導致 Linux 系統不能正常啟動。

這種情況解決起來比第一種要簡單得多,因為不需要安裝 GRUB 的相關文件和修改 GRUB 的配置文件,也就是第一種情況的第一步和第二步不需要執行,因為這是已經安裝和修改好的。只需要執行第三步,覆蓋 MBR 中的啟動引導程序即可。

但是這里的問題是,應該在什么地方啟動 GRUB 的交互模式呢?第一種情況是,我們是在 Linux 的命令行中執行 grub 命令,來啟動 GRUB 交互模式。第二種情況是已經不能正常啟動 Linux 系統了,當然也就沒有 Linux 的命令行了。在這種情況下,我們需要先利用 Linux 的光盤修復模式,使用光盤來啟動 Linux,進入 Linux 的命令行,再指定 grub 命令。Linux 的光盤修復模式將在后續章節中介紹。

我們先假設已經進入了光盤修復模式中的 Linux 命令行,那么只需執行如下命令即可:

sh-4.1#grub
#啟動GRUB交互界面。注意到了嗎?提示符不一樣了,那是因為系統是從光盤啟動的,所以環境變量沒有生效
gmb>root (hd0.0)
#同樣需要設置GRUB的主目錄
grub>setup (hd0)
#直接把GRUB安裝到MBR中,所以不需要指定分區
grub>quit
#退出

重啟系統之后,就可以發現熟悉的 GRUB 界面又回來了。這種安裝 GRUB 的方式要比第一種情況簡單,因為這并不是全裝,僅僅是覆蓋安裝而已。

beylze編程學院,一個分享編程知識和seo優化知識的網站。跟著beylze一起學習,每天都有進步。

通俗易懂,深入淺出,一篇文章只講一個知識點。

文章不深奧,不需要鉆研,在公交、在地鐵、在廁所都可以閱讀,隨時隨地漲姿勢。

文章不涉及代碼,不燒腦細胞,人人都可以學習。

當你決定關注beylze(公眾號:beylze),你已然超越了90%的其他從業者!

相關文章

優秀教程

国产亚洲欧美日韩