将您的 Windows 安装转换为 Linux 上的 VM

以下是我如何配置 VirtualBox VM 以在我的 Linux 工作站上使用物理 Windows 驱动器。
134 位读者喜欢这个。
Puzzle pieces coming together to form a computer screen

Opensource.com

我经常使用 VirtualBox 创建虚拟机,用于测试新版本的 Fedora、新的应用程序以及许多管理工具,如 Ansible。我甚至使用 VirtualBox 测试创建 Windows 访客主机。

我从未使用 Windows 作为我的任何个人电脑上的主要操作系统,甚至没有在 VM 中执行一些 Linux 无法完成的晦涩任务。但是,我确实为一个使用需要 Windows 的财务程序的组织做志愿者。这个程序在办公室经理的电脑上运行,系统是预装的 Windows 10 Pro。

这个财务应用程序并不特殊,一个更好的 Linux 程序可以轻松地取代它,但我发现许多会计师和财务主管非常不愿意做出改变,所以我还没有能够说服我们组织中的人迁移。

这种情况,加上最近的安全恐慌,使得将运行 Windows 的主机转换为 Fedora,并在该主机上的 VM 中运行 Windows 和会计程序变得非常理想。

重要的是要理解,我非常不喜欢 Windows,原因有很多。适用于这种情况的主要原因是,我不希望为另一个 Windows 许可证付费——Windows 10 Pro 大约花费 200 美元——将其安装在新 VM 上。此外,Windows 10 在新系统上设置或安装后需要足够的信息,以便让黑客窃取一个人的身份,如果微软数据库被攻破。没有人应该需要提供他们的姓名、电话号码和出生日期才能注册软件。

开始入门

物理计算机已经在主板上唯一可用的 m.2 插槽中安装了一个 240GB NVMe m.2 存储设备。我决定在主机中安装一个新的 SATA SSD,并将现有的带有 Windows 的 SSD 用作 Windows VM 的存储设备。Kingston 在其网站上对各种 SSD 设备、外形尺寸和接口进行了出色的概述。

这种方法意味着我不需要完全重新安装 Windows 或任何现有的应用程序软件。这也意味着在这台电脑上工作的办公室经理将使用 Linux 进行所有正常的活动,如电子邮件、网络访问、使用 LibreOffice 创建文档和电子表格。这种方法提高了主机的安全配置文件。Windows VM 唯一的使用时间是运行会计程序。

首先备份

在做任何其他事情之前,我创建了整个 NVMe 存储设备的备份 ISO 镜像。我在一个 500GB 的外部 USB 存储驱动器上创建了一个分区,在上面创建了一个 ext4 文件系统,然后将该分区挂载到 /mnt。我使用 dd 命令创建了镜像。

我在主机中安装了新的 500GB SATA SSD,并从 Live USB 在上面安装了 Fedora 32 Xfce spin。在安装后的初始重启时,Linux 和 Windows 驱动器都可以在 GRUB2 启动菜单上找到。此时,主机可以在 Linux 和 Windows 之间双启动。

在所有互联网地方寻找帮助

现在我需要一些关于创建使用物理硬盘或 SSD 作为其存储设备的 VM 的信息。我很快在 VirtualBox 文档和互联网上发现了大量关于如何做到这一点的信息。虽然 VirtualBox 文档帮助我入门,但它并不完整,遗漏了一些关键信息。我在互联网上找到的大部分其他信息也相当不完整。

在我们的 Opensource.com 通讯员之一 Joshua Holm 的关键帮助下,我能够突破障碍,使这个过程在一个可重复的程序中工作。

使其工作

这个过程实际上相当简单,尽管需要一个神秘的技巧才能使其工作。当我已经准备好进行这一步时,Windows 和 Linux 操作系统已经到位。

首先,我在 Linux 主机上安装了最新版本的 VirtualBox。VirtualBox 可以从许多发行版的软件仓库安装,可以直接从 Oracle VirtualBox 仓库安装,也可以从 VirtualBox 网站下载所需的软件包文件并在本地安装。我选择下载 AMD64 版本,这实际上是一个安装程序而不是一个软件包。我使用这个版本来规避一个与这个特定项目无关的问题。

安装程序总是会在 /etc/group 中创建一个 vboxusers 组。我将打算运行此 VM 的用户添加到 /etc/group 中的 vboxusersdisk 组。重要的是将相同的用户添加到 disk 组,因为 VirtualBox 以启动它的用户身份运行,并且还需要直接访问 /dev/sdx 设备特殊文件才能在这种情况下工作。将用户添加到 disk 组提供了这种级别的访问权限,否则他们将无法获得。

