1. 程式人生 > >通過grub-install命令把grub安裝到u盤-總結

通過grub-install命令把grub安裝到u盤-總結

nsswitch phi 一次 兩個 payload notice mar 手工 span

通過grub-install命令把grub安裝到u盤


①準備一個u盤。容量不限。能有1MB都足夠了。
②把u盤格式化(我把u盤格式化成FAT、fat32格式了,最後證明也是成功的)。
③開啟linux系統,打開命令行終端。進入root模式,然後輸入命令行:
mount /dev/sdb3 /tmp/boot
grub-install --root-directory=/tmp/boot --no-floppy /dev/sdb


註意:上面/dev/sdb是我的u盤,在linux系統裏的盤符吧,那個/dev/sdb3為什麽是“3”。這個因不同的實際情況而不同吧。
總的來說,/dev/sdb就是我的u盤的名字,/dev/sdb3就是我的u盤的一個分區。




④這個時候。你會發現,你的u盤。已經多了一個boot文件夾,裏面有一些內容,這個時候,boot文件夾的路徑是/dev/sdb3/boot/。
⑤把“/boot/grub/grub.conf”和“/boot/grub/splash.xpm.gz”。拷貝到“/dev/sdb3/boot/grub/”以下(也就是“u盤/boot/grub/”)。
⑥然後把/dev/sdb3/boot/grub/grub.conf改動成以下內容:
# 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/sda1
# initrd /boot/initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz


title Red Hat Enterprise Linux Server 1280*1024(3.4.0)
root (hd0,0)
kernel /boot/vmlinuz-3.4.0 root=/dev/sda1 selinux=0 init=/sbin/init vga=795 fb:on
initrd /boot/initrd.img-3.4.0

title Red Hat Enterprise Linux Server 1600*1200(3.4.0)
root (hd0,0)
kernel /boot/vmlinuz-3.4.0 root=/dev/sda1 selinux=0 init=/sbin/init vga=858 fb:on
initrd /boot/initrd.img-3.4.0



⑦重新啟動計算機。在BIOS裏。設置為從u盤啟動,就可以。


說明:grub2.0以後支持的是grub.cfg

set default=0
set timeout=5
set gfxmode=1280x1024
menuentry ‘Red Hat Enterprise Linux Server 1280*1024(3.4.0)‘ {
       set gfxpayload=1280x1024x32,1024x768x32,800x600x32,800x600x16,800x600,640x480
	linux /boot/vmlinuz-3.4.0  root=/dev/sda1 selinux=0 init=/sbin/init vga=795 
	initrd /boot/initrd.img-3.4.0
}


制作步驟:


先用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時。非常easy改動。

) 用於存儲引導文件。


運行命令
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
由於一個是0.97版(grub-legacy),一個是2.02版(grub2)
grub-legacy 沒有 /boot/grub/grub.cfg 這個文件,而是使用 menu.lst 文件。


root (hd0,0)
kernel /boot/vmlinuz-3.10xxx
initrd /boot/initrd-3.10xxx
boot
這個格式是grub格式。或者grub一代


root (hd0,msdos0)
linux /boot/vmlinuz-3.10xxx
initrd /boot/initrd-3.10xxx
boot
這是grub2的寫法

rhel6曾經都採用grub一代,到rhel7則採用grub2模塊化引導管理器

grub和grub2的異同還請參考官方文檔或自行百度!
我的筆記:

系 統:虛擬機RHEL6.4(2.6.32)

裁剪內核:linux-2.6.34

在虛擬機+虛擬硬盤、945主板+USB,均引導內核成功,系統未作復雜裁剪,未作壓縮鏡像

1. linux內核編譯:

詳細步驟:
# tar zxvf linux-2.6.tar.gz -C /usr/src
# cd /usr/src/linux2.6
# make menuconfig


# make
# make modules_install
# cp arch/x86/boot/bzImage /boot/vmlinuz-2.6

# make install

