grub 是一个遗留的引导程序,linux发行版由 gnu完成实现

windows 上也有实现,好像是一个中国人在sf上实现的

下面就是使用 grub 作为引导程序制作usb启动盘

 

1. 用 livecd 启动系统,常见的livecd,例如:ZeroShell

    如果有 linux 环境那么就直接启动 linux

 

2. # /sbin/mount 看看挂接了哪些

 

3. 插入新买的u盘,/sbin/cfdisk /dev/sdb,注意看分区表的内容,

    如果是当前硬盘,不要进行后面的操作,会把硬盘的资料弄丢,

    如果看不明白,别往下进行

 

4. 新建分区,而后创建 type 为 0B 的分区,不明白就 man cfdisk,一定要用  OB,否则 dos 认不出来

 

5. # /sbin/mkfs /dev/sdb

 

7. # /sbin/mount -t vfat /dev/sdb1 /mnt

    # cd /mnt

    # mkdir -p 1/2/3

    # touch 1/2/3/f

 

    # cp /boot/grub /mnt/ -R

 

 

8. # sudo /sbin/grub

     grub>  root (hd1,0)  # 如果不确定就 find (hd1,0)/1/2/3/f  是否存在

     grub>  setup(hd1)    # 将 grub 安装到 mbr 中,如果使用 setup(hd1,0) 就会把 grub 安装到 第一个分区的第一个扇区中

 

9.  去我的共享里,能够找到  memdisk 和 dos.img,把这两个文件拷贝到  /mnt 里面

 

10.  # /sbin/umount /dev/sdb1

       # init 0

 

12. 进入 bios,设置为可从 u盘启动

 

13. 而后就由 u盘引导了

 

14. kernel (hd0,0)/memdisk # 刚才拷贝进来的

       initrd (hd0,0)/dos.img

       boot

 

 

ok dos 启动了,笔记本用上方法时可能会出现问题,我在 thinkpad r60e 测试过,会 boot 后会启动不了,

sl400 没有问题,对于 r60e 的同学,可以参考如下:

 

在拷贝 dos.img 和 memdisk 时,把 grub4dos 中的 grub.exe 拷贝到  u盘中,而后 修改 14

 

14. kernel (hd0,0)/grub.exe

       boot

       # 使用 grub4dos 进行引导

       map --mem (hd0,0)/bootdisk.img (fd0)  # 把 u盘虚拟成软盘
       map --floppies=1
       map --hook # 确认

       rootnoverify (fd0)
       chainloader +1
       boot   # 这回不会被卡住了

 

 

总结:  grub 已经是一个遗留项目了,i.e. 没有人再维护了,不过已有的功能已经够用,

              如果弄不清楚,可以在虚拟机上测试,弄懂后再拿物理硬件去试

 

              关于 grub4dos,作者的文档已经写的很清楚了, grub4dos 的功能好像要比 grub 强一些

              两者提供的基本命令都差不多

 

 

ps1:

linux 中的 hda hdb 与 物理接入顺序有关 ide 0:0 的就是 hda,ide 0:1 的就是 hdb,SATA 0就是 sda

grub  中的 hd0 hd1 与 bios中启动顺序有关,第一个启动的硬盘就是 hd0,第二个启动的硬盘就是hd1
不区分是否是 ide 0:1、ide 0:0 和 SATA

 

dos中c: d: e: .. 的顺序也是按照启动顺序来的,不过可能d不是一个硬盘,而是一个分区

 

 

 

ps2:

 

(hd0,0) 与 (hd0)  有什么区别

 

说明这个区别首先要知道 mbr 是什么

 

硬盘的0磁道的第一个扇区称为MBR,它的大小是512字节,而这个区域可以分为两个部分。

第一部分为pre-boot区(预启动区),占446字节;第二部分是 Partition table区(分区表),

占66个字节,该区相当于一个小程序,作用是判断哪个分区被标记为活动分区,然后去读取

那个分区的启动区,并运行该区中的代码。

 

mbr清楚后, (hd0) 就是指  mbr, (hd0,0) 是指  第 0 分区的第一个扇区

 

所以 setup (hd0)   就是把  grub 装在 mbr 中

         setup (hd0, 0) 就是把 grub 装在 第 0 个分区的第一个扇区中

 

(hd0)  与  (hd0, 0) 是有区别的,bios 默认加载后,会试图从 mbr 中加入引导程序,但不会

从 (hd0,0) 读入引导程序,所以 os 一般都争用 mbr,例如:安装完 windows 后,linux 就

不能再启动了,这就是因为 windows  把 grub/lilo 写到 mbr 中的东西覆盖掉了。使用启动盘,

u启动盘或光盘或livecd,启动后,

grub>  root (hd0,0)

grub>  setup(hd0)

就 ok 了,如果启动原来的windows,使用 u启动盘、光盘或livecd,启动后

grub> rootnoverify (hd0, 3)   # 我的 windows 安装在这里,其他同学可能不一样

                                                  # rootnoverify(hd0,3) 相当于 path=(hd0,3),而 root 相当于 cd (hd0,3)

                                                  # 可以按照 path 和 cd 的方式理解,但实际上不是这么回事

grub> chainloader +1 # 从第一个扇区开始读,

grub> boot # 启动windows了

每次都插入启动盘麻烦,就可以把以上的内容放到 grub.conf 中,再起一个 title

这部分的内容已经有很多人讨论过

 

大部分的情况 :

rootnoverify (hd0, 3)

chainload+1

可以被题换成

chainlaoder (hd0,3)+1,

但是有些情况不能这样做,所以还是老老实实的,先rootnoverify,再 chainloader +1吧

 

 

 

 

ps3:

例如 map (hd0,3) (hd0)

         map (hd0) (hd0,3)

         map --hook

 

相当于

begin transaction

     int tmp =x;

     x = y;  # map (hd0, 3) (hd0)

     y = x;  # map (hd0) (hd0, 3)

commit;  # map --hook    可以这样理解,但实际不是这么回事

 

据被人说:map 会在内存中为这个虚拟磁盘构造一个分区表,

也就是说按照物理分区表组成逻辑分区表,map修改逻辑分区表,

grub 从逻辑分区表中读入内容引导系统