无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 3583|回复: 4
打印 上一主题 下一主题

[已解决] kernel 自动参数的问题 怎么实现

[复制链接]
跳转到指定楼层
1#
发表于 2011-9-12 10:03:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 编辑 ]
2#
发表于 2011-9-12 11:38:51 | 只看该作者
set /a n=*0x829c>>16&0xff+1
      kernel /vmlinuz root=/dev/sda%n% ro  
      nitrd /initrd.img

不多说自己找资料.
回复

使用道具 举报

3#
 楼主| 发表于 2011-9-12 18:36:27 | 只看该作者

回复 #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
回复

使用道具 举报

4#
发表于 2011-9-12 18:55:05 | 只看该作者
> 在内存位置存放着当前根分区信息,共四字节,磁盘号在低字节,分区号在高字节

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

真正的磁盘号在这里:

0000:82A0       4字节(即双字)   当前根所在的驱动器(current root drive)
回复

使用道具 举报

5#
 楼主| 发表于 2011-9-12 20:15:36 | 只看该作者

回复 #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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-12-2 23:27

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表