然后我创建了一个目录来存储 VM,并给它 root.vboxusers 的所有权和 775 权限。我使用了 /vms 作为目录,但它可以是任何你想要的。默认情况下,VirtualBox 在创建 VM 的用户的子目录中创建新的虚拟机。这将使得在多个用户之间共享对 VM 的访问变得不可能,而不会造成巨大的安全漏洞。将 VM 目录放在一个可访问的位置允许共享 VM。

我以非 root 用户身份启动了 VirtualBox Manager。然后我使用 VirtualBox 首选项 ==> 常规 菜单将默认机器文件夹设置为目录 /vms

我创建了没有虚拟磁盘的 VM。类型 应为 Windows版本 应设置为 Windows 10 64 位。为 VM 设置合理的 RAM 量,但这可以在以后更改,只要 VM 处于关闭状态。在安装的 硬盘 页面上,我选择了“不添加虚拟硬盘”,然后单击 创建。新的 VM 出现在 VirtualBox Manager 窗口中。此过程还创建了 /vms/Test1 目录。

我使用 高级 菜单完成了这个操作,并在单个页面上执行了所有配置,如图 1 所示。引导模式 获取相同的信息,但需要更多的点击才能遍历每个配置项的窗口。它确实提供了一些帮助文本,但我不需要它。

VirtualBox dialog box to create a new virtual machine but do not add a hard disk

opensource.com

图 1:创建一个新的虚拟机,但不添加硬盘。

然后我需要知道 Linux 分配给原始 Windows 驱动器的设备是什么。在终端会话中以 root 身份使用 lshw 命令来发现 Windows 磁盘的设备分配。在这种情况下,代表整个存储设备的设备是 /dev/sdb

# lshw -short -class disk,volume
H/W path           Device      Class          Description
=========================================================
/0/100/17/0        /dev/sda    disk           500GB CT500MX500SSD1
/0/100/17/0/1                  volume         2047MiB Windows FAT volume
/0/100/17/0/2      /dev/sda2   volume         4GiB EXT4 volume
/0/100/17/0/3      /dev/sda3   volume         459GiB LVM Physical Volume
/0/100/17/1        /dev/cdrom  disk           DVD+-RW DU-8A5LH
/0/100/17/0.0.0    /dev/sdb    disk           256GB TOSHIBA KSG60ZMV
/0/100/17/0.0.0/1  /dev/sdb1   volume         649MiB Windows FAT volume
/0/100/17/0.0.0/2  /dev/sdb2   volume         127MiB reserved partition
/0/100/17/0.0.0/3  /dev/sdb3   volume         236GiB Windows NTFS volume
/0/100/17/0.0.0/4  /dev/sdb4   volume         989MiB Windows NTFS volume
[root@office1 etc]#

VirtualBox 不需要位于 /vms/Test1 目录中的虚拟存储设备,而是需要一种方法来识别它要从中启动的物理硬盘。这种识别是通过创建一个 *.vmdk 文件来完成的,该文件指向将用作 VM 存储设备的原始物理磁盘。作为非 root 用户,我创建了一个 vmdk 文件,该文件指向整个 Windows 设备 /dev/sdb

$ VBoxManage internalcommands createrawvmdk -filename /vms/Test1/Test1.vmdk -rawdisk /dev/sdb
RAW host disk access VMDK file /vms/Test1/Test1.vmdk created successfully.

然后我使用 VirtualBox Manager 文件 ==> 虚拟介质管理器 对话框将 vmdk 磁盘添加到可用的硬盘中。我单击 添加,默认的 /vms 位置显示在文件管理对话框中。我选择了 Test1 目录,然后选择了 Test1.vmdk 文件。然后我单击 打开Test1.vmdk 文件显示在可用硬盘列表中。我选择了它并单击 关闭

下一步是将此 vmdk 磁盘添加到我们的 VM 的存储设备中。在 Test1 VM 的设置菜单中,我选择了 存储,然后单击图标以添加 硬盘。这打开了一个对话框,其中显示了 Test1vmdk 虚拟磁盘文件在一个名为 未连接 的列表中。我选择了此文件,然后单击 选择 按钮。此设备现在显示在连接到 Test1 VM 的存储设备列表中。此 VM 上唯一的另一个存储设备是一个空的 CD/DVD-ROM 驱动器。