對照/boot/grub/grub.cfg文件的改動

2. 安裝啟動盤(U盤、硬盤)

# Fdisk /dev/sdb

#mkfs.ext2 /dev/sdb1

# mkdir /tmp/boot ; mount /dev/sdb1/tmp/boot

# grub-install--root-directory=/tmp/boot --no-floppy /dev/sdb

# cp /boot/grub/grub.conf /tmp/boot/boot/grub/

# cp /boot/grub//boot/grub/splash.xpm.gz /tmp/boot/boot/grub/

# cp /boot/vmlinuz-2.6.34/mnt/boot/vmlinuz

# cp /boot/initramfs-2.6.34.img/mnt/boot/initramfs.img

3. 構建系統文件夾

# mkdir dev proc etc sbin bin lib mntusr

# cp /bin /tmp/boot/

# cp –dpr /dev/{console,fd0.hda,hda8,hda9,hda10,initctl,initrd,kmem,mem,null,ram,ram0,ramdisj,sda,tty1,tty} /tmp/boot/

# cp/etc/{default,ld.so.cache,ld.so.conf,login.defs,fstab,groub,init.d,inittab,issue,modules.conf,mtab,nsswitch.conf,pam.d,profile,rc.d} /tmp/boot/

4. 編輯grub.conf

Default為默認啟動項

Grub2 grub.cfg

set default=0

set timeout=5

set gfxmode=1280x1024

menuentry ‘Red Hat EnterpriseLinux Server 1280*1024(3.4.0)‘ {

setgfxpayload=1280x1024x32,1024x768x32,800x600x32,800x600x16,800x600,640x480

linux/boot/vmlinuz-3.4.0 root=/dev/sda1selinux=0 init=/sbin/init vga=795

initrd/boot/initrd.img-3.4.0

}

5. 加入必要的命令

比如:ls

Ldd ls,加入相應的依賴庫文件;ldd ls > 1.txt

6. 改動initrd

又一次編譯內核後,可能加入了自己定義的模塊。就有可能須要改動init文件。而init文件就在initrd中,這裏記錄下操作步驟,以防遺忘。

1. cp /boot/initrd-3.2.img /tmp/mylinux/initrd-3.2.img.gz

這裏之所以進行改名。是由於initrd-3.2.img是經過gzip壓縮過的,所以須要對其解壓,可是gzip對解壓的文件的文件後綴名又有要求。所以就先進行改名。

2. gunzip initrd-3.2.9.img.gz

3. cpio -id < initrd-3.2.9.img

經過以上三步,就在當前文件夾下解壓了initrd文件。從而得到了init文件。

依據自己的需求改動init文件後。通過以下命令又一次生成initrd文件。

4. find . | cpio -H newc -o | gzip -9 > /boot/initrd-3.2.9.img

find . | cpio -H newc -o | gzip -9>../initrd.img-3.4.0

7. 內核加入fb0

mknod /dev/fb0 c 29 0

Device Drivers --->

Graphics support --->

<*> Support for frame buffer devices--->

318 31b 35a

1024 1280 1600

8. 加入網絡驅動

# initrd,img/init

echo "0: linuxrunning on initrd.img"

echo "1: linuxrunning on usb ext2 filesystem"

read -p "select:" data

if [ $data ="0" ]; then

echo "0: linux running oninitrd.img selected"

uname -r

insmod lib/modules/3.4.0/kernel/drivers/net/mii.ko

insmod lib/modules/3.4.0/kernel/drivers/net/ethernet/realtek/r8169.ko#加入網絡

insmod lib//modules/3.4.0/kernel/drivers/usb/storage/usb-storage.ko#加入USB

sleep 1

mkdir usb

mount /dev/sda1usb

ifconfig -a

ifconfig eth0192.168.1.88

sleep 1

sh

else

echo "1: linux running on usb ext2filesystem selected"

sleep 1

fi


通過grub-install命令把grub安裝到u盤-總結