在 Virtual Box 中使用物理硬盘

Pet*_*tah 102 virtualbox operating-systems hard-drive virtualization virtual-machine

使用 Virtual Box,我如何将操作系统安装到辅助物理磁盘,并在(在不同时间)Virtual Box 和典型的辅助操作系统安装中引导它?

Яро*_*лин 141

当这个问题最初发布时,我做了一个自鸣得意的评论(“直截了当”),几个月后我发现自己在这个页面上寻找相同的答案


直接指示

今天,我设法从物理驱动器启动。这个成就是必需的;

  • 60 分钟直接阅读
  • 写这个 30 分钟
  • 20 分钟在 VirtualBox 中尝试不同的选项

    亲爱的读者,您的注意力集中在这样一个事实,即以这种方式访问​​光盘时,杀死您的数据同样直接。如何完成此操作的过程留作练习...

图片(确实发生了:)

幼虫 2

1.创建从真实驱动器读取的vmdk驱动器

要创建代表整个物理硬盘的映像(其中不包含任何实际数据,因为这些数据都将存储在物理磁盘上),在 Linux 主机上,使用命令

VBoxManage internalcommands createrawvmdk \
    -filename /path/to/file.vmdk \
    -rawdisk /dev/sda
Run Code Online (Sandbox Code Playgroud)

您必须具有对物理磁盘设备文件的读取权限/dev/sda。为此,您可以更改设备文件的所有者和访问权限,或者VBoxManage internalcommands createrawvmdk以 root 身份运行……(放在sudo命令之前)。

在 Windows 主机上,使用例如 \\.\PhysicalDrive0 代替上述设备规范。在 Mac OS X 主机上,使用例如 /dev/disk1(并卸载 disk1 上的所有分区)。

(all on one line)
C:\VirtualBoxDrives>"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe"
    internalcommands createrawvmdk
    -filename C:\VirtualBoxDrives\raw-0.vmdk 
    -rawdisk \\.\PHYSICALDRIVE0

(output)
RAW host disk access VMDK file C:\VirtualBoxDrives\raw-0.vmdk created successf..
Run Code Online (Sandbox Code Playgroud)

 

2. 将 vmdk 驱动器分配给 VM

虚拟机->设置->存储->添加ide/sata->选择现有磁盘->浏览

分配

 

3. 设置其中一种直写模式。

文件 -> 虚拟媒体管理器 -> 例如 raw-0.vmdk -> [修改] -> (o) 直写

  • 对所有驱动器重复

设置直写

 

3.重新排序引导优先级(半可选)

VM -> 设置 -> 系统 -> 启动顺序

[./] Hard Disk
[./] CD/DVD
[  ] Floppy
[  ] Network
Run Code Online (Sandbox Code Playgroud)

VM -> Settings -> Storage -> Controller: SATA -> eg raw-5.vmdk -> Hard Disk: Sata Port 0

 