我单击 确定 以完成将此设备添加到 VM。

在新的 VM 可以工作之前,还需要配置一个项目。使用 Test1 VMVirtualBox Manager 设置 对话框,我导航到 系统 ==> 主板 页面,并在 启用 EFI 的框中打勾。如果你不这样做,当你尝试启动此 VM 时,VirtualBox 将生成一个错误,指出它找不到可启动的介质。

虚拟机现在从原始 Windows 10 硬盘启动。但是,我无法登录,因为我没有此系统上的常规帐户,而且我也无法访问 Windows 管理员帐户的密码。

解锁驱动器

不,本节不是关于破解硬盘的加密。相反,它是关于绕过许多 Windows 管理员帐户之一的密码,该密码组织中没有人拥有。

即使我可以启动 Windows VM,我也无法登录,因为我没有该主机上的帐户,并且要求人们提供密码是一个可怕的安全漏洞。尽管如此,我需要登录到 VM 以安装 VirtualBox Guest Additions,这将提供鼠标指针的无缝捕获和释放,允许我调整 VM 的大小以大于 1024x768,并在未来执行正常的维护。

这是 Linux 更改用户密码功能的完美用例。即使我正在访问以前管理员的帐户开始,但在这种情况下,他将不再支持此系统,我将无法辨别他的密码或他用来生成密码的模式。我将简单地清除以前的系统管理员的密码。

有一个非常好的开源软件工具专门用于此任务。在 Linux 主机上,我安装了 chntpw,它可能代表类似“Change NT PassWord”的东西。

# dnf -y install chntpw

我关闭了 VM,然后将 /dev/sdb3 分区挂载到 /mnt。我确定 /dev/sdb3 是正确的分区,因为它是我在之前执行的 lshw 命令的输出中看到的第一个大型 NTFS 分区。务必不要在 VM 运行时挂载分区;这可能会导致 VM 存储设备上的数据严重损坏。请注意,在其他主机上,正确的分区可能不同。

导航到 /mnt/Windows/System32/config 目录。如果这不是当前工作目录 (PWD),则 chntpw 实用程序程序将无法工作。启动程序。

# chntpw -i SAM
chntpw version 1.00 140201, (c) Petter N Hagen
Hive <SAM> name (from header): <\SystemRoot\System32\Config\SAM>
ROOT KEY at offset: 0x001020 * Subkey indexing type is: 686c <lh>
File size 131072 [20000] bytes, containing 11 pages (+ 1 headerpage)
Used for data: 367/44720 blocks/bytes, unused: 14/24560 blocks/bytes.

<>========<> chntpw Main Interactive Menu <>========<>

Loaded hives: <SAM>

  1 - Edit user data and passwords
  2 - List groups
      - - -
  9 - Registry editor, now with full write support!
  q - Quit (you will be asked if there is something to save)


What to do? [1] ->

chntpw 命令使用 TUI(文本用户界面),它提供了一组菜单选项。当选择主要菜单项之一时,通常会显示二级菜单。按照清晰的菜单名称,我首先选择了菜单项 1

What to do? [1] -> 1


===== chntpw Edit User Info & Passwords ====

| RID -|---------- Username ------------| Admin? |- Lock? --|
| 01f4 | Administrator                  | ADMIN  | dis/lock |
| 03ec | john                           | ADMIN  | dis/lock |
| 01f7 | DefaultAccount                 |        | dis/lock |
| 01f5 | Guest                          |        | dis/lock |
| 01f8 | WDAGUtilityAccount             |        | dis/lock |

Please enter user number (RID) or 0 to exit: [3e9]

接下来,我通过在提示符下键入 RID 选择我们的管理员帐户 john。这会显示有关用户的信息,并提供其他菜单项来管理帐户。

Please enter user number (RID) or 0 to exit: [3e9] 03eb
================= USER EDIT ====================

RID     : 1003 [03eb]
Username: john
fullname:
comment :
homedir :

00000221 = Users (which has 4 members)
00000220 = Administrators (which has 5 members)

Account bits: 0x0214 =
[ ] Disabled        | [ ] Homedir req.    | [ ] Passwd not req. |
[ ] Temp. duplicate | [X] Normal account  | [ ] NMS account     |
[ ] Domain trust ac | [ ] Wks trust act.  | [ ] Srv trust act   |
[X] Pwd don't expir | [ ] Auto lockout    | [ ] (unknown 0x08)  |
[ ] (unknown 0x10)  | [ ] (unknown 0x20)  | [ ] (unknown 0x40)  |

