grub2的启动方式和最近更新(2008-08-23)

启动讨论 grub/grub2/syslinux/grub4dos/Lilo
bean
帖子: 238
注册时间: 2008-06-03 12:25

grub2的启动方式和最近更新(2008-08-23)

#1

帖子 bean » 2008-08-02 16:36

启动方式
下载grub2可以到以下网址:
http://grub4dos.sourceforge.net/grub2/
http://nufans.net/grub4dos/grub2/

这是光盘启动版,可以用不同方式来启动。

1、从光盘启动
只要刻录iso文件就可以了

2、从XP/Vista的启动管理器里启动
你需要把g2ldr.mbr,g2ldr以及/boot/grub目录拷贝到任何一个FAT/NTFS/EXT2根目录下,然后在boot.ini里增加相应的启动项就可以了,例如:

C:\g2ldr.mbr="Start GRUB2"

在vista里启动时,可以直接把g2ldr作为启动文件,这样就省去了中间步骤g2ldr.mbr,成功率也会增加。有趣的是,vista里尽管使用BCD,但其实也会读取boot.ini的内容。因此你可以在C:\下建立一个boot.ini文件:

[boot loader]
timeout=30
[operating systems]
C:\g2ldr="Start GRUB2 (vista)"

该项目会自动加到vista的启动菜单里,你就不需要使用bcdedit来增加启动项了。

3、从mbr里启动 (传统方式)

你需要把/boot/grub目录拷贝到任何一个grub2支持的文件系统的根目录下,进入/boot/grub目录,利用里面的grub-mkimage.exe 生成定制的core.img (关于grub-mkimage更详细的用法请参照后面)。

grub-mkimage -d . -o core.img biosdisk pc ntfs

mbr的空间有限,因此不要加过多的模块。一般来说,只需要biosdisk,pc和/boot/grub目录所在的文件系统的模块就行了。

然后,你还要配置device.map文件,在光盘根目录下有一个例子:
(hd0) //./PHYSICALDRIVE0

device.map指定的是grub2启动后的设备和当前系统设备的对应关系。//./PHYSICALDRIVE0是第一只硬盘。第二只硬盘就是//./PHYSICALDRIVE1,如此类推。

比如说,你想把grub2安装到u盘的mbr里。假设你只有一个固定硬盘,u盘就是第二只硬盘//./PHYSICALDRIVE1。在启动时,u盘会作为(hd0)。于是,device.map就应该这样写:
(hd0) //./PHYSICALDRIVE1

又例如,你想把grub2安装到硬盘映像aa.dsk的mbr里,然后用qemu来测试。这时,device.map就应该是:
(hd0) aa.dsk

还有就是,如果你对于硬盘和哪个设备对应不是很清楚的话,可以用grub-fstest来测试一下:

grub-fstest //./PHYSICALDRIVE1 ls -l

这会列出//./PHYSICALDRIVE1里的所有分区信息,你可以和硬盘的内容对照一下,以防止出错。

最后一步就是真正安装了,使用以下的命令:

grub-setup -d . -m device.map -r (hd0,1) -v (hd0)

device.map就是以上建立的映射文件,(hd0,1)是/boot/grub所在的分区。grub2的分区从1算起的,主分区1-4,扩展分区从5开始(其实就是grub4dos里的分区号+1)。如果不清楚地话,也可以用grub-fstest测试一下,它会显示分区号的。

以上步骤可能有点麻烦。不过,如果安装到mbr的话,还是推荐使用传统方式。它会把grub2的文件系统模块直接嵌入到mbr里,其兼容性比grubinst里的汇编代码要强。

要注意的是,某些版本的vista使用了bitlocker,这时你不能修改mbr的内容,否则就无法启动vista了。

4、从mbr里启动 (grubinst方式)

你需要把g2ldr和/boot/grub目录拷贝到任何一个FAT/NTFS/EXT2根目录下,然后使用grubinst来安装mbr启动代码,例如:

grubinst -2 (hd0)

如果使用图形界面grubinst_gui的话,只需要选择"grub第二版"选项就可以了。

5、从PXE启动

你需要把g2pxe和/boot/grub目录拷贝到tftp服务器上,然后以g2pxe作为启动文件就可以了。

6、从EFI启动

