制作可启动 USB 以从 Linux 安装 Windows XP

制作可启动 USB 以从 Linux 安装 Windows XP

我有一个戴尔 Inspiron Mini 9Ubuntu安装。我也想安装 Windows XP,但我没有外部 CD 驱动器,也无法获得外部 CD 驱动器,因此我需要从 USB 进行 Windows 安装。

我发现的所有教程都使用 Windows 来使 USB 可启动。我该如何在 Linux 上实现同样的效果?

答案1

您可以使用虚拟盒并让虚拟机访问硬盘驱动器。然后在虚拟机中安装 Windows XP 并在真实硬盘驱动器上创建一个新分区。安装完成后,您可以重新启动计算机并正常启动 Windows。

要让 VirtualBox 访问整个磁盘(将 更改x为适当的字母,例如a):

VBoxManage internalcommands createrawvmdk -filename ~/hdd.vmdk -rawdisk /dev/sdx

然后选择现有的硬盘驱动器,并选择hdd.vmdk主文件夹中的文件。

如果命令抱怨缺少权限,请使用disk以下命令将自己添加到组,然后登录并退出并重试。

sudo adduser `whoami` disk
  1. 如果你已经目标计算机上安装了 Linux您可以直接在该计算机上执行此操作,但在重新启动 Windows 之前,请运行sudo update-grubsudo grub-install /dev/sdx(将 更改x为适当的字母,例如a)以确保您仍然能够启动 Linux。为避免您的计算机和 VirtualBox 在 VM 中模拟的硬件之间出现问题(这可能导致蓝屏死机),您还可以在离开虚拟机之前在 Windows 中创建第二个硬件配置文件。当您使用GRUB,选择第二个硬件配置文件。您最终可以将这个新的硬件配置文件设为默认配置文件。

  2. 如果目标计算机完全干净,制作一个可启动的 Ubuntu USB 驱动器,并在其中放入您(合法购买的)Windows 安装 CD 的映像。然后在目标机器上启动 Ubuntu 并按照上述说明进行操作。

答案2

从这里下载 RUFUSLDR:https://dl.dropboxusercontent.com/u/20170669/RUFUSLDR 在此下载 ms-sys:http://prdownloads.sourceforge.net/ms-sys/ms-sys-2.3.0.tar.gz?download 将 ms-sys-2.3.0 文件夹拖到支持执行标志的地方(很可能是 Linux 主文件夹)。在那里 cd 一个终端,输入“make”,然后输入“sudo make install”。非常简单。

我理解您的感受。我尝试过有关如何在 Windows 中创建可引导至 WinXP 安装程序的 USB 驱动器的教程。diskpart 教程、WinToFlash 教程和 HP USB Format 实用程序教程都失败了。

Rufus 确实可以工作。但它是仅适用于 Windows 的实用程序。您可以安装 VirtualBox、在 VirtualBox 中安装 Windows、在 VM 中安装 Rufus、将 USB 驱动器共享给 VM,然后让 Rufus 使 USB 驱动器可启动到 Windows XP 安装程序。

Rufus 目前不支持使用松散安装文件制作可启动的 USB WinXP 安装程序。它必须看到 iso。因此,您让 VirtualBox 安装 iso 以将 XP 安装到 VM 中,但这会显示为松散文件(看不到 iso)。因此,要让 Rufus 看到 iso 文件本身,请将主机上存储 iso 的目录共享给 VM。然后将 Rufus 指向 iso 文件在 VM 的网络驱动器中的位置(Z:\ 或其他)。

顺便说一句,您也可以将 FreeDOS 软盘映像复制到驱动器,并从 iso 中复制文件,然后使用 memdisk 启动软盘映像。从 FreeDOS 运行 i386\ winnt.exe 。缺点是(除非您找到 DOS NTFS 驱动程序?)您只能将 Windows 安装到 FAT32 卷,而不能安装到 NTFS 卷。

由于是在虚拟机中,您可能会发现 Rufus 进程非常缓慢(不明白为什么,也许我设置的方式很愚蠢)。就我个人而言,在我的笔记本电脑上,它花费了一个小时 5 分钟 40 秒,我相信是这样的。我将告诉您如何在 Linux 中不使用 Rufus 来做到这一点。我们将模仿 Rufus,但首先,如果您决定从虚拟机中使用 Rufus,请注意,Rufus 完成后,Linux 将无法看到分区:

Rufus 不仅会格式化分区,还会重做 MBR(包括分区表)。因此,请先保存 U 盘上的所有数据。