Failed login count: 0, while max tries is: 0
Total  login count: 47

- - - - User Edit Menu:
 1 - Clear (blank) user password
 2 - Unlock and enable user account [probably locked now]
 3 - Promote user (make user an administrator)
 4 - Add user to a group
 5 - Remove user from a group
 q - Quit editing user, back to user select
Select: [q] > 2

此时,我选择了菜单项 2,“解锁并启用用户帐户”,它会删除密码并使我能够无需密码即可登录。顺便说一句——这是一个自动登录。然后我退出了程序。在继续之前,请务必卸载 /mnt

我知道,我知道,但是为什么不呢!我已经绕过了此驱动器和主机上的安全性,因此这一点点也不重要。在这一点上,我确实登录了旧的管理帐户,并为自己创建了一个带有安全密码的新帐户。然后我以自己的身份登录并删除了旧的管理帐户,以便其他人无法使用它。

互联网上也有关于使用 Windows 管理员帐户(上面列表中的 01f4)的说明。如果没有组织管理员帐户,我可以删除或更改该帐户的密码。另请注意,此过程可以从在目标主机上运行的 live USB 执行。

重新激活 Windows

所以我现在让 Windows SSD 作为 VM 在我的 Fedora 主机上运行。然而,在令人沮丧的事件转变中,运行几个小时后,Windows 显示一条警告消息,指示我需要“激活 Windows”。

在跟随更多死胡同网页之后,我最终放弃了尝试使用现有代码重新激活,因为它似乎以某种方式被破坏了。最后,当尝试跟随在线虚拟支持聊天会话之一时,虚拟“获取帮助”应用程序指示我的 Windows 10 Pro 实例已激活。这怎么可能呢?它一直想让我激活它,但当我尝试时,它说它已经激活了。

或者没有

当我花了三天时间中的几个小时进行研究和实验时,我决定回到将原始 SSD 启动到 Windows,并在稍后返回此问题。但是,即使从原始存储设备启动,Windows 也要求重新激活。

搜索微软支持网站毫无帮助。在不得不像以前一样与相同的自动化支持纠缠之后,我拨打了提供的电话号码,但只被一个自动响应系统告知,所有对 Windows 10 Pro 的支持都仅通过互联网提供。到现在为止,我在让电脑运行并在办公室重新安装方面已经晚了将近一天。

回到未来

我最终屈服了,购买了一个 Windows 10 家庭版副本——大约 120 美元——并创建了一个带有虚拟存储设备的 VM 来安装它。

我将大量文档和电子表格文件复制到办公室经理的主目录。我重新安装了我们需要的那个 Windows 程序,并与办公室经理确认它可以工作,并且数据都在那里。

最后的想法

所以我的目标实现了,字面上晚了一天,少了大约 120 美元,但使用了更标准的方法。我仍然在对权限进行一些调整,并恢复 Thunderbird 地址簿;我有一些 CSV 备份可以使用,但 *.mab 文件在 Windows 驱动器上包含的信息很少。我甚至使用了 Linux find 命令来定位原始存储设备上的所有文件。

我走进了许多兔子洞,不得不把自己拔出来,每次都重新开始。我遇到了与本项目没有直接关系的问题,但这些问题影响了我在该项目上的工作。这些问题包括有趣的事情,例如在我的 Linux 机器上将 Windows 分区挂载到 /mnt,并收到一条消息,指出该分区已被 Windows 错误关闭(是的——在我的 Linux 主机上),并且它已修复了不一致之处。即使是 Windows 在通过其所谓的“恢复”模式多次重启后也无法做到这一点。

也许你注意到了来自 chntpw 实用程序的输出数据中的一些线索。为了安全起见,我删减了在我的主机上显示的其他一些用户帐户,但我从该信息中看到所有用户都是管理员。不用说,我改变了这一点。我仍然对遇到的糟糕的管理实践感到惊讶,但我想我不应该感到惊讶。

最后,我被迫购买许可证,但至少比原来的许可证便宜一点。我知道的一件事是,一旦我找到了所有必要的信息,Linux 部分就可以完美地工作。问题是处理 Windows 激活。你们中的一些人可能已经成功地重新激活了 Windows。如果是这样,我仍然想知道你是如何做到的,所以请将你的经验添加到评论中。

