Linux下定制安装Grub2内核实战

启动讨论 grub/grub2/syslinux/grub4dos/Lilo
头像
瑟瑟秋风
帖子: 34
注册时间: 2008-12-10 13:47
来自: http://hi.baidu.com/wzfjolin
送出感谢: 0
接收感谢: 1 次
联系:

Linux下定制安装Grub2内核实战

#1

帖子 瑟瑟秋风 » 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盘上无此问题!!!
上次由 瑟瑟秋风 在 2011-04-19 20:28,总共编辑 8 次。
这些用户感谢了作者 瑟瑟秋风 于这个帖子:
giveup (2014-11-18 9:32)
评价: 3.7%
头像
qy117121
论坛版主
帖子: 49912
注册时间: 2007-12-14 13:40
系统: Winbuntu
来自: 志虚国乌由市
送出感谢: 17 次
接收感谢: 335 次
联系:

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

#2

帖子 qy117121 » 2011-04-07 9:00

:em01
渠月 · QY    https://vz.rs/u
本人只会灌水,不负责回答问题

无聊可以点一下→ http://u.nu/ubuntu
头像
瑟瑟秋风
帖子: 34
注册时间: 2008-12-10 13:47
来自: http://hi.baidu.com/wzfjolin
送出感谢: 0
接收感谢: 1 次
联系:

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

#3

帖子 瑟瑟秋风 » 2011-04-07 9:43

好贴啊,为什么没人支持下?
头像
黄美姬
论坛版主
帖子: 8428
注册时间: 2009-10-08 11:15
来自: 大城市铁岭
送出感谢: 0
接收感谢: 1 次

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

#4

帖子 黄美姬 » 2011-04-07 9:53

我们是命运的妓女,它把我们都嫖了

N卡驱动:http://www.nvidia.cn/Download/index.aspx?lang=cn
极品飞车:http://www.geforce.cn/optimize/optimal- ... ts-450-ops
孤岛危机优化设置:http://www.geforce.cn/optimize/optimal- ... tx-450-ops
:cp /etc/skel/.bashrc ~/
PS1="\[\e]2;\u@\H \w\a\e[32;1m\]\T$\[\e[0m\] "
http://cdimage.ubuntu.com/
http://releases.ubuntu.com/
头像
remeber
论坛版主
帖子: 13005
注册时间: 2009-01-06 15:18
来自: 人间
送出感谢: 1 次
接收感谢: 22 次

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

#5

帖子 remeber » 2011-04-07 10:05

美鸡搞什么。。。。。 :em20

lz表担心好贴无人问津。 :em11
“有一种被人抛诸脑后的过去,包含一些不该遗忘的点点滴滴。欢笑之余,我将故旧拾起,才刹见自己的薄情。人世间似乎存在着某种公平,每个人都曾被抛掷在他人的遗忘中;而今你所有哽咽难宣的话语,也正是你曾为人所期盼,却永远听不见的字句。” —赫曼 赫塞
头像
smallapple
论坛版主
帖子: 7867
注册时间: 2009-03-28 15:12
送出感谢: 0
接收感谢: 19 次

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

#6

帖子 smallapple » 2011-04-07 10:15

对LZ先表示支持
不过此贴不是好贴,
在linux下把grub2安装到mbr,不用那么麻烦,在grub2-setup 时指定 -d 和 device 就行,
要在windows分区下安装grub2或做 g2ldr 用来在windows下引导进 grub2才有必要用grub2-mkimage,这个很早以前有人发过了
头像
瑟瑟秋风
帖子: 34
注册时间: 2008-12-10 13:47
来自: http://hi.baidu.com/wzfjolin
送出感谢: 0
接收感谢: 1 次
联系:

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

#7

帖子 瑟瑟秋风 » 2011-04-07 10:24

:em06 好吧,只怪好久没来这逛了,不止-d device,还有-prefix变量值,定制内核也可以修改它
头像
smallapple
论坛版主
帖子: 7867
注册时间: 2009-03-28 15:12
送出感谢: 0
接收感谢: 19 次

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

#8

帖子 smallapple » 2011-04-07 10:27

哦对 :em01
-p 也是要的,如果都使用默认的,可以都不加

还有grub2-mkimage应该在grub2-setup后执行比较好,理论上执行grub2-setup会生成默认的core.img,这样前面定制的core.img会被取代
上次由 smallapple 在 2011-04-07 10:30,总共编辑 1 次。
头像
cameron
帖子: 358
注册时间: 2007-08-10 15:06
送出感谢: 0
接收感谢: 1 次

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

#9

帖子 cameron » 2011-04-07 10:30

mark :em11
头像
瑟瑟秋风
帖子: 34
注册时间: 2008-12-10 13:47
来自: http://hi.baidu.com/wzfjolin
送出感谢: 0
接收感谢: 1 次
联系:

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

#10

帖子 瑟瑟秋风 » 2011-04-07 10:33

smallapple 写了:哦对 :em01
-p 也是要的,如果都使用默认的,可以都不加

还有grub2-mkimage应该在grub2-setup后执行比较好,理论上执行grub2-setup会生成默认的core.img,这样前面定制的core.img会被取代
那还叫定制内核么?定制就是要自己添加一些模块嘛....
头像
瑟瑟秋风
帖子: 34
注册时间: 2008-12-10 13:47
来自: http://hi.baidu.com/wzfjolin
送出感谢: 0
接收感谢: 1 次
联系:

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

#11

帖子 瑟瑟秋风 » 2011-04-07 10:38

smallapple 写了:哦对 :em01
-p 也是要的,如果都使用默认的,可以都不加

还有grub2-mkimage应该在grub2-setup后执行比较好,理论上执行grub2-setup会生成默认的core.img,这样前面定制的core.img会被取代
对了,grub2下面要启动pe,还有img映像,命令要怎么写,我知道你厉害,说下嘛,懒得搜索了
头像
smallapple
论坛版主
帖子: 7867
注册时间: 2009-03-28 15:12
送出感谢: 0
接收感谢: 19 次

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

#12

帖子 smallapple » 2011-04-07 10:38

我前面说了,如果在linux分区下安装grub2没必要定制内核,默认的core.img 会自动加载相关模块,所你前面那部分是多余的
如果在windows分区下安装grub2(比如U盘)才有必要定制内核,不然可能不认识windows分区不能加载模块,定制安装grub2内核到U盘MBR这部分就得表示支持
头像
smallapple
论坛版主
帖子: 7867
注册时间: 2009-03-28 15:12
送出感谢: 0
接收感谢: 19 次

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

#13

帖子 smallapple » 2011-04-07 10:47

厉害是不敢当,只是用的时间比较长,可能多了解些 :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
头像
瑟瑟秋风
帖子: 34
注册时间: 2008-12-10 13:47
来自: http://hi.baidu.com/wzfjolin
送出感谢: 0
接收感谢: 1 次
联系:

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

#14

帖子 瑟瑟秋风 » 2011-04-07 10:52

不定制内核怎么实现修改prefix变量,例如我的模块文件不在/boot/grub目录,而在/boot/grub2里面,以避免和grub Legacy的文件混在一起。
头像
瑟瑟秋风
帖子: 34
注册时间: 2008-12-10 13:47
来自: http://hi.baidu.com/wzfjolin
送出感谢: 0
接收感谢: 1 次
联系:

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

#15

帖子 瑟瑟秋风 » 2011-04-07 10:58

太好了,那我pe不是镜像怎么弄?有个SETUPLDR.BIN文件,那个WINPE.IS_文件本身是可引导的ISO文件么?
回复

回到 “启动和引导”