笔记:Rufus 给出了一个技巧 MBR,当 BIOS 执行时,它会交换前两个 BIOS 驱动器(0x80 变为 0x81,反之亦然)。此外,它还会在这个技巧 MBR 中放置一个 BIOS ID,使驱动器从 0x81(第二个驱动器)开始。我告诉你这个的原因:这个技巧 MBR 会导致 Linux(和 Grub2 v2.00)无法读取分区表。Windows 可以正常使用(为其提供驱动器号等),驱动器将可启动。但 Linux 将看不到该分区,因此无法挂载它。没问题。将 MBR 保存到文件:

sudo dd if=/dev/sdX of=~/Desktop/rufus_trick_mbr count=1 bs=512

现在使用 fdisk 为其赋予新的 MBR。您甚至没有触碰分区本身,您只是为其赋予了新的 MBR。在按下“w”之前,fdisk 中实际上什么都没做。

sudo fdisk /dev/sdX

p //Print partition table. fdisk, unlike the kernel, CAN make sense of the partition table as-is.

You'll probably see the partition start on sector 2048 and go to the end.

o  //Tells fdisk to make a new partition table

n //create new partition. By defualt, fdisk should also make the partition start at sector 2048 and go to the end. Make sure the partition starts where it used to and ends where it used to.

select primary

t //change partition type id

7 //for ntfs

p //Make sure everything is right. And no, don't worry about the boot flag.

w //when you're sure. Remember, we saved the old mbr and can undo any mess-ups made here with dd.

我们还可以用 dd 制造新的混乱:

哈蒙德 — “别担心,我不会再犯同样的错误了。” 马尔科姆 — “不,不,你犯的都是新的错误。”

-侏罗纪公园 II、失落的世界

拔下并重新插入拇指驱动器。如果没有其他问题,/dev/sdXY 至少现在应该存在(之前只有 /dev/sdX 存在 - 没有“Y”)。要安装它,应该安装 ntfs-3g。如果已安装,请查看它是否已安装(如果已安装,应该显示在桌面上或文件浏览器的左侧窗格中)。如果没有,请自行安装。您可以先尝试使用文件浏览器安装它。以下是手动安装它的方法:

sudo mount -t ntfs-3g /dev/sdXY [mount point]

在 Linux 中用它做你想做的事。

如果你愿意,可以将 rufus_trick_mbr 放回去:

sudo dd if=~/Desktop/rufus_trick_mbr of=/dev/sdX bs=512 count=1 //No "Y"! Just /dev/sdX!

但您不必重新启用 MBR。您可以使用 Grub2 的 ntldr 命令来加载 /BOOTMGR。(可能需要先执行“insmod ntldr”来插入 ntldr 模块。)

事情的经过如下:

Rufus 使用一个分区表条目设置了 MBR 技巧,将该分区格式化为 NTFS,将内容放在只有 ntldr 样式的引导加载程序关心的该分区的引导扇区中,将文件从 iso 复制到分区,从 i386 文件夹复制 NTDETECT.COM 并将其放在根级别,从 i386 文件夹复制 txtsetup.sif,将其放在根级别,并添加一行,github,c0m/pbatard/rufus/wiki/Targets-Supported 没有提到,所以感谢“openssl md5”和 cmp 向我指出这一点。

击鼓:并将 SETUPLDR.BIN 从 i386 文件夹复制到根目录,将其重命名为 BOOTMGR,并修补该二进制文件。是的,这就是诀窍。SETUPLDR.BIN 在从 CD 启动时检测到它已从 CD 启动并在 i386 文件夹中查找内容。如果从硬盘启动,它会检测到它已从硬盘启动,而是查找 minint 文件夹,如果找到,则查找 $WIN_NT$~BT 文件夹以开始安装的第二阶段(重新启动后,当您启动到目标硬盘时)。因此,您甚至不能将“i386”重命名为“minint”。您必须修改 SETUPLDR.BIN 以查找 i386 文件夹,即使从硬盘(例如 USB 驱动器)启动也是如此。

我认为 Rufus 将修改后的二进制文件称为“BOOTMGR”是一种错误的说法。Vista 和 7(以及 8?)使用的是这个名称,而不是 XP。BOOTMGR 甚至不会像 NTLDR(SETUPLDR 是其修改版本)那样查找 boot.ini 文件。因此我将其重命名为“RUFUSLDR”并将其放在供下载。另外,您还希望能够将其与您可能正在使用的任何真实 BOOTMGR 区分开来。

如果应用 Windows 安装程序 iso,Rufus 会强制您将驱动器格式化为 NTFS。我认为这是因为 x64 Windows 8 开发人员预览版包含一个大于 4GB 的文件,而 FAT32 无法支持。但这不适用于此处。我们没有任何接近 4GB 的文件。您可以使用 FAT32 并且没问题。

