天天看点

通过grub-install命令把grub安装到u盘

通过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)

kernel /boot/vmlinuz-3.4.0  root=/dev/sda1 selinux=0 init=/sbin/init vga=858 fb:on

⑦重启计算机,在BIOS里,设置为从u盘启动,即可。 

说明:grub2.0以后支持的是grub.cfg

制作步骤:

先用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上面的内容多了起来。

下面分享一下,里面的内容。首先是目录结构。

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

title           windows 95/98/nt/2000

map             (hd0) (hd1)

map             (hd1) (hd0)

rootnoverify    (hd1,0)

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

kernel          /centos4.4/vmlinuz root=/dev/hda2 ro single

initrd          /centos4.4/initrd.img

title           ubuntu 7.04 amd 64 net install

kernel          /ubuntu704/linux root=/dev/hda2 ro single

initrd          /ubuntu704/initrd.gz

注意:

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 文件。

kernel /boot/vmlinuz-3.10xxx

initrd /boot/initrd-3.10xxx

这个格式是grub格式,或者grub一代

root (hd0,msdos0)

linux /boot/vmlinuz-3.10xxx

这是grub2的写法

rhel6以前都采用grub一代,到rhel7则采用grub2模块化引导管理器

grub和grub2的异同还请参考官方文档或自行百度!

继续阅读