分页: 1 / 2

Linux下定制安装Grub2内核实战

发表于 : 2011-04-07 8:53
瑟瑟秋风
Linux下定制安装Grub2内核实战

玩grub2也有一段时间了,曾经对grub2的实现很不理解,不过经过把grub2的官方英文文档重点部分详细研究一番之后,总算收获不小,现在分享给大家!
grub2功能确实很强大,还可以用BURG实现非常炫的启动项选择画面,挺好玩的,个人感觉比G4D好,但也有不足,例如启动PE似乎有点困难,你如果有方法,分享一下嘛!
注意:1)确定你已经理解本文,再进行操作2)本文已在openSUSE系统及U盘上实战过,均成功安装,其他linux版本可能会有些不同,在虚拟机ubuntu上看了下,似乎有点不同;3)本文不免有错误的地方,抛砖引玉而已!

定制安装grub2内核到硬盘MBR

环境:openSUSE系统,/dev/sda3挂载在根目录,/boot在单独的分区上,/dev/sda1挂载到/boot目录,如果你没有单独分区,需做相应修改;
实现目标:把grub2安装到/dev/sda的MBR上,grub2的所有文件放到/dev/sda1的/bootin/grub2目录中,步骤如下:

1.首先创建/boot/bootin/grub2目录,并把/usr/lib/grub2/i386-pc/下的所有文件拷贝到此目录中;注意,此目录中原先并没有grub.cfg和core.img文件,即这两个文件都是在系统安装grub2到硬盘的时候才生成的。
2.定制内核
使用的命令为:grub2-mkimage,首先看下其帮助文档,了解此命令的用法;
# grub2-mkimage --help
Usage: grub2-mkimage [OPTION]... [MODULES]
Make a bootable image of GRUB.
-d, --directory=DIR use images and modules under DIR [default=/usr/lib/grub2/i386-pc]
#指定定制内核所需模块等文件所在目录;
-p, --prefix=DIR set grub_prefix directory [default=/boot/grub2]
#指定prefix变量值,将来grub2启动后会在此目录寻找模块等文件;
-m, --memdisk=FILE embed FILE as a memdisk image
-f, --font=FILE embed FILE as a boot font
-c, --config=FILE embed FILE as boot config
-o, --output=FILE output a generated image to FILE [default=stdout]
#指定所定制的内核输出到哪个文件,例如/boot/grub2/core.img;
-h, --help display this message and exit
-V, --version print version information and exit
-v, --verbose print verbose messages
此处定制内核具体使用的命令如下:

代码: 全选

 grub2-mkimage -p /bootin/grub2 -o /boot/bootin/grub2/core.img biosdisk part_msdos ntfs fat ext2
注释:1)-d使用默认值/usr/lib/grub2/i386-pc;2)-p指定prefix变量为/bootin/grub2;3)-o即输出定制的内核到/boot/bootin/grub2/core.img文件中;4)biosdisk part_msdos ntfs fat ext2,内核所包含的模块,不需要太多;
3.创建device.map文件
创建文件/boot/bootin/grub2/device.map,此文件内容的含义具体在下文解释,若是要安装到硬盘MBR,device.map文件内容如下:

代码: 全选