让我们模仿 Linux(或者我猜是任何 unixoid)中的 Rufus:

  1. 确保驱动器是 MBR 方案。如果是 GPT,fdisk 将发出警告,并为您提供将其设为 MBR 方案的选项(选项“o”)。破坏性较小的是,如果您有 4 个或更少的分区,gdisk 将允许您将 GPT 方案的驱动器转换为 MBR 方案的驱动器。Gdisk 还允许您将驱动器设为混合 MBR/GPT 方案磁盘,其中您可以选择最多 3 个分区对 GPT 不敏感的内容可见(第 4 个插槽被用作保护分区,覆盖其余部分)。即使您只使用 fdisk,只要新的分区表条目仍然在相同位置开始和结束,您就不会丢失分区;只需确保在磁盘末尾将辅助 GPT 归零即可。

  2. 确保分区格式为 FAT32 或 NTFS。请记住,FAT32 更适合跨平台。如果它已经格式化为 FAT32 或 ntfs,则无需格式化:

    sudo blkid /dev/sdXY [这里会说文件系统,以及 UUID、标签等]

如果不是 FAT32 或 NTFS,请执行以下操作之一:

sudo mkdosfs -F 32 -n [insert volume label (name) here] /dev/sdXY

sudo mkntfs -L [insert volume label here] /dev/sdXY

3 应用 DOS/Windows 所特有的神奇引导扇区功能:

sudo ms-sys -w /dev/sdXY

*关于这一点 - “-w” 代表“写入” - 只是写入。而不是指定要写入的内容。因此,“-w” 是 ms-sys 的自动模式:它确定最适合当前情况的引导扇区数据。我很惊讶地发现自动模式是正确的:对于 FAT32 分区,我需要 ms-sys 的 FAT32操作系统引导扇区不是ms-sys 的 FAT32新界引导扇区,我认为我需要加载 _NT_LDR 的衍生物(NT 加载器)(SETUPLDR.BIN 是 NTLDR 的修改版本,RUFUSLDR 是 SETUPLDR.BIN 的修改版本)。

4 为了保险起见,将几何信息也写入分区。这不会改变磁盘的几何信息,它只会为那些懒得自己查找几何信息的人留下关于几何信息的注释:

sudo ms-sys -p /dev/sdXY

*注意:步骤 4 不适用于 NTFS。 *另一个注意事项:确保您的 Linux 内核版本大于 2.6。内核 2.6 有一个错误,会报告错误的磁头数量(几何问题)。因此,“-p”选项可能会在内核 2.6 中输入错误的信息。“-H”选项允许用户手动指定要记录的磁头数量,这是解决方法。但实际上,只需升级内核即可。如果您运行的是 2.6,那您早就该升级了。要知道您的内核版本,请执行以下操作:

uname -r

5 从 iso、文件夹等复制文件。许多发行版在双击 iso 时会挂载 iso,或者至少提供使用存档挂载程序打开的选项,方法是右键单击 > 打开方式。如果您不是这种情况,请执行以下操作:

sudo mount -o loop (path to iso) (path to desired mount point)

6 将修改后的 SETUPLDR.BIN (RUFUSLDR) 文件放在根级别。

7 将 NTDETECT.COM 从 i386 复制到根级别。

8 将 txtsetup.sif 从 i386 复制到根级别。

9 打开 txtsetup.sif 的新副本,然后按 Ctrl+F 键选择“[SetupData]”。在该标题下,输入以下行:

SetupSourceDevice = "\device\harddisk1\partition1"

10 要么安装一个能够将 NTLDR 样式的引导加载程序加载到驱动器,要么安装到用于引导此驱动器的另一个驱动器,或者使用现有的引导加载程序。如果您的硬盘驱动器上安装了 Grub2 来引导 Ubuntu,那么您可以在看到菜单后按“c”进入 Grub 命令行。如果您有 Syslinux,您也可以使用它。在本教程中,我将坚持使用 Grub2。

要将 Grub2 安装到磁盘(如果使用硬盘驱动器的现有引导加载程序,则可能不需要执行此操作):

sudo grub-install --boot-directory=[mount point of disk, not iso] [/dev/sdxy]

11a. 创建 grub.cfg 条目或手动执行以下操作:

grub> insmod ntldr //Inserts (loads) the Grub2 module used for loading NTLDR-style bootloaders.
grub> set root=(hdx,msdosy) //Replace x and y as appropriate. Sets the current directory to the target partition. Probably not needed if you booted off the drive you put the WinXP installer files on, but we always do this. Use "ls" to list all drives and partitions. If you only have one MBR-schemed disk with only one (or however many you made) partition(s), you'll be able to pick out which is your thumb drive. If not, try one and do "ls /". It will list the files on the root level of that partition. That should be a dead-giveaway. Notice that "ls" (without slash) lists drives and partitions, and "ls /" (with slash) lists the files on the root level of the partition that is the current working directory.
grub> ntldr /RUFUSLDR //Tells it to load RUFUSLDR.
grub> boot //That's the "go button".

11b. 作为 grub.cfg 条目,它看起来像这样(不要排列括号,这是 Grub,不是大学!!):

menuentry "Windows XP Installer" {
  insmod ntldr
  search --no-floppy --fs-uuid --set=root [insert filesystem's UUID here, obtaind by "sudo blkid /dev/sdXY"]
  ntldr /RUFUSLDR
}

//请注意,以上是设置 Grub 当前工作目录的更可靠方法。另请注意,“boot” 隐含在配置文件条目中。

//还请注意,虽然通常使用“drivemap -s (hd0) ${root}”行来启动 Windows(使 Windows 的驱动器成为第一个 BIOS 驱动器),但对我的 USB Windows XP 安装程序执行此操作会导致它在尝试启动 ntldr 样式的引导加载程序时重新启动。如果一切不起作用,并且您确定已完成所有步骤,请尝试“drivemap -s (hd0) ${root}”

//请注意,如果您在启动时插入了多个 USB 驱动器。当系统提示启动 USB 时,它将启动最主要的可启动 USB 驱动器。您可以使用两个可启动 USB 驱动器系统地找出哪个 USB 端口对哪个 USB 端口占主导地位。对我来说,我不需要尝试很多组合,因为我的 USB 端口按列排列,并且整个列对其他列占主导地位。在一列中,较高的一个占主导地位。

//请注意,如果您从另一个驱动器上的 Grub2 启动 Windows XP USB 安装程序,Grub2 将仅看到最主要的 USB 驱动器(至少在我的系统上)。因此,请确保您的 WinXP USB 安装程序位于最主要的使用插槽中。(或者,如果您有两个 USB 驱动器并且 Grub2 看到非 WinXP 安装程序驱动器,则只需切换两者。)当然,如果只插入一个 USB 驱动器,这不是问题。

//如果只是重新启动,请确保您执行了“sudo ms-sys -w /dev/sdXY”,如果是 FAT32,则执行“sudo ms-sys -p /dev/sdXY”,并将 NTDETECT.COM 从 i386 复制到根级别。

//如果它说找不到任何东西,那么您可能没有使用修改后的引导程序。确保您使用的是修改后的引导程序。(与 i386/SETUPLDR.BIN 的 md5 不同。)还要确保 txtsetup.sif 和 NTDETECT.COM 位于根级别。

//如果提示插入 Windows XP SP3 CD,请确保将该行添加到 txtsetup.sif 中,并且您的 CD Ident 文件良好(WIN51、WIN51IP 等)。如有疑问,只需删除 CD Indent 文件并将其复制回来即可。

//如果它说你需要插入一张光盘来证明你有资格进行升级安装,那么是否有任何 GPT 磁盘插入?也许这是导致问题的原因。拔下任何 GPT 方案的磁盘或在 Linux 中将它们转换为 MBR。(例如关闭计算机,拔下电源,再试一次。不要直接拔出。)

//顺便说一句,要安装到 USB 驱动器,您需要在 ngine.de/article/id/8 上进行破解。是的,可以从 USB 安装 Windows XP 到 USB。

享受,

杰克 XD

答案3

事实证明,Windows XP 在安装程序的第一阶段确实会针对特定的硬件配置进行自我配置。

因此,如果要使用 VirtualBox、QEMU 等与您的真实硬盘驱动器结合使用的方法,您确实需要创建第二个硬件配置文件。我希望您可以通过在重新启动进入第二阶段之前关闭虚拟机来绕过此问题,而是将您的真实机器启动到其中并让它为您的真实硬件进行配置。但它在第一阶段而不是第二阶段为硬件进行配置。

所以我绝对建议模仿 Rufus。只需复制文件并进行一些调整。请参阅现有帖子。无需处理第二个硬件配置文件。即使您创建了第二个硬件配置文件,您如何启动 Windows 以在第二个配置文件下为您的真实硬件安装驱动程序?如果您确实找到了方法,许可不会阻止您吗(它查看硬件)?

答案4

这只是对风的呼喊,但是......

试试 VirtualBox 怎么样?您可以下载 Windows XP iso 文件,安装它并安装虚拟机。我认为您也可以在那里访问 USB 驱动器,因此您可以从那里制作 USB 启动驱动器。

相关内容