U盘启动不成功,u盘启动盘启动失败
当不同的BIOS启动USB-HDD模式时,同一个u盘的容量参数——柱面、磁头和扇区数(简称CHS)会有不同的标识(为了证明这一点,可以在不同的机器上安装相同版本的linux,然后插入u盘,使用hdparm /dev/sda命令可以发现不同机器上的CHS是不同的。即使u盘可以用GRUB启动,也可以用GRUB)中的geometry (hd0)命令看到,这样一台机器上分区格式化生成的分区表和FAT盘参数表都是按照这台机器识别的硬盘的CHS来表示的。当切换到另一台机器时,会因为另一台机器识别的CHS不同而产生混淆。好在分区表和FAT磁盘参数表也有按照相对扇区数表示的方式,分区表和磁盘参数表中也有记录。这取决于软件使用什么样的数据来工作。如果使用CHS,那么另一台机器就无法正常工作,而如果使用LBA访问磁盘,则不会受到影响——当然前提是BIOS支持LBA访问u盘,也就是扩展INT13H。而XP和DOS版本FAT16文件系统分区格式化生成的MBR代码都需要CHS来工作,所以按照通常的方法在一台机器上做的启动u盘在另一台机器上可能无法启动。经过测试,移动硬盘在各个BIOS中的CHS是一致的,与直接连接IDE口的硬盘的CHS是一样的,所以移动硬盘的USB启动基本没有困难。
目前我发现的确实受这一问题的影响,从而影响启动的程序有:
1.在Windows XP和SP1中对中文版磁盘管理器进行分区时写入的MBR
2.dos5、6、6.22和win95的fdisk写的MBR
3.用dos5,6,6.22和win95格式写的boot
4.IO。包括windows95 98 98se在内的所有MS DOS的SYS(都需要依靠CHS来识别FAT文件系统)
5.由USBoot生成的MBR和boot(同1)
6.使用bootlace.com在grub for dos 0.41中安装grldr.mbr到mbr
可能不受这一问题影响的程序有(未经充分测试):
1.win98和98se的fdisk写的MBR
2.以win98和98se格式编写的引导(FAT16分区类型必须是0xe以支持LBA)
3.ntldr和PE或XP环境启动的比较晚(当然,不然u盘用不了)
4.linux下install-mbr程序写的MBR
5.用grub-install命令安装的GNU GRUB 0.95和0.97及其引导代码
6.syslinux3.36和3.51
7.linux2.4内核以上,基本上linux系统的所有程序都不会对FAT文件系统使用CHS。
8.grub chs 0.95 0.97(包括阶段1、阶段1.5和阶段2引导代码)
所以解决此问题思路相应就有:
1.强制u盘由USB-CDROM、USB-FLOPPY或USB-ZIP启动,让每个BIOS都有一个标准可循,不会“自说自话”。这也是目前使用u盘量产工具的基本思路,但这让没有量产工具的SD卡读卡器组合很失望。但目前的大容量u盘大多没有写保护开关或者读写速度不理想,有时还需要高速SD卡读卡器的配合;
2.从活动硬盘入手基本没问题。
3.使用不受错误CHS参数影响的引导加载程序,比如GNU GRUB或SYSLINUX boot,或者其他组合。
下面介绍我尝试过的使用GNU GRUB、GRUB CHS和GRUB for DOS的方法:
方法一:完全用中国版grub,stage1,stage1.5,stage2,中国版grub是甘道夫写的。
1.找一个正常运行GNU GRUB0.95或者0.97的机器(红帽elas4更新0-更新6,elas5更新0-更新1)
2.将grub_for_dos-0.4.1.zip中的中文/boot/grub中的stage1、1.5、2文件覆盖到linux中的/usr/share/grub中(这里不同版本可能有不同的grub stage镜像所在的路径,大多数情况下是/usr/share/grub)。注意做好原始文件的备份。
3.插入要引导的u盘或移动硬盘,并对其进行分区。因为有些BIOS只支持USB-HDD的CHS模式,所以引导分区不能超过1023*16*63扇区。所以为了通用性,引导分区不要超过511M,类型为0xe。(在Win98se中读取DOS 7.1的引导代码后发现,DOS 7.1在LBA模式下使用0xe引导,其文件访问也可能使用该标志。虽然可能不用于grub,但是如果多引导中包含DOS 7.1的话还是很有用的),设置引导标志,格式化为fat16文件系统。这一切都是在linux下完成的。(12月29日更正)
4.将引导分区装入/mnt
5.grub-install-root-directory=/mnt/dev/sdx。注意不要选- force-lba。因为现在linux下的Grub不匹配stageX,所以机器不会启动。
6.忽略文件/mnt/boot/grub/device.map,这个文件是grub-install程序使用的,安装后没有用。
7.卸载/mnt并恢复/usr/share/grub的内容
这样,可以说有遗憾,因为- force-lba选项没有启用,所以下一步是使用这个设备启动,在grub命令行:
1.root(hd0,0),其中指定了舞台图像文件的源。
2.setup - force-lba (hd0 HD0)并安装。至此,中国版grub已经完全安装在MBR中。
这个方法本来是我采用的,但是现在grub中文版已经停止更新了,所以不推荐这个方法。
方法2:使用GNU GRUB启动并加载用于dos的GRUB。
1.找到linux最新的稳定版本,比如Redhat ELAS5 Update1,直接将其GNU GRUB plus - force-lba选项安装到u盘MBR中(参考方法1,注意不要覆盖那些文件,不要忘记将分区类型设置为0xe)。
2.将中文/grub.exe从grub_for_dos-0.4.2.zip复制到u盘根目录。
3.用GNU GRUB引导后,用kernel /grub.exe和boot命令引导grub.exe,这样就可以享受grub for dos的中文菜单和直接支持ntldr和io.sys启动的功能了。
好在这种方法总能使用最新最稳定的GNU GRUB来处理buggy BIOS,同时还能享受到中文版grub for dos的便利。这种方式在我的机器上启动速度相当慢,无论是PE还是DOS,连菜单显示速度都慢得惊人,而且不仅是启动过程,成功启动后其他程序的运行也是如此。我觉得是中国版的grub for dos。grub for dos的中文版0.41、0.42、0.43都试过,但都不理想。
方法三:使用GNU GRUB的stage1、stage1.5和中文版grub 0.97的stage2启动。
1.找到linux最新的稳定版本,比如Redhat ELAS5 Update1,直接将其GNU GRUB plus - force-lba选项安装到u盘MBR中(参考方法1,注意不要覆盖那些文件,不要忘记将分区类型设置为0xe)。
2.将u盘中的/boot/grub/stage2替换为grub _ for _ dos-0.4.1.zip中的中文/boot/grub中的stage2文件。
这种方法与第二种方法具有相同的优点,并且启动速度更快。缺点是毕竟不是惯例,GNU GRUB版本更新后可能不太可行,不过好像GNU GRUB已经停止更新了:-)。在目前的情况下,我个人推荐这个方法。
其他尝试:grub.exe使用syslinux引导grub for dos0.41、0.42、0.43也有成功尝试,但是启动和运行速度和第二种方法一样慢。
实际应用测试:
现在我自己的工具托盘(150速原装2G SD卡川渝150X SDHC读卡器,题外话:这个读卡器除了支持150速之外真的很垃圾)是用方法3做的,实际环境下不存在无法启动的现象。包括惠普DL380G3、G4、DL580、戴尔3850、6850、IBM X345、346、3650等。当然还有我的台式机和笔记本电脑。
这里补充说明一下:本帖只是对影响USB-HDD启动的一些重要因素的探究。这个镜像只是对流行做法的一个改进,它提高了在不同机器上成功启动USB-HDD的可能性。不能说USB-HDD启动的所有问题都解决了。本来作为一个研究岗,只想提供方法不想提供具体成品。但是考虑到各种因素,我还是放出来给大家测试一下吧。
因为ghost在还原时会自动将分区类型改为06,所以我用winhex生成了1: 1的u盘镜像以供研究。解压后文件名为u-1gboot.img,为了压缩卷,这个启动盘只有一个假的启动菜单,只要启动时出现这个菜单就成功了。
以上是u盘启动失败的原因分析,为大家总结了u盘启动盘失败的原因和解决方法。想重装系统的朋友一定要有一个好的制作工具。希望边肖分享的文章能帮到你!