(hd0) /dev/sda
4.安装到MBR
所用命令为grub2-setup,首先看下其帮助文档,了解此命令的用法;
grub2-setup --help
Usage: grub2-setup [OPTION]... DEVICE
Set up images to boot from DEVICE.
#安装grub到硬盘MBR或分区PBR;
DEVICE must be a GRUB device (e.g. `(hd0,1)').
-b, --boot-image=FILE use FILE as the boot image [default=boot.img]
-c, --core-image=FILE use FILE as the core image [default=core.img]
-d, --directory=DIR use GRUB files in the directory DIR [default=/boot/grub2]
#此目录即安装grub2时所需的boot.img和core.img等文件所在目录;
-m, --device-map=FILE use FILE as the device map [default=/boot/grub2/device.map]
#指定device.map文件所在目录;
-r, --root-device=DEV use DEV as the root device [default=guessed]
#此设备即将来启动grub2时所需的模块等文件所在的分区,即通常情况下/boot/grub2目录所在的分区;(个人理解,应该没错)
-f, --force install even if problems are detected
-s, --skip-fs-probe do not probe for filesystems in DEVICE
-h, --help display this message and exit
-V, --version print version information and exit
-v, --verbose print verbose messages[/color]
此处安装到硬盘MBR具体使用的命令如下:

代码: 全选

grub2-setup -d /boot/bootin/grub2 -m /boot/bootin/grub2/device.map -r \(hd0,1\) -v \(hd0\)
注释:1)-d即安装grub2时所需的boot.img和core.img等文件所在目录为/boot/bootin/grub2;2)-m即指定device.map文件所在目录为/boot/bootin/grub2/device.map;3)末尾的-r (hd0,1)即将来启动grub时所需文件在本地硬盘第一个分区;后面(hd0)即安装grub到本地硬盘MBR;4)在shell中,小括号”(“和”)”有特殊意义,因而命令末尾的(hd0,1)使用了反斜杠来转义;
解释下device.map文件的意义:首先,其实上述命令中的(hd0)并不意味着grub会安装到“本地硬盘”的MBR中,(hd0,1)也并不意味着grub所需文件在“本地硬盘”第一个分区上;因为在实际写入到设备时,(hd0)会经过device.map文件的映射;只有当device.map文件内容为(hd0) /dev/sda时,上面的说法才成立;而当device.map文件内容为(hd0) /dev/sdb时,比如你插入一个U盘,这时,(hd0)被映射为/dev/sdb,即你的U盘;上述命令将会写入grub到你U盘的MBR上,而将来启动时也会在你U盘上的第一个分区中查找/boot/grub下的模块等文件;这也意味着,如果你要安装grub到U盘,只要将device.map文件内容改为(hd0) /dev/sdb就可以了! 上述命令会有以下输出:

代码: 全选

grub2-setup: info: the size of hd0 is 312581808.
      … … … …
      grub2-setup: info: the size of hd0 is 312581808.
      grub2-setup: info: getting the size of /boot/bootin/grub2/boot.img.
      grub2-setup: info: reading /boot/bootin/grub2/boot.img.
      grub2-setup: info: getting the size of /boot/bootin/grub2/boot.img.
      grub2-setup: info: getting the size of /boot/bootin/grub2/core.img.
      grub2-setup: info: reading /boot/bootin/grub2/core.img.
      grub2-setup: info: getting the size of /boot/bootin/grub2/core.img.
      grub2-setup: info: the size of hd0 is 312581808.
      grub2-setup: info: the size of hd0 is 312581808.
      grub2-setup: info: setting the root device to `hd0,1'.
      grub2-setup: info: dos partition is 0, bsd partition is -1.
      grub2-setup: info: the core image will be embedded at sector 0x1.
这表示写入成功!
5.创建grub.cfg文件
在/boot/bootin/grub2/目录中创建grub.cfg文件,并拷贝原先系统/boot/目录下的vmlinuz及initrd文件到/boot/bootin/目录下,并在grub.cfg文件中创建对应的启动菜单,就可以重启了,All Over!

定制安装grub2内核到U盘MBR

环境:openSUSE系统,U盘在linux下为/dev/sdb;并挂载到/mnt/usb/目录;
实现目标:把grub2安装到U盘的MBR上,grub2的所有文件放到U盘的/bootin/grub2目录中,步骤跟安装到硬盘很相似,区别只有一步,具体如下:

1.挂载U盘到/mnt/usb/目录,在U盘创建/bootin/grub2目录,并把/usr/lib/grub2/i386-pc/下的所有文件拷贝到此目录中;
2.定制内核
具体使用的命令如下:

代码: 全选

 grub2-mkimage -p /bootin/grub2 -o /mnt/usb/bootin/grub2/core.img biosdisk part_msdos ntfs fat ext2
注释:1)-d使用默认值/usr/lib/grub2/i386-pc;2)-p指定prefix变量为/bootin/grub2;3)-o即输出定制的内核到/mnt/usb/bootin/grub2/core.img文件中;4)biosdisk part_msdos ntfs fat ext2,内核所包含的模块;
3.创建device.map文件
这是唯一区别的地方!创建文件/mnt/usb/bootin/grub2/device.map,文件内容如下:

代码: 全选

(hd0) /dev/sdb    
#/dev/sdb需据实际情况修改;
4.安装到MBR
具体使用的命令如下:

代码: 全选

 grub2-setup -d /mnt/usb/bootin/grub2 -m /mnt/usb/bootin/grub2/device.map -r \(hd0,1\) -v \(hd0\)
注释:1)-d即安装grub2时所需的boot.img和core.img等文件所在目录为/mnt/usb/bootin/grub2;2)-m即指定device.map文件所在目录为/mnt/usb/bootin/grub2/device.map;3)-r (hd0,1)即将来启动grub时所需文件在U盘第一个分区;后面(hd0)即安装grub到U盘MBR;
在执行这步时,会发现U盘的指示灯闪呀闪,验证了grub正在安装到U盘上;
5.创建grub.cfg文件
在U盘/bootin/grub2/目录中创建grub.cfg文件,并在grub.cfg文件中创建对应的启动菜单,就可以重启了,All Over!!

