1. 程式人生 > >做個grub的U盤啟動盤,即將grub安裝到U盤上面。

做個grub的U盤啟動盤,即將grub安裝到U盤上面。

製作步驟:

先用cfdisk 在U盤中,建立個兩個分割槽,第二個一會兒作為boot分割槽。

0:mkfs.ext3 /dev/sdc5
1:mount /dev/sdc5 /tmp/boot
2:grub-install --root-directory=/tmp/boot --no-floppy  /dev/sdc(*注意*)

自己修改一下menu.lst檔案吧。這個簡單。

****************************************************************************
以上全部推翻重寫。需要懂得理論上的知識,才能做出正確的結果。

****************************************************************************

(下面一段話為我解釋了多系統啟動的流程)

首先理解引導中U盤引導部分的過程。
1:當BISO通電引導到磁碟時,會檢查MBR區域(MBR:446+DPT:64+ENDFLAG:2=512)
MBR裡面必須存在載入程式,通常會是我們熟悉grub,dos,95dos引導等。否則無法引導。
這裡做個簡要說明:平常我們將系統安裝硬碟上,通常安裝都是安裝windows,再安裝linux,而通常當安裝linux時,會提示你是否安裝到MBR裡面,或者安裝到你的某個磁碟分割槽裡面,通常是你的/boot的所在分割槽。

安裝在MBR,或者某個磁碟分割槽。這2者之間存在差別。
a:當安裝到MBR時,會將已經存在的Win自己在MBR的載入程式替代,變成GRUB引導。
b:當安裝到某個分割槽時,會由存在的Win的載入程式,引導到那個分割槽的Grub,再有Grub引導到各個作業系統。
這就是2者的差別。win沒有為其他系統考慮過,到了自己的磁碟分割槽之後,對於引導其它系統,沒有提供可以直接引導的命令,只能進入後修改它的boot.ini檔案。而grub提供命令命令選單,可以進行手工引導。

2:grub的製作
筆者發現win只能自動識別出U盤的第一個分割槽,而對於第二個分割槽無動於衷。
所以做了這樣的分割槽方案。第一個分割槽用來儲存資料,第二個分割槽用來放置引導資訊,這樣不至於在使用過程中,自己建立的grub的boot分割槽,被別人勿刪除,或者格式化。
我的1G U盤分割槽如下:

/dev/sdc1  950M   ntfs                                                      用於平時的資料儲存
/dev/sdc5  60M     ext3   (boot標識,可以引導啟動,用cfdisk時,很容易修改。) 用於儲存引導檔案。

執行命令
mount /dev/sdc5 /tmp/boot
grub-install --root-directory=/tmp/boot --no-floppy  /dev/sdc
此處腳下留神,必須講grub安裝到/dev/sdc,否則目前對於U盤的MBR來講,沒有可以用的載入程式。
此命令執行後,會在/tmp/boot/目錄,也就是/dev/sdc5,下面產生目錄/boot/grub.裡面有*stage*等檔案。

最後在/boot/grub 目錄中建立menu.lst檔案。檔案內容如下:

timeout         20
default         0
title windows xp
map (hd0) (hd1)
map (hd1) (hd0)
rootnoverify (hd1,0)
makeactive
chainloader +1

講一下,如果你用U盤引導後,他會把自己標記為hd0。而已經安裝在硬碟上的win作業系統認為自己的宿主硬碟是hd0,此時引導win作業系統時就會造成碟符錯位。因此我們需要用map進行一下對映轉換。
map 的解釋及使用如下:
map TO_DRIVE   FROM_DRIVE
對映 驅動器FROM_DRIVE 到TO_DRIVE.
當你鏈式引導向dos一樣的作業系統,並且該系統沒有在第一個驅動器上時,必須進行該對映。


that's Ok!

****************************************************************************
隨著我的使用的愈加頻繁,menu.lst上面的內容多了起來。

****************************************************************************


下面分享一下,裡面的內容。首先是目錄結構。

[email protected]:~# fdisk -l /dev/sdb

Disk /dev/sdb: 1010 MB, 1010826752 bytes
32 heads, 61 sectors/track, 1011 cylinders
Units = cylinders of 1952 * 512 = 999424 bytes

  Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         951      928145+   6  FAT16
/dev/sdb2   *         952        1011       58560   83  Linux
[email protected]:~# mount /dev/sdb2 /tmp/boot/
[email protected]:~# tree -d /tmp/boot
/tmp/boot
|-- boot
|   `-- grub
|-- centos4.4
|-- centos4.4-64
|-- lost+found
`-- ubuntu704

6 directories


下面是menu.lst的內容。

[email protected]:~# cat /tmp/boot/boot/grub/menu.lst
color light-gray/blue
timeout         20
default         0

title           Windows 95/98/NT/2000
map             (hd0) (hd1)
map             (hd1) (hd0)
rootnoverify    (hd1,0)
makeactive
chainloader     +1

title           CentOS 4.4 x86_64 Net Install
root            (hd0,1)
kernel          /centos4.4-64/vmlinuz root=/dev/hda2 ro single
initrd          /centos4.4-64/initrd.img
boot

title           CentOS 4.4 i386 Net Install
root            (hd0,1)
kernel          /centos4.4/vmlinuz root=/dev/hda2 ro single
initrd          /centos4.4/initrd.img
boot

title           Ubuntu 7.04 AMD 64 Net Install
root            (hd0,1)
kernel          /ubuntu704/linux root=/dev/hda2 ro single
initrd          /ubuntu704/initrd.gz
boot



注意:
1:成功的關鍵是MBR的內容。可以用dd if=/dev/sdc of=/tmp/mbr.bin bs=446 count=1 提取 出。hexdump -C /tmp/mbr.bin 檢視
2:有時候MBR會有問題。用這個命令清零吧。
dd if=/dev/zero of=/dev/sdc bs=446 count=1