由 westmin 于 星期五, 08/12/2011 - 19:22 发表
用 unetbootin 制作启动盘(U盘或移动硬盘),我没有遇到过不能启动的,除非不能U盘启动的老爷机。
可是时下挺流行 fbinst 制作启动盘,初步研究了一下,原因估计有二:
1. fbinst 聪明的将前64个扇区都写入引导信息,解决了传递参数不同而引起部分bios不能启动U盘的问题,因此几乎绝杀所有机子。
2. fbinst 会生成一个隐藏分区,可以把所有引导启动文件和镜像文件都放进去,该分区隐藏得很深,windows 和 linux 下都不能识别出该分区,只能识别出外面的空白分区,只有自己的UI工具才能查看,从而将U盘变成一个“永远不会中毒”的启动盘,该特性深受大众欢迎。
问题出来了,当我们把 puppylinux(及其衍生版本)的四个文件都放进 fbinst 生成的隐藏分区里,menu.lst 也写好,启动能找到 initrd.gz 和 vmlinuz,就是死活找不到 lupu_525.sfs 文件,这是怎么了?
我没有深入技术细节去找原因,不过想了很久,估计找到原因了。问题就恰恰出现在隐藏分区里。这个隐藏分区是 fbinst 生成的,windows 和 linux 系统都无法识别出来,只有 fbinst 能识别出来,而且用来引导启动的 grub4dos 引导文件 grldr 也是 fbinst 作者 bean 定做的,从而让 grldr 能识别该隐藏分区。我们用 find 命令就可以看到隐藏分区的识别符是 (ud),外面空白分区的识别符是 (hd0,0),而一般的 initrd.gz 是识别不出 (ud) 的,因此也就找不到放在 (ud) 里的 lupu_525.sfs 。
现在我们可以重现启动过程:
1. bios 找到U盘的启动信息,将启动权交给 grldr;
2. grldr 根据 menu.lst 列出启动选项(我们选 linux);
3. grldr 在隐藏分区 (ud) 里找到 initrd.gz 和 vmliuz,将启动权交给 initrd.gz;
4. initrd.gz 开始找 lupu_525.sfs,因为不能识别出 (ud),经过 searching deeper,在硬盘和U盘都找不到任何 lupu_525.sfs,退出到dos界面。
废话许多,就一句话,initrd.gz不能识别隐藏分区 (ud),折腾各种 kernel 参数都是神马!
解决方法:
很简单,就是把 lupu_525.sfs 放到U盘外面的空白分区里,也就是 windows 和 linux 都能识别的那个分区,可以放在任何文件夹里。 initrd.gz 和 vmliuz 可以放在隐藏分区里,也可以跟 lupu_525.sfs 放在一起。这样 initrd.gz 启动时就能找到 lupu_525.sfs 了。
以下是我写的 menu.lst(放在隐藏分区的):
title Puppy Linux
find --set-root --ignore-floppies /puppy/initrd.gz
kernel /puppy/vmlinuz pmedia=usbflash psubdir=puppy pfix=fsck
initrd /puppy/initrd.gz
title Puppy Linux (RAM Mode)
find --set-root --ignore-floppies /puppy/initrd.gz
kernel /puppy/vmlinuz pmedia=usbflash psubdir=puppy pfix=ram,fsck
initrd /puppy/initrd.gz
可是时下挺流行 fbinst 制作启动盘,初步研究了一下,原因估计有二:
1. fbinst 聪明的将前64个扇区都写入引导信息,解决了传递参数不同而引起部分bios不能启动U盘的问题,因此几乎绝杀所有机子。
2. fbinst 会生成一个隐藏分区,可以把所有引导启动文件和镜像文件都放进去,该分区隐藏得很深,windows 和 linux 下都不能识别出该分区,只能识别出外面的空白分区,只有自己的UI工具才能查看,从而将U盘变成一个“永远不会中毒”的启动盘,该特性深受大众欢迎。
问题出来了,当我们把 puppylinux(及其衍生版本)的四个文件都放进 fbinst 生成的隐藏分区里,menu.lst 也写好,启动能找到 initrd.gz 和 vmlinuz,就是死活找不到 lupu_525.sfs 文件,这是怎么了?
我没有深入技术细节去找原因,不过想了很久,估计找到原因了。问题就恰恰出现在隐藏分区里。这个隐藏分区是 fbinst 生成的,windows 和 linux 系统都无法识别出来,只有 fbinst 能识别出来,而且用来引导启动的 grub4dos 引导文件 grldr 也是 fbinst 作者 bean 定做的,从而让 grldr 能识别该隐藏分区。我们用 find 命令就可以看到隐藏分区的识别符是 (ud),外面空白分区的识别符是 (hd0,0),而一般的 initrd.gz 是识别不出 (ud) 的,因此也就找不到放在 (ud) 里的 lupu_525.sfs 。
现在我们可以重现启动过程:
1. bios 找到U盘的启动信息,将启动权交给 grldr;
2. grldr 根据 menu.lst 列出启动选项(我们选 linux);
3. grldr 在隐藏分区 (ud) 里找到 initrd.gz 和 vmliuz,将启动权交给 initrd.gz;
4. initrd.gz 开始找 lupu_525.sfs,因为不能识别出 (ud),经过 searching deeper,在硬盘和U盘都找不到任何 lupu_525.sfs,退出到dos界面。
废话许多,就一句话,initrd.gz不能识别隐藏分区 (ud),折腾各种 kernel 参数都是神马!
解决方法:
很简单,就是把 lupu_525.sfs 放到U盘外面的空白分区里,也就是 windows 和 linux 都能识别的那个分区,可以放在任何文件夹里。 initrd.gz 和 vmliuz 可以放在隐藏分区里,也可以跟 lupu_525.sfs 放在一起。这样 initrd.gz 启动时就能找到 lupu_525.sfs 了。
以下是我写的 menu.lst(放在隐藏分区的):
title Puppy Linux
find --set-root --ignore-floppies /puppy/initrd.gz
kernel /puppy/vmlinuz pmedia=usbflash psubdir=puppy pfix=fsck
initrd /puppy/initrd.gz
title Puppy Linux (RAM Mode)
find --set-root --ignore-floppies /puppy/initrd.gz
kernel /puppy/vmlinuz pmedia=usbflash psubdir=puppy pfix=ram,fsck
initrd /puppy/initrd.gz
- 9295 次点击
求指点,谢谢
发表新评论