u盘启动不好使(u盘启动不行)

hao333 2226 5798

不同BIOS启动U盘(USB-HDD模式)时,对同一个U盘的容量参数——柱面、磁头和扇区号(简称CHS)——的识别是不同的(证明可以在不同的安装环境中做到这一点)机器上的Linux版本相同,然后插入U盘,使用hdparm /dev/sda命令发现CHS在不同的机器上是不同的,即使U盘可以用GRUB启动,使用几何( hd0)命令在GRUB中也可以看到),这样一台机器上分区格式化生成的分区表和FAT盘参数表就按照本机识别的硬盘CHS来表示。当切换到另一台机器时,由于一台机器识别的CHS不同,会出现混乱。幸运的是,分区表和FAT磁盘参数表也有一种用相对扇区号来表示的方法。这个表达式也记录在分区表和磁盘参数表中。这取决于软件使用什么样的数据来工作。如果你使用CHS,那么换到另一台机器上肯定无法正常工作。如果使用LBA访问磁盘,则不会受到影响。当然,前提是BIOS支持U盘使用LBA模式访问,即扩展INT13H。 XP格式化FAT16文件系统分区生成的MBR代码以及所有版本的DOS都依赖CHS来工作,所以在一台机器上按照通常的方法制作的启动U盘在另一台机器上启动可能会不成功。经过测试,移动硬盘在各个BIOS中的CHS是一致的,与IDE口直接连接的硬盘的CHS是一样的,所以移动硬盘的USB启动基本上不困难。

u盘启动不好使(u盘启动不行)

到目前为止我发现的确实受此问题影响从而影响启动的程序有:

1、Windows XP和SP1中文版磁盘管理器分区时写入的MBR

2、dos5、6、6.22、win95的fdisk写入的MBR

3.以dos5、6、6.22、win95格式编写的引导

4、包括windows95 98 98se在内的所有MS DOS的IO.SYS(都需要依靠CHS来识别FAT文件系统)

5. USBoot生成的MBR和引导(同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、对于Linux 2.4内核及以上版本,基本上Linux系统中的所有程序都不会使用CHS进行FAT文件系统。

8. grub chs 0.95 0.97(包括stage1、stage1.5和stage2引导代码)

因此,解决这个问题对应的思路是:

1、强制U盘以USB-CDROM、USB-FLOPPY或USB-ZIP模式启动,这样每个BIOS都有标准可循,不会“自言自语”。这也是目前U盘的量产工具。基本想法,但这让没有量产工具的SD卡+读卡器组合感到失望。目前的大容量U盘大多没有写保护开关或者读写速度不理想。有时仍然需要高速SD卡。 + 读卡器组合;

2、使用活动硬盘启动基本没有问题。

3. 使用不受错误CHS 参数影响的引导加载程序,例如GNU GRUB 或SYSLINUX 启动或其他组合。

下面介绍我尝试过使用GNU GRUB、GRUB CHS和GRUB for DOS :的方法

方法一:完全使用中文版grub的stage1、stage1.5、stage2开始。中文版grub的作者是Gandalf。

1.找到一台正常运行GNU GRUB0.95或0.97的机器(Redhat ELAS4 Update0-Update6、ELAS5 Update0-Update1)

2、将grub_for_dos-0.4.1.zip中chinese/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使用类型0xe来支持LBA启动。它的文件访问也可能使用这个标志,虽然它可能不会用于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. umount /mnt 并恢复/usr/share/grub 的内容

这是令人遗憾的,因为没有启用--force-lba选项,所以下一步就是使用这个设备来启动,在grub命令行中:

1. root(hd0,0),其中指定舞台图像文件的来源。

2. 设置--force-lba (hd0) 进行安装。至此,中文版grub已经完全安装在MBR中了。

这个方法是我最初采用的方法,但是现在中文版的grub已经停止更新了,所以我不推荐这个方法。

方法2:使用GNU GRUB启动并加载dos grub

1.找到最新的稳定版本的Linux,例如Redhat ELAS5 Update1,直接用--force-lba选项将其GNU GRUB安装到U盘MBR中(请参考方法1,注意不要覆盖那些文件,并且不要忘记将分区类型设置为0xe)。

2、将grub_for_dos-0.4.2.zip中的chinese/grub.exe复制到U盘根目录。

3. 使用GNU GRUB 启动后,使用kernel /grub.exe 和boot 命令启动grub.exe。这样就可以享受grub for dos的中文菜单以及直接支持ntldr和io.sys启动的功能。

这种方法的好处是你可以随时使用最新最稳定的GNU GRUB来处理有bug的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,直接用--force-lba选项将其GNU GRUB安装到U盘MBR中(请参考方法1,注意不要覆盖那些文件,并且不要忘记将分区类型设置为0xe)。

2、使用grub_for_dos-0.4.1.zip中chinese/boot/grub中的stage2文件替换U盘中的/boot/grub/stage2

这种方法的优点和第二种方法一样,启动速度更快。缺点是这毕竟不是常见的做法,而且GNU GRUB版本更新后也不一定可行,不过好像GNU GRUB也已经停止更新:-)。在目前的情况下,我个人推荐这个方法。

其他尝试:使用syslinux启动dos0.41、0.42的grub和0.43的grub.exe也测试成功,但启动和运行速度和方法二一样很慢。

实际应用测试:

现在我自己的工具盘(150速Transcend 2G SD卡+Kawau 150X SDHC读卡器,题外话:这个读卡器除了支持150速之外真的很垃圾)就是用方法三制作的,在实际环境中依然有效。未发现启动失败的情况。其中包括HP DL380G3、G4、DL580、Dell 3850、6850、IBM X345、346、3650等,当然还有我的台式机和笔记本电脑。

这里补充说明一下:这篇文章只是对影响U盘USB-HDD启动的重要因素之一进行探讨。这个镜像只是对目前比较流行的做法的改进,增加了U盘在不同机器上启动成功的可能性。并不能说这解决了U盘USB-HDD启动的所有问题。本来作为一个研究岗位,我只是想提供方法,并不是具体的成品,但考虑到各种因素,我决定发布出来供大家测试。

由于ghost在恢复时会自动将分区类型更改为06,所以我使用winhex生成了1:1的U盘镜像用于研究。解压后文件名为U-1gboot.img。为了压缩这个启动盘的大小,它只有一个假的启动菜单。只要启动时出现这个菜单就说明成功了。

以上就是U盘启动失败的原因分析以及制作U盘启动盘失败的原因及解决方法。想要重装系统的朋友一定要有一个好的制作工具。希望小编分享的文章能够对您有所帮助!