如果你有相应的硬件,如MacBook,那也可以从EFI启动。把/EFI/boot目录拷贝到FAT/EXT2/HFS+分区里,rEFIt就可以自动找到grub并显示启动项。关于在MacBook里启动的详细信息可以参考以下文章:

http://grub.enbug.org/TestingOnMacbook

定制grub2

1、定制内核

grub2的内核可以定制的,启动光盘里包含了配置grub2内核的工具grub-mkimage.exe。要注意的是,该版本使用cygwin来编译的,它运行时需要cygwin1.dll。如果没有安装cygwin的话,把光盘根目录里的cygwin1.dll文件拷贝到PATH能找到的目录就可以了。

使用时, 进入/boot/grub目录,然后运行以下命令:

grub-mkimage -d . -o core.img biosdisk pc gpt iso9660 fat ntfs ext2 pxe

然后生成不同的启动文件:

copy /B lnxboot.img + core.img g2ldr
copy /B pxeboot.img + core.img g2pxe
copy /B cdboot.img + core.img grub2cd.bin

要制作启动光盘时,使用以下命令:

mkisofs -R -J -no-emul-boot -boot-info-table -boot-load-size 4 -b grub2cd.bin -o grub2.iso cdroot/

你可以根据需要,自行增加或者减少模块,以上模块的作用是:

biosdisk: 使用INT 13来访问硬盘。你可以使用ata,它不需要通过INT 13,直接访问硬件。不过它的兼容性不是很好。

pc, gpt: 处理不同分区方式的模块。其它的还有apple, amiga, sun等。

iso9660 fat ntfs ext2:文件系统模块。grub2还可以把某些文档文件作为文件系统来访问,比如说cpio模块可以处理cpio和tar文件。

pxe:pxe虚拟文件系统模块,用于pxe启动。

core.img里只需要包含可以访问/boot/grub目录的模块就够了,其他的会在运行时自动加载。

EFI版本使用的是另外一个grub-mkimage.exe,它在/EFI/grub目录下,利用它可以生成efi映像文件grub.efi:

grub-mkimage -d . -o grub.efi pc gpt iso9660 fat ntfs ext2 hfsplus

2、设置缺省目录

grub-mkimage 还可以设置缺省目录。比如说,你想把文件放到/grub2而不是/boot/grub里,可以使用以下的命令:

grub-mkimage -d . -o core.img -p /grub2 biosdisk pc gpt iso9660 fat ntfs ext2 pxe

3、文件打包

grub2里还有一个高级的功能,你可以把所有需要的模块,文件等放到一个文件系统映像里,然后加到core.img里。比如说,你可以把command.lst,fs.lst,grub.cfg, normal.mod和其他需要的mod文件打包到一个cpio文档里,然后用以下的命令生成core.img:

grub-mkimage -d . -o core.img -p (memdisk)/ -m cpio_image memdisk cpio

启动后,文档里的内容可以用(memdisk)来访问。

grub2更新记录

grub2每次都有很多更新的,我下面只列出最核心的新增功能,其他改动请参考Changelog文件。

2008-08-23

1、增加 Mingw 支持

新版本的光盘使用mingw编译,生成的exe可以直接运行,不在需要cygwin的dll了。不过,设备名有些改变。cygwin里第一个硬盘是/dev/sda,而mingw使用windows自身的特殊设备名,也就是//./PHYSICALDRIVE0。

2、完善 raid 支持

新版本支持Linux soft raid 0,1,4,5,6,10,raid 5/6 支持4种layout和错误恢复(raid5最多可以有一只硬盘丢失或者损坏,raid6最多可以有两只)。raid 10支持near, far和offset 三种layout. 除了soft raid外,它还支持Nvidia Fake Raid.

3、增加新命令date

date可用于显示和修改当前时间,另外还有一个相关的模块datehook:

insmod datehook

这样,会注册时间变量YEAR, MONTH, DAY等,你可以用于输出,或者用脚本语言进行比较。时间变量是及时更新的,每次读出都是日期/时间的当前值。

4、修改pxe命令的用法。

pxe控制命令参数变为--info, --blksize 和 --unload,也修正了pxe的一些bug。

2008-08-03

1、支持大的memdisk映像
新版本可以支持~576K的core.img(其实就是所有的常规内存),考虑lzma压缩的话,原始大小大约可以达到~1152K。你可以把很多的东西包进内核里。

