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

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


①準備一個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
java


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
}


製做步驟:linux


先用cfdisk 在U盤中,建立個兩個分區,第二個一下子做爲boot分區。ubuntu


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


本身改動一下menu.lst文件吧。這個簡單。

****************************************************************************
以上全部推翻重寫。
windows

需要懂得理論上的知識,才幹作出正確的結果。

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

首先理解引導中U盤引導部分的過程。
1:當BISO通電引導到磁盤時。會檢查MBR區域(MBR:446+DPT:64+ENDFLAG:2=512)
MBR裏面必須存在引導程序,通常會是咱們熟悉grub,dos,95dos引導等。不然沒法引導。
這裏作個簡要說明:尋常咱們將系統安裝硬盤上,一般安裝都是安裝windows,再安裝linux,而一般當安裝linux時。會提示你是否安裝到MBR裏面,或者安裝到你的某個磁盤分區裏面,通常是你的/boot的所在分區。centos


安裝在MBR,或者某個磁盤分區。這2者之間存在區別。
a:當安裝到MBR時。會將已經存在的Win本身在MBR的引導程序替代,變成GRUB引導。
b:當安裝到某個分區時。會由存在的Win的引導程序,引導到那個分區的Grub,再有Grub引導到各個操做系統。
這就是2者的區別。

win沒有爲其餘系統考慮過。到了本身的磁盤分區以後。對於引導其餘系統,沒有提供可以直接引導的命令。僅僅能進入後改動它的boot.ini文件。而grub提供命令命令菜單,可以進行手工引導。網絡



2:grub的製做
筆者發現win僅僅能本身主動識別出U盤的第一個分區,而對於第二個分區無動於衷。模塊化

因此作了這種分區方案。post

第一個分區用來存儲數據。第二個分區用來放置引導信息,這樣不至於在使用過程當中。本身建立的grub的boot分區,被別人勿刪除,或者格式化。this

個人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上面的內容多了起來。

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


如下分享一下。裏面的內容。首先是文件夾結構。


root@kook:~# 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
root@kook:~# mount /dev/sdb2 /tmp/boot/
root@kook:~# tree -d /tmp/boot
/tmp/boot
|-- boot
|    `-- grub
|-- centos4.4
|-- centos4.4-64
|-- lost+found
`-- ubuntu704

6 directories



如下是menu.lst的內容。


root@kook:~# 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

相關文章
相關標籤/搜索