注意:在安装到硬盘上时,定制的内核文件需要包含blocklist.mod,否则有时会出现不能启动的问题!!U盘上无此问题!!!

Re: Linux下定制安装Grub2内核实战

发表于 : 2011-04-07 9:00
qy117121
:em01

Re: Linux下定制安装Grub2内核实战

发表于 : 2011-04-07 9:43
瑟瑟秋风
好贴啊,为什么没人支持下?

Re: Linux下定制安装Grub2内核实战

发表于 : 2011-04-07 9:53
黄美姬

Re: Linux下定制安装Grub2内核实战

发表于 : 2011-04-07 10:05
remeber
美鸡搞什么。。。。。 :em20

lz表担心好贴无人问津。 :em11

Re: Linux下定制安装Grub2内核实战

发表于 : 2011-04-07 10:15
smallapple
对LZ先表示支持
不过此贴不是好贴,
在linux下把grub2安装到mbr,不用那么麻烦,在grub2-setup 时指定 -d 和 device 就行,
要在windows分区下安装grub2或做 g2ldr 用来在windows下引导进 grub2才有必要用grub2-mkimage,这个很早以前有人发过了

Re: Linux下定制安装Grub2内核实战

发表于 : 2011-04-07 10:24
瑟瑟秋风
:em06 好吧,只怪好久没来这逛了,不止-d device,还有-prefix变量值,定制内核也可以修改它

Re: Linux下定制安装Grub2内核实战

发表于 : 2011-04-07 10:27
smallapple
哦对 :em01
-p 也是要的,如果都使用默认的,可以都不加

还有grub2-mkimage应该在grub2-setup后执行比较好,理论上执行grub2-setup会生成默认的core.img,这样前面定制的core.img会被取代

Re: Linux下定制安装Grub2内核实战

发表于 : 2011-04-07 10:30
cameron
mark :em11

Re: Linux下定制安装Grub2内核实战

发表于 : 2011-04-07 10:33
瑟瑟秋风
smallapple 写了:哦对 :em01
-p 也是要的,如果都使用默认的,可以都不加

还有grub2-mkimage应该在grub2-setup后执行比较好,理论上执行grub2-setup会生成默认的core.img,这样前面定制的core.img会被取代
那还叫定制内核么?定制就是要自己添加一些模块嘛....

Re: Linux下定制安装Grub2内核实战

发表于 : 2011-04-07 10:38
瑟瑟秋风
smallapple 写了:哦对 :em01
-p 也是要的,如果都使用默认的,可以都不加

还有grub2-mkimage应该在grub2-setup后执行比较好,理论上执行grub2-setup会生成默认的core.img,这样前面定制的core.img会被取代
对了,grub2下面要启动pe,还有img映像,命令要怎么写,我知道你厉害,说下嘛,懒得搜索了

Re: Linux下定制安装Grub2内核实战

发表于 : 2011-04-07 10:38
smallapple
我前面说了,如果在linux分区下安装grub2没必要定制内核,默认的core.img 会自动加载相关模块,所你前面那部分是多余的
如果在windows分区下安装grub2(比如U盘)才有必要定制内核,不然可能不认识windows分区不能加载模块,定制安装grub2内核到U盘MBR这部分就得表示支持

Re: Linux下定制安装Grub2内核实战

发表于 : 2011-04-07 10:47
smallapple
厉害是不敢当,只是用的时间比较长,可能多了解些 :em01

启动PE的iso镜像文件 可以试试

代码: 全选

loopback loop0 (hdx,y)/aa.iso
set root=(loop0)
chainloader +1
启动img镜像需要memdisk文件,菜单是这样写

代码: 全选

set root=(hdx,y)
linux16 /memdisk
initrd16 /abc.img

Re: Linux下定制安装Grub2内核实战

发表于 : 2011-04-07 10:52
瑟瑟秋风
不定制内核怎么实现修改prefix变量,例如我的模块文件不在/boot/grub目录,而在/boot/grub2里面,以避免和grub Legacy的文件混在一起。

Re: Linux下定制安装Grub2内核实战

发表于 : 2011-04-07 10:58
瑟瑟秋风
太好了,那我pe不是镜像怎么弄?有个SETUPLDR.BIN文件,那个WINPE.IS_文件本身是可引导的ISO文件么?