将您的 Windows 安装转换为 Linux 上的虚拟机

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

Opensource.com

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

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

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

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

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

开始入门

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

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

首先备份

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

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

在互联网上寻找帮助

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

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

使其工作

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

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

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

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

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

我创建了没有虚拟磁盘的虚拟机。类型应为 Windows版本应设置为 Windows 10 64 位。为虚拟机设置合理的 RAM 量,但这可以在以后更改,只要虚拟机处于关闭状态即可。在安装的 硬盘 页面上,我选择了“不添加虚拟硬盘”,然后单击 创建。新的虚拟机出现在 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 文件来完成的,该文件指向将用作虚拟机存储设备的原始物理磁盘。作为非 root 用户,我创建了一个指向整个 Windows 设备 /dev/sdbvmdk 文件。

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

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

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

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

解锁驱动器

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

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

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

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

# dnf -y install chntpw

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

导航到 /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 作为虚拟机在我的 Fedora 主机上运行。然而,在一个令人沮丧的转折中,在运行几个小时后,Windows 显示一条警告消息,指示我需要“激活 Windows”。

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

或者不是

当我花了三天的时间研究和实验几个小时后,我决定回到从原始 SSD 启动到 Windows,并在以后再回到这里。但是,即使从原始存储设备启动,Windows 也要求重新激活。

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

回到未来

我最终忍气吞声,购买了一个 Windows 10 家庭版——大约 120 美元——并创建了一个带有虚拟存储设备的虚拟机来安装它。

我将大量文档和电子表格文件复制到办公室经理的主目录。我重新安装了我们需要的那个 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 用户。在几年前转换为 GnuCash 之前,我曾经是 Quicken for Home and Business 用户。我不喜欢 Windows,因为我不喜欢它,原因有很多,你已经指出了很多,所以我确实在安装了 Quicken 的虚拟机中运行它。我曾和一些使用 Windows 的朋友开玩笑说,Windows 在虚拟机中比在裸机上运行得更好。

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

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

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

回复 作者 Greg P

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

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

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

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

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

当然,我在 sysprep 方面没有足够的经验来了解还需要哪些其他步骤,但这是我会调查的路径。

我选择使用 Clonezilla 制作 Windows 10 安装的备份,并在之后删除了 Windows 分区。

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

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

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

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