相关章节(手册

  • 第 9 章高级主题

    • 9.9. 高级存储配置
      • 9.9.1. 使用来自来宾的原始主机硬盘
      • 9.9.1.1. 访问整个物理硬盘
         
  • 第 5 章虚拟存储

    • 5.2. 磁盘映像文件(VDI、VMDK、VHD、HDD)
    • 5.3. 虚拟媒体管理器
    • 5.4. 特殊图像写入模式

在 Windows 中枚举物理驱动器:

C:\Users\win7>wmic diskdrive list brief

Caption                               DeviceID            Model                                 Partitions  Size
Samsung SSD 840 EVO 250GB ATA Device  \\.\PHYSICALDRIVE3  Samsung SSD 840 EVO 250GB ATA Device  6           250057228288
ST1000DM003-1CH162 ATA Device         \\.\PHYSICALDRIVE1  ST1000DM003-1CH162 ATA Device         5           1000202273280
ST1000DM003-1CH162 ATA Device         \\.\PHYSICALDRIVE2  ST1000DM003-1CH162 ATA Device         5           1000202273280
ST1000DM003-1CH162 ATA Device         \\.\PHYSICALDRIVE0  ST1000DM003-1CH162 ATA Device         5           1000202273280
WDC WD1000DHTZ-04N21V0 ATA Device     \\.\PHYSICALDRIVE5  WDC WD1000DHTZ-04N21V0 ATA Device     6           1000202273280
WDC WD1000DHTZ-04N21V0 ATA Device     \\.\PHYSICALDRIVE4  WDC WD1000DHTZ-04N21V0 ATA Device     5           1000202273280
ST1000DM 003-1CH162 SCSI Disk Device  \\.\PHYSICALDRIVE6  ST1000DM 003-1CH162 SCSI Disk Device  5           1000202273280
Run Code Online (Sandbox Code Playgroud)

您还可以使用 PowerShell 获取驱动器编号:

PS C:\ Get-Disk
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢清晰的分步说明。然而,我遇到的一个问题是虚拟 .vmdk 文件可以由我作为用户拥有,但是当我启动 VirtualBox 并尝试访问它时,会生成一个错误。这似乎是因为物理 /dev/sda 归 root 所有。我尝试更改所有权但没有任何乐趣 - 仍然是同样的错误。以 root 身份启动 VirtualBox 确实有效(尽管我总是对以 root 身份运行任何应用程序持谨慎态度,而像这样的应用程序可能会出错,这让我感到很傻)。 (8认同)
  • 大多数发行版都有一个特殊的组,例如“磁盘”或“块”。在 /dev/sd 中阻塞设备?应该可由属于这些组之一的用户写入。检查您的发行版的文档。 (3认同)
  • @szx 我按照 [这些步骤] 设法解决了 VERR_ACCESS_DENIED 问题(https://forums.virtualbox.org/viewtopic.php?f=6&t=38914#p175089) (3认同)
  • 对于收到此错误的用户:`I/O 缓存在更新介质“ahci-0-0”(rc=VERR_ACCESS_DENIED)中的数据时遇到错误`,通常在使用正在使用的磁盘分区时,需要启用存储控制器上的“主机 I/O 缓存”:https://www.virtualbox.org/manual/ch05.html#iocaching (3认同)
  • 感谢您的清晰说明。一个建议是,您不应在步骤 1 中使用“/dev/sdx”,而应使用“/dev/disk/by-id/...”(此处为您的磁盘序列号或“wwn-”,通过 `ls -l /dev/disk/by-id | grep "/sd.$" | awk '{print $11" -> "$9}' | sort` 进行检查。这样,您的“.vmdk”文件将在重新启动之间保持一致,同时保持磁盘交换。 (3认同)
  • 有人在 Windows 10 上使用过这个吗?我收到此错误:`I/O 缓存在更新介质“ahci-0-0”(rc=VERR_ACCESS_DENIED)中的数据时遇到错误。`,即使以管理员身份运行 VirtualBox 也是如此。 (2认同)
  • 如何通过原始磁盘访问意外杀死他们的数据?我想知道*不*做什么将有助于避免问题。说明看起来很简单... (2认同)

trp*_*him 14

VirtualBox 文档是指访问原始硬盘:

http://www.virtualbox.org/manual/ch09.html#rawdisk

要创建代表整个物理硬盘的映像(其中不包含任何实际数据,因为这些数据都将存储在物理磁盘上),在 Linux 主机上,使用命令

VBoxManage internalcommands createrawvmdk -filename /path/to/file.vmdk
  -rawdisk /dev/sda
Run Code Online (Sandbox Code Playgroud)

这将创建映像 /path/to/file.vmdk(必须是绝对的),所有数据将从 /dev/sda 读取和写入。

要为原始分区支持创建一个特殊的映像(将包含少量的数据,如前所述),在 Linux 主机上,使用命令

VBoxManage internalcommands createrawvmdk -filename /path/to/file.vmdk
  -rawdisk /dev/sda -partitions 1,5
Run Code Online (Sandbox Code Playgroud)

VirtualBox 使用与 Linux 主机相同的分区编号。因此,上述示例中给出的数字将分别指代扩展分区中的第一个主分区和第一个逻辑驱动器。

有关注意事项和特定于 Windows 的说明,请参阅文档。


Nat*_*man 7

我很长时间都无法在 Windows 10 中使用此功能;VERR_ACCESS_DENIED我在尝试附加 VMDK 时不断收到错误消息。

然而,我(终于)能够通过一些技巧来实现这一点:

  1. 以管理员身份打开 PowerShell(我不知道为什么,但我无法让某些命令在管理员命令提示符下运行)

  2. 运行以下命令创建VMDK:

    VBoxManage.exe internalcommands createrawvmdk \
        -filename "path\to\physical\disk\file.vmdk" \
        -rawdisk \\.\PhysicalDrive[n]
    
    Run Code Online (Sandbox Code Playgroud)

    ...其中path\to\physical\disk\file.vmdk要创建的代表磁盘的文件[n]是磁盘编号(使用磁盘管理来获取该编号)

  3. 运行以下命令附加 VMDK:

    VBoxManage.exe storageattach [VM NAME] \
        --storagectl [CONTROLLER] \
        --device 0 \
        --port 0 \
        --type hdd \
        --medium "path\to\physical\disk\file.vmdk"
    
    Run Code Online (Sandbox Code Playgroud)

    ...[CONTROLLER]您要连接的磁盘控制器的名称在哪里 - 在我的例子中为“IDE”

  4. 运行以下命令启动虚拟机:

    VBoxManage.exe startvm [VM NAME]
    
    Run Code Online (Sandbox Code Playgroud)


小智 7

只想详细说明如何在 Windows 10 中执行此操作

  1. 获取物理磁盘 ID
  • 打开powershell
  • 输入“获取磁盘”
  • 查找您的磁盘(记下数字列值)
  1. 清除只读属性(归功于:Korkman at https://forums.virtualbox.org/viewtopic.php?f=6&t=38914#p175089
  • 运行 DISKPART(命令行实用程序)
  • 使用 SELECT DISK 仔细选择硬盘。磁盘编号从零开始。如果您知道您的分区应该是什么样子,您可以使用 LIST PARTITION 粗略地验证您的选择,或者使用 LIST DISK 查看磁盘大小。
  • 使用 OFFLINE DISK 使磁盘脱机。所有卷将从 Windows 资源管理器中消失。
  • 属性磁盘清除只读
  • 用属性盘验证
  1. 更改 VirtualBox 服务帐户(归功于 Kapodamy:https ://unix.stackexchange.com/questions/284704/verr-access-denied-when-trying-to-add-a-raw-disk-to-virtual-box )
  • 在运行中运行 services.msc
  • 查找虚拟盒子服务,将登录选项卡上的帐户更改为管理员
  • 重启服务
  1. 创建 VMDK 磁盘
  • 以管理员身份打开命令提示符
  • 输入“C:\Program Files\Oracle\VirtualBox\VBoxManage”内部命令 createrawvmdk -filename C:\VM\Kubernetes\linux.vmdk -rawdisk \\.\PHYSICALDRIVE2
  • 键入 "C:\Program Files\Oracle\VirtualBox\VBoxManage" 修改 hd "C:\VM\Kubernetes\linux.vmdk" settype writethrough
  • 输入“C:\Program Files\Oracle\VirtualBox\VBoxManage” storageattach Kubernetes --storagectl SATA --device 0 --port 0 --type hdd --medium "C:\VM\Kubernetes\linux.vmdk"
  1. 启动你的虚拟机


Joh*_*Rix 6

我尝试在 macOS 上启动 Linux VM(特别是 Ubuntu 19.10),其中 Ubuntu 安装在物理 ext4 格式的分区上。我找到的许多答案,包括来自 @\xd0\xaf\xd1\x80\xd0\xbe\xd1\x81\xd0\xbb\xd0\xb0\xd0\xb2\xd0\xa0\xd0\xb0\xd1\ x85\xd0\xbc\xd0\xb0\xd1\x82\xd1\x83\xd0\xbb\xd0\xbb\xd0\xb8\xd0\xbd 大部分情况下都得到了我的帮助,但我不断收到以下错误消息:

\n\n
\n

致命:找不到可启动介质!系统停止。

\n
\n\n

一个答案是引导到 LiveCD,然后更改 GRUB 配置来解决这个问题。然而,我的 Mac 上甚至没有安装 GRUB。最终,我发现我的情况的关键是确保虚拟机能够访问物理磁盘上的 EFI 分区,并在虚拟机设置中启用 EFI 支持。

\n\n

在此输入图像描述

\n\n

diskutil list以下是我的 Mac 主机的输出:

\n\n
/dev/disk0 (internal, physical):\n   #:                       TYPE NAME                    SIZE       IDENTIFIER\n   0:      GUID_partition_scheme                        *251.0 GB   disk0\n   1:                        EFI NO NAME                 536.9 MB   disk0s1\n   2:                  Apple_HFS Macintosh HD            161.1 GB   disk0s2\n   3:       Microsoft Basic Data Development             9.1 GB     disk0s3\n   4:                  Apple_HFS Recovery HD             650.0 MB   disk0s4\n   5:           Linux Filesystem                         79.2 GB    disk0s5\n
Run Code Online (Sandbox Code Playgroud)\n\n

由此,我生成了 VMDK 文件,如下所示,为来宾 VM 提供了对 EFI 分区的只读访问权限以及对 NTFS (3) 和 Ext4 (5) 分区的完全写入访问权限。

\n\n
sudo VBoxManage internalcommands createrawvmdk -filename disk0.vmdk -rawdisk -partitions 1r,3,5\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我可以双启动 MacOS 或 Ubuntu,当已经在 MacOS 中时,如果需要,我可以将 Ubuntu 作为虚拟机启动。快乐的时光!

\n