这是我讨厌 Windows 并且只在自己的系统上使用 Linux 的又一个原因。这也是我正在将组织的所有计算机转换为 Linux 的原因之一。这只是需要时间和说服力。我们只剩下这一个会计程序,我需要与财务主管合作,找到一个适合她的程序。我理解这一点——我喜欢我自己的工具,我需要它们以最适合我的方式工作。

接下来阅读什么
标签
David Both
David Both 是开源软件和 GNU/Linux 的倡导者、培训师、作家和演讲者。自 1996 年以来,他一直从事 Linux 和开源软件工作,自 1969 年以来一直从事计算机工作。他是“系统管理员的 Linux 哲学”的坚定支持者和布道者。

11 条评论

我喜欢你的文章 David!对这个过程的记录也很棒。我也是 Virtualbox 用户。我曾经是 Quicken for Home and Business 用户,直到几年前转换为 GnuCash。我不喜欢运行 Windows,因为我也不喜欢它,原因和您指出的许多原因一样,所以我确实在安装了 Quicken 的 VM 中运行它。我曾和一些使用 Windows 的朋友开玩笑说,Windows 在 VM 中比在裸机上运行得更好。

几年前我参与的一个非营利组织的财务主管也使用了 GNUCash。

多年前我开始做双启动机器。那里存在的问题是,要将文件从一个移动到另一个,您需要保存到磁盘。当 VM 出现时,我最终切换到了 VM(主要是为了在 Windows 上报税)。我在有点老旧的机器和 Windows 10 上使用 VM 时遇到的问题是资源分配。您必须决定将多少处理能力分配给 VM,以及分配多少 RAM。即使经过调整,去年我的 Win10 仍然非常卡顿。现在我正在考虑简单地拥有一台单独的 Win 物理机器,我可以在需要时通过家庭网络轻松传输文件。

您说性能非常正确。Win 10 对我来说扩展性不好。它喜欢获得更多的内存和 CPU,但在玩弄增加的 RAM 和 CPU 后,它几乎无法在以前的分配上运行。最后,我只是重新安装了一个全新的 Win 10 副本作为 VM,并安装了我的一个应用程序。您可以在 Linux 上创建一个 Samba 共享,任何 Win 机器(VM 或物理机)都可以作为同一网络上的映射驱动器访问该共享。有很多关于这方面的帮助。只需记住设置共享权限和文件权限,以便 Win 可以使用它。

回复 作者 Greg P

我不太愿意将用户添加到“disk”组,因为他们将拥有对所有磁盘设备(包括 linux 系统磁盘)的写入权限。
例如,用户可以 dd if=/dev/zero of=/dev/sda
一种选择可能是创建一个组,例如“windisk”,并将 windows
磁盘和分区 chgrp 到此组。
我认为您需要一个 udev 规则来执行此操作。
也许 Fedora 上的 selinux 配置文件已经阻止用户修改磁盘,除非通过 vbox 等。

Windows 激活不是硬件相关的吗?

好文章。几年前我将剩下的 Windows 转换为 VM,并且在尝试将物理 Windows 驱动器连接到 VM 时遇到了困难。一些注意事项
如果您没有激活密钥,则 PC 密钥可能已嵌入硬件。在运行该机器的 Linux 上安装软件包 acpica-tools。
运行“sudo acpidump -n MSDM”
在此转储的末尾是 Windows 激活密钥。此机器密钥可用于激活您的 VM。只需像购买的密钥一样键入它即可。不要将其用于其他机器,每位客户一个。
始终在将驱动器连接到 Linux 之前正确关闭 Windows,以避免 NTFS 磁盘问题。

当内核中已经有 KVM 时,为什么要安装 VirtualBox?安装 virt-manager 或 Gnome Boxes 并消除 Type 2 开销。

我想知道在 MSWindows 系统上运行“sysprep”(在仍然以“裸机”模式运行时)是否有可能将安装迁移到通用配置,该配置可以在 VirtualBox 下重新激活?只需确保首先拥有许可证密钥。

当然,我在 sysprep 方面经验不足,不知道还需要哪些其他步骤,但这是我本应调查的路径。

我选择使用 Clonezilla 备份我的 Windows 10 安装,然后删除了 Windows 分区。

然后,在 Linux 上,我只是通过 Clonezilla 再次将此备份恢复为 Virtualbox 上的 VM。

它作为 Linux 上的 VM 运行良好,它保留了原始 Windows 安装上安装的所有文件和应用程序,并且不必购买另一个许可证。

请注意,如果发生超过 4 次硬件更改,Windows 许可证将被撤销。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.