无忧启动论坛
标题:
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