|
2#
楼主 |
发表于 2018-10-26 22:53:10
|
只看该作者
本帖最后由 jie_china 于 2018-10-26 22:55 编辑
http://forum.ubuntu.org.cn/viewtopic.php?t=324418
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
此处安装到硬盘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 次。 |
|