2、支持multiboot重定位
以前multiboot loader没有重定位,因此当multiboot映像和grub2系统的地址有重叠时,就不能装载了。新版本解决了这个问题,现在你可以在grub2里运行grub invader了(一个使用multiboot启动的简单控制台游戏)。

3、新的光盘里包含了grub-setup.exe,你可以使用传统方式把grub2安装到mbr。

2008-08-02

1、增加PXE支持
新版可以用于pxe启动,启动方式清参考前面。

pxe启动后,可以使用pxe命令控制pxe的参数:

pxe info
显示当前pxe的信息

pxe blksize size
设置tftp传输块的大小,最小值是512,最大值是1432

pxe unload
卸掉pxe的运行环境

2、增加命令crc

该命令可以计算某个文件的crc32值,在测试文件系统问题时比较实用。例如:

crc (hd0,1)/ntldr

3、增加文件系统缓冲模块bufio

grub2里磁盘读取是有缓冲的,不过文件系统没有,这导致某些操作的效率比较低。新版本增加以文件为基础的缓冲,大大加快了背景图片和字体文件的读取速度。

2008-07-25
1,cygwin支持

最新的svn代码可以不经修改地在cygwin下编译。bootcd的版本就是使用cygwin编译,并且把一些重要的工具也加上了,比如说grub-mkimage.exe。

2,64-bit EFI支持

新版本grub2支持x86_64的EFI,比较新的Macbook都是使用64位EFI。不过,编译64位EFI只能在linux下,我没有把二进制版本加到bootcd里。

bootcd里包含32位EFI映像,它也是使用cygwin编译的,使用时把它们复制到相应的目录就行了。

3, 保存环境变量

新版本grub2支持保存环境变量的值。首先,你需要创建一个grubenv文件并放到grub目录里,例如/boot/grub。bootcd里就有一个grubenv,你也可以使用grub-editenv来创建。

grub-editenv grubenv create

grub-editenv还有其他的功能,比如说;

a. 显示grubenv里存储的变量:

grub-editenv grubenv ls

b. 设置grubenv里变量的值

grub-editenv grubenv set default=1

然后,在grub的配置文件grub.cfg里,使用以下的命令就可以装载grubenv里的变量了:

load_env

需要保存变量值时,使用save_env,例如:

save_env default

这就把default的值保存到grubenv里,下次启动时用load_env就会读取新的值了。

4. LZMA压缩

新的core.img使用lzma进行压缩,其效果比原来lzo要好得多。

5. ext4支持

新版本grub2支持ext4文件系统。

6. uuid支持

新版本grub2支持uuid。使用ls -l可以查看文件系统的uuid。search命令也可以按照uuid来进行搜索。
上次由 bean 在 2008-08-24 0:10,总共编辑 6 次。
billbear
帖子: 3681
注册时间: 2008-05-03 23:42

#2

帖子 billbear » 2008-08-02 21:31

有趣的是,vista里尽管使用BCD,但其实也会读取boot.ini的内容。因此你可以在C:\下建立一个boot.ini文件:

[boot loader]
timeout=30
[operating systems]
C:\g2ldr="Start GRUB2 (vista)"

该项目会自动加到vista的启动菜单里,你就不需要使用bcdedit来增加启动项了。
又学到一招:)
头像
ptptptptptpt
帖子: 3711
注册时间: 2006-09-19 18:16

#3

帖子 ptptptptptpt » 2008-08-02 21:58

学了很多招。。。
头像
ptptptptptpt
帖子: 3711
注册时间: 2006-09-19 18:16

#4

帖子 ptptptptptpt » 2008-08-02 22:30

对了,bean 可以建议 wubi 开发人员下个版本采用 g2ldr 。现在的wubi,在中文xp中运行,然后自动设置启动,menu.lst 中 tittle 都用中文写的,可 wubi 里面的 GRUB4DOS 不支持中文,所以显示出来就是乱码。而grub2 支持多国语言

wubi用到了 finds --set-root ,不知 grub2 有没有类似的命令??
bean
帖子: 238
注册时间: 2008-06-03 12:25

#5

帖子 bean » 2008-08-02 22:39

ptptptptptpt 写了:对了,bean 可以建议 wubi 开发人员下个版本采用 g2ldr 。现在的wubi,在中文xp中运行,然后自动设置启动,menu.lst 中 tittle 都用中文写的,可 wubi 里面的 GRUB4DOS 不支持中文,所以显示出来就是乱码。而grub2 支持多国语言

