无忧启动论坛

标题: kernel 自动参数的问题 怎么实现 [打印本页]

作者: 2011dbzln    时间: 2011-9-12 10:03
标题: kernel 自动参数的问题 怎么实现
title Ubuntu
      find --set-root --ignore-floppies /vmlinuz
      kernel /vmlinuz root=/dev/sda10 ro  
      nitrd /initrd.img

这是grub4dos菜单里的一项,执行find后会返回(hdx,y),例如我的电脑返回(hd0,9),接着执行kernel ,关键是后面的参数 root=/dev/sda10 ro.(其中10是上面9+1的结果,应为ubuntu分区是从1开始编号的)
我有个问题:如果我在别的机器,find 返回值是(hdx,y),怎么让kernel的参数自动的变为y+1。

以前我是多么希望grub4dos能支持变量啊,以为可以解决这个问题,但最新的0.4.5加了变量后,又不知怎么用,求大虾帮忙。。。。

[ 本帖最后由 2011dbzln 于 2011-9-12 18:38 编辑 ]
作者: chenall    时间: 2011-9-12 11:38
set /a n=*0x829c>>16&0xff+1
      kernel /vmlinuz root=/dev/sda%n% ro  
      nitrd /initrd.img

不多说自己找资料.
作者: 2011dbzln    时间: 2011-9-12 18:36
标题: 回复 #2 chenall 的帖子
首先,感谢下大神,问题解决了。接下来给大家解释一下其原理,共和我有同样疑问的人参考参考:

在固定位置访问一些内部变量:(在grub4dos帮助文档 by sratlf 0314 中)
      地址                   长度                                  说明
========= ============== ==============================================
0000:8208       4字节(即双字)   启动分区号 install_partition (the boot partition)
0000:8280       4字节(即双字)   启动驱动器号(boot_drive)
0000:8284       4字节(即双字)   pxe 客户端 ip (即本地ip)
0000:8288       4字节(即双字)   pxe 服务器 ip
0000:828C       4字节(即双字)   pxe 网关 ip
0000:8290       8字节(即四字)   最后访问的文件的大小(是执行"cat --length=0"后的文件大小)
0000:8298       4字节(即双字)   可用的扩展内存大小(以 KB 为单位)
0000:829C       4字节(即双字)   当前根分区号(current root partition)
0000:82A0       4字节(即双字)   当前根所在的驱动器(current root drive)
0000:82A4       4字节(即双字)   解压标志 (gzip非自动解压),非0时不自动解压
0000:82A8       8字节(即四字)   最后访问的分区的起始扇区号
0000:82B0       8字节(即四字)   最后访问的分区的扇区总数
0000:8278       4字节(即双字)   GRUB4DOS编译的日期十进制数.

上面的只要看这一行就可以了 0000:829C       4字节(即双字)   当前根分区号(current root partition)
在内存位置存放着当前根分区信息,共四字节,磁盘号在低字节,分区号在高字节,所以要移位。所以完整解决方案如下:

title Ubuntu
      find --set-root --ignore-floppies /vmlinuz             #设定根分区
      set /a n=*0x829c>>16&0xff+1                       #获取根分区的分区号
      kernel /vmlinuz root=/dev/sda%n% ro
      nitrd /initrd.img

注: /vmlinuz  是/boot/vmlinuz-2.6.32-21-generic 的链接,类似于windows的快捷方式 这样写是有好处的,因为当你更新内核后,也不用改menu.lst.
       /vmlinuz 在一些linux发行版可能有不同的名字,所以上面的也不是万能的。

    再次感谢大神,并欢迎大家指正和补充。
                                                                                    db
作者: 不点    时间: 2011-9-12 18:55
> 在内存位置存放着当前根分区信息,共四字节,磁盘号在低字节,分区号在高字节

你这可不正确呢!分区号也不是在 “最” 高字节,而是在 “次” 高字节。

真正的磁盘号在这里:

0000:82A0       4字节(即双字)   当前根所在的驱动器(current root drive)
作者: 2011dbzln    时间: 2011-9-12 20:15
标题: 回复 #4 不点 的帖子
谢谢,又学习了!      

上面有处笔误 initrd单词错了。
内核参数再加俩  quiet splash,还有使用时最好去掉注释。

重发下代码,这下就完美了:

title Ubuntu
      find --set-root --ignore-floppies /vmlinuz        
      set /a n=*0x829c>>16&0xff+1                       
      kernel /vmlinuz root=/dev/sda%n% ro quiet splash
      initrd /initrd.img




欢迎光临 无忧启动论坛 (http://wuyou.net./) Powered by Discuz! X3.3