|
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 |
|