wubi用到了 finds --set-root ,不知 grub2 有没有类似的命令??
有, grub2里对应的命令是search,比如说,要找到/ntldr所在的分区并把它设为根设备,可以使用:

search -s -f /ntldr

grub2里的search命令的功能比grub4dos里强,它还可以按照分区label或者uuid来查找。
头像
ptptptptptpt
帖子: 3711
注册时间: 2006-09-19 18:16

#6

帖子 ptptptptptpt » 2008-08-03 0:14

很强大

再把 map 命令作成个 mod ,就能代替 grub4dos 了
头像
ptptptptptpt
帖子: 3711
注册时间: 2006-09-19 18:16

#7

帖子 ptptptptptpt » 2008-08-03 0:18

billbear 写了:
有趣的是,vista里尽管使用BCD,但其实也会读取boot.ini的内容。因此你可以在C:\下建立一个boot.ini文件:

[boot loader]
timeout=30
[operating systems]
C:\g2ldr="Start GRUB2 (vista)"

该项目会自动加到vista的启动菜单里,你就不需要使用bcdedit来增加启动项了。
又学到一招:)
想来是要兼容 xp ,试想,c盘已经装了 vista ,这时把xp装到d盘,xp的安装程序不能调用BCD,只会在c盘写入 boot.ini ntldr ntdetect.com bootfont.bin ,如果vista 不能读取 boot.ini ,xp将不能启动
ninyun
帖子: 186
注册时间: 2008-04-13 9:47

#8

帖子 ninyun » 2008-08-03 5:11

谢谢LZ对Grub2的继续开发新的实用的功能。再想请教楼主,如原Vista是用软激活,好像是根目录中有个grldr文件,如再用你的办法从Vista启动,对原激活文件是否有冲突或影响??
bean
帖子: 238
注册时间: 2008-06-03 12:25

#9

帖子 bean » 2008-08-03 12:04

ninyun 写了:谢谢LZ对Grub2的继续开发新的实用的功能。再想请教楼主,如原Vista是用软激活,好像是根目录中有个grldr文件,如再用你的办法从Vista启动,对原激活文件是否有冲突或影响??
你说的软激活,应该就是用grldr来引导bootmgr的破解方法吧。这个对grub2没有影响的,因为它使用的是另外一个启动文件。当然,你不能用安装到mbr的方法,这会覆盖原来的mbr,grldr就启动不了。这方法的启动流程是:

mbr -> grldr -> bootmgr -> g2ldr
bean
帖子: 238
注册时间: 2008-06-03 12:25

#10

帖子 bean » 2008-08-03 16:02

新版2008-08-03把grub-setup.exe包进光盘,你可以用传统方式把grub2安装到mbr。
klose911
帖子: 106
注册时间: 2008-02-01 17:18

#11

帖子 klose911 » 2008-08-05 3:12

好文章,希望lz加油阿,grub2能快点完成,期待正式版
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#12

帖子 eexpress » 2008-08-05 9:10

其实不期待大改动,现在的,只要增加一个可指定iso,能从iso启动的功能。
搞复杂了,万一bug,会导致全球机器崩溃的。
● 鸣学
shy_sunhongyi
帖子: 128
注册时间: 2007-11-29 10:40

#13

帖子 shy_sunhongyi » 2008-08-05 9:26

不知道为什么,我安装的是XP和UBUNTU的双系统。每天冷启动到GRUB的时候都会出现错误,然后CTRL+ALT+DEL就可以正常运行了。谁知道这个是怎么回事?
bean
帖子: 238
注册时间: 2008-06-03 12:25

#14

帖子 bean » 2008-08-05 11:47

shy_sunhongyi 写了:不知道为什么,我安装的是XP和UBUNTU的双系统。每天冷启动到GRUB的时候都会出现错误,然后CTRL+ALT+DEL就可以正常运行了。谁知道这个是怎么回事?
你是用grub2的吗?
头像
ptptptptptpt
帖子: 3711
注册时间: 2006-09-19 18:16

#15

帖子 ptptptptptpt » 2008-08-05 18:23

eexpress 写了: 搞复杂了,万一bug,会导致全球机器崩溃的。
不必担心,人民会不断完善它的 :lol:
回复