我经常使用 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 中的 vboxusers 和 disk 组。将相同的用户添加到 disk 组非常重要,因为 VirtualBox 以启动它的用户身份运行,并且还需要直接访问 /dev/sdx 设备特殊文件才能在这种情况下工作。将用户添加到 disk 组提供了这种级别的访问权限,否则他们将无法获得。
然后我创建了一个目录来存储虚拟机,并将其所有权授予 root.vboxusers 和 775 权限。我使用 /vms 作为目录,但它可以是任何你想要的。默认情况下,VirtualBox 在创建虚拟机的用户的子目录中创建新的虚拟机。这将使得在多个用户之间共享对虚拟机的访问变得不可能,而不会造成巨大的安全漏洞。将虚拟机目录放在可访问的位置允许共享虚拟机。
我以非 root 用户身份启动了 VirtualBox Manager。然后我使用 VirtualBox 首选项 ==> 常规 菜单将默认虚拟机文件夹设置为目录 /vms。
我创建了没有虚拟磁盘的虚拟机。类型应为 Windows,版本应设置为 Windows 10 64 位。为虚拟机设置合理的 RAM 量,但这可以在以后更改,只要虚拟机处于关闭状态即可。在安装的 硬盘 页面上,我选择了“不添加虚拟硬盘”,然后单击 创建。新的虚拟机出现在 VirtualBox Manager 窗口中。此过程还创建了 /vms/Test1 目录。
我使用 高级 菜单完成了此操作,并在一个页面上执行了所有配置,如图 1 所示。引导模式 获取相同的信息,但需要更多点击才能浏览每个配置项的窗口。它确实提供了一些帮助文本,但我不需要。

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/sdb 的 vmdk 文件。
$ 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 VM 的 VirtualBox 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 的原因之一。这只是需要时间和说服力。我们只剩下这一个会计程序了,我需要与财务主管合作找到一个适合她的程序。我理解这一点——我喜欢我自己的工具,我需要它们以最适合我的方式工作。
11 条评论