用户工具

站点工具


howto:g:grub2

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
howto:g:grub2 [2010/02/21 00:32]
snnn 找到zfs的代码了
howto:g:grub2 [2010/05/18 17:59] (当前版本)
snnn 一些小修改。增加了对内核参数的说明。
行 1: 行 1:
 +====== GRUB2 ======
 +GRUB是opensolaris和linux的默认引导程序,非常流行。
 +GRUB2是它的第二版,与之前有较大改动,尚未作为稳定版本发布。
  
 +以下内容适用于1.97.2,​也许也适合于更新的版本。目前我最新测试过的版本是1.98。
 +
 +====== 获取源代码 ======
 +grub2最新的发布版本的源代码可从[[ftp://​alpha.gnu.org/​gnu/​grub/​]]获得。
 +<code bash>​wget ftp://​alpha.gnu.org/​gnu/​grub/​grub-1.97.2.tar.gz</​code>​
 +
 +grub2的版本管理工具已经从svn迁移到bzr,​你可以通过bzr获得最新的正在开发中的代码:
 +<code bash>bzr branch http://​bzr.savannah.gnu.org/​r/​grub/​trunk/​grub/​ </​code>​
 +
 +迄今为止,任何一个发行包中都不包括zfs的支持,如果你需要这个,那么必须采用bzr获取最新的trunk代码,然后进入代码的顶层目录下执行:
 +<code bash>​mkdir -p grubcontrib
 +bzr branch http://​bzr.savannah.gnu.org/​r/​grub-extras/​zfs grubcontrib/​zfs
 +export GRUB_CONTRIB=grubcontrib
 +</​code>​
 +上面的代码用于创建一个新的叫做grubcontrib的目录,然后把zfs的代码放在这个目录下。
 +
 +====== 编译 ======
 +===== 如果你是从wget中取的正规的发行版 =====
 +编译grub2之前需要gcc(必须) bison(必须) gmake(必须) freetype2(可选)
 +如果东西都准备够了,按照gnu常见的步骤编译即可
 +<code bash>
 +tar -zxvf grub-1.97.2.tar.gz
 +cd grub-1.97.2
 +./configure
 +gmake
 +</​code>​
 +
 +===== 如果你是从bzr中取的代码 =====
 +除了上面所说的外,还准备需要autotoolset那一整套东西。
 +首先要执行<​code bash>sh autogen.sh</​code>​
 +生成configure脚本,然后其他的同上
 +  ​
 +
 +====== 安装 ======
 +使用root帐户,在源代码顶层目录下执行
 +gmake install
 +
 +====== 修改grub2的配置 ======
 +/​boot/​grub下,menu.lst已经不存在了,取而代之的是grub.cfg。但是不建议手工编辑这个文件,因为它是由/​usr/​local/​etc/​grub.d/​下面的sh脚本生成的。
 +请先阅读/​usr/​local/​etc/​grub.d/​README
 +最简单的方式是自己手动添加一个启动项,把下面的东西加到40_custom的末尾
 +
 +[[feature:​f:​ffs|]]的例子:
 +<​code>​
 +menuentry "​FreeBSD2"​ {
 +        insmod ufs2
 +        set root=(hd0,​1) #/​boot在哪?
 +        kfreebsd ​                       /​boot/​kernel/​kernel
 +        kfreebsd_loadenv ​               /​boot/​device.hints
 +        set kFreeBSD.vfs.root.mountfrom=ufs:/​dev/​ada0
 +        set kFreeBSD.vfs.root.mountfrom.options=rw
 +}</​code>​
 +
 +
 +[[feature:​z:​zfs|zfs]]的例子:
 +<​code>​
 +menuentry "​FreeBSD"​ {
 +          insmod zfs
 +          search -s -l rpool
 +          kfreebsd /​freebsd@/​boot/​kernel/​kernel
 +          kfreebsd_module_elf /​freebsd@/​boot/​kernel/​opensolaris.ko
 +          kfreebsd_module_elf /​freebsd@/​boot/​kernel/​zfs.ko
 +          kfreebsd_module /​freebsd@/​boot/​zfs/​zpool.cache type=/​boot/​zfs/​zpool.cache
 +          set kFreeBSD.vfs.root.mountfrom=zfs:​rpool/​freebsd
 +          set kFreeBSD.vfs.root.mountfrom.options=rw
 +}
 +</​code>​
 +
 +====== 更新硬盘的引导程序 ======
 +
 +警告!!下面的操作将会改写你的MBR分区,所以建议你先备份现有的mbr
 +<code bash>
 +dd if=/​dev/​ada0 of=/​tmp/​mbr.bak count=1
 +</​code>​
 +(以上命令不要照抄,路径请自行修改。dd是一个非常危险的工具,按回车前请仔细确认)
 +然后,使用grub-install安装grub。以下操作会读写mbr以及mbr之后的几个扇区。
 +<code bash>/​usr/​local/​sbin/​grub-install /dev/ada0 </​code>​
 +如果一切顺利,恭喜你,​可以重启了
 +
 +====== 其它 ======
 +
 +
 +====== 清理/boot ======
 +grub2= boot0 + boot1 + boot2 + loader + ....
 +在grub2的帮助下,你仅仅需要一个普通的文件系统来存放/​boot/​kernel目录下的东西即可。你不需要像ufs时代那样只能从主分区启动,也不需要把boot1/​boot2嵌在文件系统的隐藏区块中。而grub2支持非常多的文件系统,并能在ls的时候自动检测、自动加载相应模块。
 +/​boot下除了kernel目录和device.hints,其它都可以清理掉了。
 +
 +====== 内核参数 ======
 +打开loader/​i386/​bsd.c,找到这一行,<​code>​static const struct grub_arg_option freebsd_opts[] </​code>,​看它定义了哪些参数,然后和[[http://​www.freebsd.org/​cgi/​man.cgi?​query=boot&​sektion=8|boot(8)]]比较。基本上[[http://​www.freebsd.org/​cgi/​man.cgi?​query=boot&​sektion=8|boot(8)]]能支持的,grub2都支持。但是如果你的kernel是最新的head代码有可能会新添新的参数。
 +
 +例如,如果要进入安全模式,那么在加载kernel的那行的最末尾加上-s,如
 +<​code>​kfreebsd /​freebsd@/​boot/​kernel/​kernel -s</​code>​
 +
 +====== patches ======
 +/​usr/​local/​lib/​grub/​grub-mkconfig_lib的make_system_path_relative_to_its_root 函数有2处兼容性问题:
 +  - freebsd的readlink 没有-f参数
 +  - freebsd的stat不接受-c参数
 +我的做法是把那些都注释掉。然后直接让dir=“/​”。
/data/vhosts/wiki-data/pages/howto/g/grub2.txt · 最后更改: 2010/05/18 17:59 由 snnn