使用从另一台计算机上的现有 Windows 获取的映像在 virt-manager 上启动 Windows

使用从另一台计算机上的现有 Windows 获取的映像在 virt-manager 上启动 Windows

我有一台装有 Windows 10 的笔记本电脑,它有两个硬盘,一个用于 Windows,其中用 UEFI、Windows 和数据分区分隔,另一个硬盘上安装了更多应用程序。

我正在尝试复制该系统,以便能够在 Gentoo Linux 下的 virt-manager 上运行它。

因此,我首先使用 disk2hd 复制硬盘(https://docs.microsoft.com/en-us/sysinternals/downloads/disk2vhd),它会为每个硬盘创建两个独立的 VHDX 文件。

然后我使用带有以下标志的 qemu-img 将这些图像转换为 qcow2,这是 virt-manager 熟悉的格式:

qemu-img convert -p -f vhdx -O qcow2

我安装了 qcow2 并验证文件是否存在以及图像是否正确。

然后我运行 virt-manager,启用 UEFI 并将其配置为从主硬盘启动。Windows 无法启动。当我尝试运行 Windows 恢复时,它无法修复启动失败。

我在 Google 上搜索,发现修复 Windows 启动的唯一真正方法是下载 Windows,然后在当前 Windows 系统上运行升级。所以我这样做了,我下载了 ISO,在 virt-manager 上启动它,但我无法升级,它无法检测到驱动器上以前的 Windows 安装。

然后我考虑在该分区上重新安装 Windows,然后通过删除、和ProgramData目录Users并用旧备份替换它来用旧 Windows 文件覆盖新的 Windows 文件。Program FilesWindows

我遇到的故障是当前驱动器分为 UEFI、Windows 和数据分区,并且它给了我一个错误,无法在以前安装 Windows 的分区上安装 Windows,然后我安装了主驱动器的 qcow2 映像,删除了所有分区表,在该驱动器上重新安装了 Windows,同时允许 Windows 安装自动对驱动器重新分区,然后替换文件,但替换文件后 Windows 无法再次启动并显示完全相同的症状。

virt-manager 可以正常运行 Windows,因为当我安装新版本的 Windows 时,它运行正常并且没有遇到任何问题,但我正尝试从另一台计算机运行相同的 Windows 安装。

所以现在我不知道还能做些什么来解决这个问题,所以任何信息都将不胜感激。

更新 1

我正在尝试保留一些会计应用程序,我没有该应用程序的升级许可证,该应用程序使用 MS SQL,而我没有该应用程序的用户名和密码。总的来说,我认为知道如何在 VM 上保留 Windows 计算机会很有趣。

关于错误消息..当 Windows 发出启动修复时,我看到的唯一错误是

启动修复无法修复你的电脑

当我启动 Windows 安装并尝试升级当前 Windows 时,我得到:

如果您使用 Windows 安装媒体启动计算机,则升级选项不可用。

当我尝试在已经安装 Windows 的同一分区上安装 Windows 并尝试将windows.old目录移动到 Windows 时,我得到了

无法在此磁盘上安装 Windows。所选磁盘为 GPT 分区形式。

更新 2

感谢所有精彩的答案,我更愿意能够解决使用 VHDX 的问题,然后使用不同的备份软件并使用它。

我的硬盘实际上崩溃了操作系统,我再次备份了 VHDX 文件并在另一台 Gentoo 机器上尝试。

因此从一开始,我就注意到该笔记本电脑配备了 Windows 10 家庭版 64 位希伯来语版本,并且使用 UEFI。

因此,我创建了一个新的 Windows 10 VM,其中Q35芯片组和固件UEFI x86_64: /usr/share/qemu/edk2-x86_64-code.fd创建了 2 个 SATA 驱动器并将它们指向原始 VHDX 文件,而不是先将其转换为 qcow2,并允许从所有驱动器启动并将 CDROM 设置为首先启动。

首先,我使用 Linux Gentoo mini CD 启动,只是为了确认驱动器可以从 VHDX 文件读取,但事实并非如此,因此我重新创建了 qcow2 文件,从 Gentoo Linux 启动,驱动器可以读取。(出于某种原因,我认为 QEMU 开箱即用地支持 VHDX)。

因此再次启动 Gentoo Linux ISO 并检查驱动器,现在我看到了分区。

我有一个标记/dev/sda为 的 NTFS 分区。这是用于我在该笔记本电脑上安装的所有其他程序。/dev/sda1Microsoft Basic Data

并且/dev/sdb我有以下内容:

/dev/sdb1 vfat 260M EFI System
/dev/sdb2 GUID:63 16M Microsoft reserved
/dev/sdb3 ntfs 118.1G Microsoft basic data
/dev/sdb4 ntfs 865M Windows recovery environment

因此,Windows 安装在了 上的第二个驱动器上/dev/sdb3,我进行了挂载和验证。由于 sdb 有 EFI 分区,我假设启动应该在该驱动器中修复,并且我可以/dev/sda从 VM 中的可启动驱动器中删除。所以我这样做了,并启动了 Windows 安装 ISO。

尝试Startup Repair再次执行,它显示出来Diagnosing your PC,然后Attempting Repair重新启动,现在它确实可以工作了。我不知道是不是因为我的驱动器出现故障,因为我没有看到任何相关错误,但你们让我明白了检查原装笔记本电脑是否使用 UEFI 以及继续使用原装驱动器的分区和硬盘驱动器的准确顺序是多么重要。你们帮助我避免分散精力并尝试会弄乱事情的东西,例如重新分区驱动器并浪费大量时间。

事实上,我在重新尝试一切的同时在这里写下了回应,我很高兴它有效。

答案1

这两个因素中的一个或两个都可能起作用,其中第二个因素是启动问题:

  1. Windows 不宜在一个系统上进行镜像,并在未先运行的情况下在另一个系统(VM 或其他)上使用SysPrep在新系统启动之前,在克隆的操作系统分区上
  2. A浮力调节装置店铺 [UEFI] 问题,因为当 Windows 移动/应用到新分区时, 设备卷路径和 GUID 在 BCD 存储 [ Boot\BCD|| ]中不再准确:EFI\Microsoft\Boot\BCD
    • BCD 存储中的不准确会导致启动失败在启动期间阶段2
      引导加载程序阶段 → Windows 引导管理器
      启动顺序
    • BCD 存储卷路径和 GUID 示例:
      # Full volume paths:
        # \\?\GLOBALROOT\Device\Harddisk#\HarddiskVolume#
        # \\?\GLOBALROOT\Device\Harddisk#\Partition#
      
      PS $  BcdEdit /Enum
      
        Windows Boot Manager
        --------------------
        identifier              {bootmgr}
        device                  partition=\Device\HarddiskVolume8
        path                    \EFI\Microsoft\Boot\bootmgfw.efi
        description             Windows Boot Manager
        locale                  en-US
        inherit                 {globalsettings}
        default                 {current}
        resumeobject            {e335a64a-37dc-11eb-bd2a-85edee9cbf64}
        displayorder            {current}
        toolsdisplayorder       {memdiag}
        timeout                 30
      
        Windows Boot Loader
        -------------------
        identifier              {current}
        device                  partition=C:
        path                    \Windows\system32\winload.efi
        description             Windows 10
        locale                  en-US
        inherit                 {bootloadersettings}
        recoverysequence        {55541c35-9fa7-11eb-9281-8086f283f968}
        displaymessageoverride  CommandPrompt
        recoveryenabled         Yes
        isolatedcontext         Yes
        allowedinmemorysettings 0x15000075
        osdevice                partition=C:
        systemroot              \Windows
        resumeobject            {e335a64a-37dc-11eb-bd2a-85edee9cbf64}
        nx                      OptIn
        bootmenupolicy          Standard
        hypervisorlaunchtype    Auto
      

解决:

首先执行 BCD 存储修复 [#3],但 VHDX 应该是 SysPrep'd,因为那是正确的将操作系统克隆到其他机器(物理或虚拟)的方法:
(我已按正确的时间顺序列出了这些步骤)

  1. 系统准备VHDX:
    1. 引导在克隆的 VHDX 所在的同一系统上登录
    2. WinKey+ R→ 打开:%WinDir%\System32\Sysprep\sysprep.exe→ 确定
      1. 系统清理操作 进入系统开箱即用体验 (OOBE)
      2. 关机选项 关闭
      3. 好的
    3. 完成后SysPrep,重新启动到原始 Windows 安装并从 SysPrep'd VHDX 重新创建 VM 映像

  2. VM 中的固件设置 [BIOS || UEFI] 必须匹配:
    如果 Windows 安装在 UEFI PC 上,则 VM 必须是 UEFI,并且禁用 CSM [旧版] 模式
    • CSM 模式永远不应该启用,因为其唯一目的是支持 2017 年左右尚不支持 EFI 启动的发行版;它在 32 位环境中模拟 BIOS 的 16 位架构,这样做会导致性能下降(启动时间增加 400% 以上,GPT 不能在 Windows 中使用,等等)

  3. 启动到温瑞命令提示符并执行方法2&3
    如果 WinRE 启动失败,请启动安装 ISO/USB [温湿度记录仪] 并通过 ++Ctrl打开终端ShiftF10
    [BootRec|BcdBoot]
    • BIOS:
      BootRec /FixMBR && BootRec /FixBoot && BootRec /RebuildBCD
      
    • UEFI:
      BootRec /FixMBR && BootRec /RebuildBCD
      
      如果需要,修复启动目录需要执行 EFI 启动的额外步骤:
      ::# Mount EFI partition at Y:
          Diskpart
      
            Lis Vol
            Sel Vol #
            Assign Letter=Y
            Exit
      
      ::# Enter EFI directory and repair EFI boot structure:
          Cd /d "Y:\EFI\Microsoft\Boot"
          BootRec /FixBoot
      
          ::# If Access Denied error occurs (C: is OS partition, refer to Lis Vol):
              BcdBoot C:\Windows /s C: /f UEFI
      
      ::# Resolve any other boot issues:
          BootRec /FixMBR && BootRec /RebuildBCD
      
      ::# Remove EFI mountpoint and reboot:
          DiskPart
      
            Sel Vol Y
            Remove
            Exit
      
          Exit
      


尽管启动修复可以使用,但不能保证它会修复未损坏的 BCD 存储,通常会返回未找到或无法修复的问题:
(我从来没有找到关于启动修复在后端做什么的手册页——如果知道的话请评论)

  • 众所周知,在将操作系统移动/应用到新分区后,BCD 存储几乎总是导致启动问题(答案顶部 #2),因此直接运行效率更高BootRec,从开始到结束大约需要 2 分钟,而启动修复需要更长的时间才能运行,用户才能确定问题是否得到解决
  • 启动修复并没有列出它之后会做什么,而是日志记录到:
    X:\Windows\System32\LogFiles\Srt\Srttrail.txt
    
    要确定做了什么/没做什么,需要访问 WinRE 的命令提示符并在其中打开日志NotePad;如果不这样做,日志会在重新启动时丢失,因为这X:是一个 RAM 驱动器

所有这些都比BootRec直接运行修复最可能出现的问题(BCD 存储问题)花费的时间长得多(效率低下)。(巧干活,而不是苦干活)

相关内容