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

20 linux usb dell-inspiron installation

我有一台仅安装了UbuntuDell Inspiron Mini 9。我也想安装 Windows XP,但我没有也无法获得外部 CD 驱动器,所以我需要从 USB 进行 Windows 安装。

我发现的所有教程都使用 Windows 使 USB 可启动。我怎样才能从 Linux 做同样的事情?

小智 15

您可以使用VirtualBox并授予虚拟机访问硬盘驱动器的权限。然后在虚拟机中安装 Windows XP 并在真实硬盘驱动器上创建一个新分区。安装后,您可以像往常一样重新启动计算机和启动窗口。

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

VBoxManage internalcommands createrawvmdk -filename ~/hdd.vmdk -rawdisk /dev/sdx
Run Code Online (Sandbox Code Playgroud)

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

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

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

  2. 如果目标计算机是完全干净的,请制作一个可引导的 Ubuntu USB 驱动器,在该驱动器上还放置了(合法购买的)Windows 安装 CD 的映像。然后在目标机器上启动 Ubuntu 并按照上面的说明进行操作。

  • 这绝对是一个绝妙的解决方案!到目前为止似乎工作。:) (2认同)
  • 不幸的是,除非你很幸运,否则这种方法并不能真正奏效。您可能最终会安装在虚拟机中运行良好但无法在硬件上启动的 Windows。 (2认同)

小智 9

从这里下载 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 1、WinToFlash 1 和HP USB Format 实用程序1 都让我失望。

鲁弗斯确实有效。但它是一个仅限 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 卷。

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

Rufus 不仅格式化分区,它还重做 MBR(包括分区表)。因此,请先从拇指驱动器中保存任何内容。

注意: 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
Run Code Online (Sandbox Code Playgroud)

现在使用 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.
Run Code Online (Sandbox Code Playgroud)

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

HAMMOND – “别担心,我不会再犯同样的错误了。” 马尔科姆——“不,不,你正在制作全新的。”

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

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

sudo mount -t ntfs-3g /dev/sdXY [mount point]
Run Code Online (Sandbox Code Playgroud)

在 Linux 中做你想做的事。

如果你愿意,把 rufus_trick_mbr 放回去:

sudo dd if=~/Desktop/rufus_trick_mbr of=/dev/sdX bs=512 count=1 //No "Y"! Just /dev/sdX!
Run Code Online (Sandbox Code Playgroud)

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

这是发生的事情:

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

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

我认为 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 中的 Rufus(或者几乎任何 unixoid,我猜):

  1. 确保驱动器采用 MBR 方案。如果它是 GPT,fdisk 将发出警告,并且还为您提供使其成为 MBR 方案的选项(选项“o”)。破坏性较小,如果您有 4 个或更少的分区,gdisk 将允许您将 GPT 方案驱动器转换为 MBR 方案驱动器。Gdisk 还可以让你的驱动器成为混合 MBR/GPT 方案的磁盘,你可以选择最多 3 个分区对 GPT 不感知的东西可见(第四个插槽被占用用于覆盖其余部分的保护分区)。即使你只是使用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
Run Code Online (Sandbox Code Playgroud)

3 应用 DOS/Windows 非常挑剔的神奇引导区:

sudo ms-sys -w /dev/sdXY
Run Code Online (Sandbox Code Playgroud)

*关于这个——“-w”代表“写”——只是写。与指定要写的内容相反。因此,“-w”是 ms-sys 的自动模式:它确定要为这种情况写入的最佳引导扇区数据类型。我惊讶地发现 auto 是正确的:对于 FAT32 分区,我需要 ms-sys 的 FAT32 DOS引导扇区而不是ms-sys 的 FAT32 NT引导扇区,我认为我需要加载 _NT_LDR (NT loader)(SETUPLDR. BIN 是 NTLDR 的修改版本,而 RUFUSLDR 是 SETUPLDR.BIN 的修改版本)。

4 最好将几何内容也写入分区。这不会改变磁盘的几何形状,它只是为懒得自己找出几何形状的东西留下关于几何形状的注释:

sudo ms-sys -p /dev/sdXY
Run Code Online (Sandbox Code Playgroud)

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

uname -r
Run Code Online (Sandbox Code Playgroud)

5 复制iso、文件夹等中的文件。许多发行版通过双击它们来安装isos,或者至少提供在右键单击>打开方式下使用存档安装器打开的选项。如果您不是这种情况,请执行以下操作:

sudo mount -o loop (path to iso) (path to desired mount point)
Run Code Online (Sandbox Code Playgroud)

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

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

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

9 打开 txtsetup.sif 的新副本,并为“[SetupData]”打开 Ctrl+F。在该标题的正下方,放置以下行:

SetupSourceDevice = "\device\harddisk1\partition1"
Run Code Online (Sandbox Code Playgroud)

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

要将 Grub2 安装到磁盘(如果使用硬盘驱动器现有的引导加载程序,您可能不需要这样做):

sudo grub-install --boot-directory=[mount point of disk, not iso] [/dev/sdxy]
Run Code Online (Sandbox Code Playgroud)

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".
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

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

//还要注意,虽然习惯上有一个“drivemap -s (hd0) ${root}”行来引导 Windows(使 Window 的驱动器成为第一个 BIOS 驱动器),但为我的 USB Windows XP 安装程序这样做导致它只是尝试启动 ntldr 样式的引导加载程序后重新启动。如果事情不起作用,并且您确定已完成所有步骤,请尝试“drivemap -s (hd0) ${root}”

//请注意是否在启动时插入了多个 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 缩进文件并复制回来。

//如果提示你需要插入光盘证明你符合升级安装的条件,是否插入了任何GPT磁盘?也许这是造成问题的原因。在 Linux 中拔下任何 GPT 方案的磁盘或将它们转换为 MBR。(就像关掉电脑,拔掉插头,再试一次。不仅仅是猛拉。)

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

享受,

杰克XD


t0m*_*13b 1

看一下UNetBootIn。这应该可以解决问题。

  • 我无法让它在 Windows XP 上工作,它不会启动 Windows 安装程序 (8认同)
  • 您能否发布一个参考资料(官方或其他方式)来说明 Windows XP 可以实现此操作?您或您认识的人是否成功完成了这项工作?我已经尝试了几次但失败了,我想知道在我再次尝试之前是否可能。 (2认同)