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