如何在VirtualBox中从USB驱动器启动?

问题很简单直接: 如何在VirtualBox中从USB驱动器引导?
编辑: 我已经按照截图所示将usb连接到VirtualBox。

https://istack.dev59.com/UPZZo.webp

但是即使连接了(参考),也无法从USB驱动器启动。
所以我想知道是否还有其他的方法可以从USB驱动器启动?

你可以打开你的USB,将所有内容压缩成一个ISO文件,并正常启动它。 - dat tutbrus
@Ravan - 别忘了,很多用户在gparted中没有将"boot"属性附加到USB闪存驱动器上。这个选项在gparted的菜单'partition'中,你可以在那里编辑USB闪存驱动器的标志或标签,并激活"boot"参数。 - dschinn1001
1@dattutbrus 如果你想在USB上更改文件,那样行不通。 - Paul
@dattutbrus,这样行不通,你的ISO文件无法启动。 - danilo
8个回答

VirtualBox本身不支持从USB设备启动。为了从USB设备启动,需要另一个引导加载程序。下面的步骤提供了一种可能的实现方法:
  1. 下载Plop Boot Manager(当前版本为v5.0.15)。
  2. 从ZIP压缩包中提取文件plpbt.iso并将其保存在某个位置。
  3. 打开虚拟机的设置,并附加ISO文件:

    enter image description here

  4. 为USB设备添加过滤器:

    enter image description here

  5. 启动虚拟机并在菜单中选择“USB”选项:

    enter image description here

如果一切顺利,现在机器应该能够从USB设备启动。


2这绝对是比我的回答更简单的答案。我喜欢它!希望我能够给更多赞。=) - Terrance
4这个答案应该包括你必须是 vboxusers 组的一部分。 - musiKk
6对我来说不起作用。当我选择USB时,屏幕上一直显示等待。有什么建议吗?http://postimg.org/image/dv8w83pi3/ - John
10我想补充一点,Plop Boot Manager只官方支持EHCI。如果你和我一样,试图在Plop Boot Manager中使用USB 3.0驱动器是行不通的。你可以尝试使用其他帖子中提到的方法,但VirtualBox似乎也不太喜欢与USB 3.0设备的原始vmdk文件一起工作。如果你的电脑只有USB 3接口,你可以购买一个USB 2.0集线器,并通过它连接驱动器。它将表现得类似于USB 2.0驱动器。 - fakedad
我在尝试在VirtualBox上安装Mavericks OSX时遇到了同样的问题。由于无法从DMG文件启动,我尝试从USB启动,但似乎没有成功。@John - gumuruh
@gumuruh OS X 不是使用 EFI 吗? - Nathan Osman
确实,但是我尝试的是使用USB安装程序而不是DVD或任何ISO镜像文件。然而,似乎无法读取或者至少在选择USB作为启动选项后按下回车键后,机器没有任何响应。 - gumuruh
3如果您将此解决方案与VMDK结合使用,您可以获得本机USB性能。否则,它只适用于USB 1.1。 - Will Bickford
如果在第4步中没有看到选项,请参考http://askubuntu.com/a/372843/332327 - 添加USB过滤器。 - XoXo
4请注意,Plop引导管理器不支持UEFI。您应该在回答中明确提到这一点,因为像我这样想要安装仅支持UEFI的操作系统的人必须采用另一种方法,即使用下面的Terrance的答案 - fkorsa
1如果您需要引导UEFI驱动器,那么您可以使用我在下面回答中描述的rEFInd引导管理器。 - Leszek Szary
这是一个很酷的答案,但不幸的是对我来说没有起作用,无法通过引导ESD USB驱动器来安装Windows。这可能与@fkorsa提到的UEFI问题有关。 - Guss
1关于@fakedad的回复的注意事项:仅在虚拟机设置中从USB 3切换到USB 2是不够的,实际上您需要一个USB 2集线器。以防其他人没有仔细阅读他的回复 :) - berezovskyi
@fakedad Plop Boot Manager 5.0.15 尝试加载 EHCI、UHCI 和 OHCI 驱动程序。(尽管在我的情况下,无论是 USB 2.0 端口还是 USB 3.0 端口,我都无法使驱动器启动。) - Luke Hutchison

编辑:2018年3月7日

这里有一点需要注意。当您重新启动时,如果将USB驱动器留在计算机中,可能会更改/dev/sd驱动器字母的指定,导致原始的usb.vmdk文件指向错误的驱动器,因此无法在VirtualBox中引导。作为一个测试,我在我的系统中留了一个。在重新启动之前,它是/dev/sdi,重新启动后变成了/dev/sdc。当您重新启动计算机进行任何更改时,请在重新启动之前拔掉USB驱动器。我正在研究是否可以根据驱动器的UUID创建原始磁盘,因为那样不会改变。


由于VirtualBox无法从USB驱动器启动,您可以创建一个指向USB驱动器的.vmdk文件以进行引导。
注意:您必须将您的用户帐户添加到vboxusers组中,以便VirtualBox能够识别您的USB设备。您还必须将您的帐户添加到disk组中,否则无法将.vmdk文件添加到虚拟机中。在下面的编辑部分中添加了说明。此方法不会将USB驱动器复制到硬盘上,而是直接使用USB驱动器。如果您想保留USB上的持久性数据,这可能会有所帮助。但并非每种情况都适用,因此可能无法解决所有问题。
首先,您需要将您创建的USB设备插入系统,并确定其物理驱动器位置。我们假设您的驱动器被挂载为/dev/sdb1。因此,物理驱动器将是/dev/sdb。
接下来,在终端窗口中输入以下命令以创建指向USB驱动器的.vmdk文件:
sudo vboxmanage internalcommands createrawvmdk -filename  ~/usb.vmdk -rawdisk /dev/sdb

或者

sudo VBoxManage internalcommands createrawvmdk -filename  ~/usb.vmdk -rawdisk /dev/sdb

然后您应该看到类似于这个的东西:
RAW host disk access VMDK file /home/ravan/usb.vmdk created successfully.

注意:一些人遇到了新建文件的所有权问题。请获取新文件的所有权。
sudo chown $USER:$USER ~/usb.vmdk

然后你所需要做的就是将.vmdk文件添加到您的VirtualBox虚拟机中,并确保可以引导它。

enter image description here

编辑:
要将您的用户添加到“vboxusers”组中,请运行以下命令:
sudo usermod -a -G vboxusers username

要将您的用户添加到disk组,请运行以下命令:

注意:将您的用户添加到disk组可能存在危险并带来安全风险。这和拥有sudo访问权限以对原始磁盘进行写入一样危险。

sudo usermod -a -G disk username

然后你必须重新启动系统,以使更改生效。

重新启动之前:

enter image description here

重启后:

enter image description here

希望这能帮到你!

1我遇到了这个错误:VBoxManage: 错误:无法打开原始磁盘文件 '/dev/sdc'
VBoxManage: 错误:在 /build/virtualbox-VDAABr/virtualbox-4.3.36-dfsg/src/VBox/Storage/VMDK.cpp(3390) 函数中的错误代码 VERR_WRITE_PROTECT,函数 int vmdkCreateRawImage(PVMDKIMAGE, PVBOXHDDRAW, uint64_t)
VBoxManage: 错误:无法创建原始磁盘 VMDK:VERR_WRITE_PROTECT
VBoxManage: 错误:未创建原始磁盘 vmdk 文件
- John
1@John 你把你的账户添加到了 disk 组后,是否注销并重新登录或者重启了一下? - Terrance
是的,我重新启动了它,即使以root身份运行,结果也是相同的... - John
@John 如果你只是在命令提示符中输入“groups”,它会显示你所属的哪些组? - Terrance
adm 磁盘 cdrom sudo dip www-data plugdev lpadmin sambashare vboxusers libvirtd bumblebee - John
@John 好的,看起来不错。抱歉,我刚刚注意到错误是无法打开你的USB驱动器。现在这个驱动器是否正在被其他设备使用? - Terrance
@John 也可以尝试在创建vmdk文件时不使用sudo - Terrance
3对我来说很有效。备注:无需重新启动,只需注销/登录一次。一旦进入磁盘组,就不需要使用sudo。 - Karl Forner
1我按照指示操作,但在尝试从虚拟机中的USB驱动器启动Windows 10时,出现了“致命错误:无法读取引导介质!系统已停止。”有什么建议吗?非常感谢您的帮助! - ArchLinuxTux
在Windows机器上,您必须以管理员身份运行VirtualBox。 - Daniel Sokolowski
@DanielSokolowski 不是的,主机是openSUSE。来宾是Windows 10映像。需要帮助吗? - ArchLinuxTux
@ArchLinuxTux 我知道这是老问题了,但我刚刚在这个问题上添加了一个关于在重新启动计算机时保留USB驱动器的注意事项。你可能只需要在再次尝试之前重新创建usb.vmdk文件。 - Terrance
еңЁWindowsдёҠеҲӣе»әеҺҹе§ӢVMDKзҡ„е‘Ҫд»ӨжҳҜ"%ProgramFiles%\Oracle\VirtualBox\VBoxManage.exe" internalcommands createrawvmdk -filename PhysicalDrive1.vmdk -rawdisk \\.\PhysicalDrive1пјҢе…¶дёӯPhysicalDrive1дёӯзҡ„й©ұеҠЁеҷЁеҸ·жҳҜеңЁзЈҒзӣҳз®ЎзҗҶдёӯжҳҫзӨәзҡ„ж•°еӯ—гҖӮ - EM0
1我也遇到了“FATAL: 无法从启动介质中读取!系统停止。” - brandones
1@brandones和其他人遇到了"FATAL: Could not read from the boot medium! System halted."的问题。你是不是使用了/dev/sdd而不是/dev/sdd1?我之前错误地使用了后者,导致出现了这个错误。 - jirinovo
使用这种方法尝试启动可引导的USB驱动器时,我遇到了“发生磁盘读取错误”的问题。 - Luke Hutchison

我是几天前来到这篇帖子的。我不想使用Plop引导管理器,因为我的USB闪存已经可启动。

所以我尝试通过创建vboxmanage internalcommands createrawvmdk -filename ~/usb.vmdk -rawdisk /dev/sdb来将USB闪存指向VMDK磁盘(如Terrance的回答中所述)。

不幸的是,这种方法没有奏效...我对usb.vmdk磁盘进行了chmodchown操作,然后能够将其连接到虚拟机,但它根本无法工作。

最后,我尝试了另一个解决方案,这个解决方案完美地起作用。在这里分享一下(感谢Gean Santos的研究):

  1. 插入USB闪存驱动器并识别它(我的是/dev/sdb,运行Sabayon Linux);
  2. 通过将原始设备(即USB闪存驱动器)转换为VirtualBox磁盘来创建一个.vmdk磁盘

    sudo VBoxManage convertfromraw /dev/sdb ./usb.vmdk --format vmdk
    
  3. 现在,您已经从可引导的USB闪存驱动器创建了一个usb.vmdk磁盘。我还尝试使用dd将USB闪存驱动器复制到映像文件,并从映像文件创建.vmdk磁盘。这也可以正常工作,以及以前的方式创建的.vdi磁盘(或从映像文件创建的磁盘)

  4. 现在,为了让VirtualBox能够访问该文件,请为创建的磁盘授予权限。这只是意味着将文件所有者更改为属于vboxusers组的用户。如果您的VirtualBox安装正常运行,则该所有者可能是您自己:

    sudo chown `whoami`:`whoami` ./usb.vmdk
    
  5. 现在,您只需将usb.vmdk磁盘附加到虚拟机即可。但是,它必须附加到IDE控制器。我尝试使用SATA但没有成功。

A VM example with a bootable <code>usb.vmdk</code> attached to an IDE controller

此时,你没问题。

只需要启动新的虚拟机,按下 F12 键,然后选择可启动的驱动器。

享受吧!


这个能用于USB 3.0吗?(参见此处的评论https://askubuntu.com/questions/693719/how-to-boot-from-a-usb-drive-in-virtualbox#comment1229794_693722)? - nutty about natty
1我刚刚检查了一下,你基本上是复制了你的USB闪存驱动器,而不是使用原始的USB闪存驱动器这种方式。 - Fedcomp
完美,这是最简洁和最可靠的答案。 - pylover
完美!允许我启动和安装自定义大小的虚拟磁盘。 - Elad Weiss
VirtualBox 6.1.26版本中不支持vboxmanageconvertfromraw命令,只支持converttorawconverthdcreaterawvmdk命令。 - Luke Hutchison

最简单的解决办法是将USB键的内容复制到一个iso文件中(嗯,下次我会直接在正确的机器上下载iso文件,根本不需要USB键)。
dd if=/dev/sdc of=myusbkey.iso

然后在VirtualBox设置中将此.iso文件添加为光驱,位置在存储器下的控制器:IDE(或SATA,我猜)。
不需要创建.vmdk文件,VirtualBox支持.iso文件。

1这里的问题是,如果你有一个大小约为40GB的可启动镜像分区,它将生成一个相同大小的文件。 - Sposmen
对,但其他解决方案也是这样做的,不是吗? - David Faure
1@DavidFaure关于使用“VBoxManage内部命令createrawvmdk…”的原始答案只是创建了一个类似于您在运行上述命令时连接到系统的USB驱动器的快捷方式。这样,您不会得到用户33845提到的可能非常庞大的USB存储设备镜像。 - ConceptRat
1我不认为这种方法适用于所有的USB镜像。例如,Arnold the Bat网站上的可引导的Chromium镜像是多分区的,并且与ISO格式不对应。 - Troy Folger
2@TroyFolger 实际上,“dd”命令无法与标准ISO文件一起使用,因为ISO 9660规范并未描述具有分区表的完整磁盘映像,而是一个“文件系统映像”(参见man mkisofs)。只有具有MBR分区表的混合ISO文件才能与磁盘映像合并,并且与“dd”兼容(参见isohybrid文档)! - Jules Sam. Randolph
听起来不错,但对于我的Debian启动盘来说行不通。除此之外,从技术上讲,问题是关于如何从USB驱动器启动。这个解决方案建议从光驱启动。 - stackprotector
这只是一个假的光驱,里面装着一个USB驱动器的副本 :) - David Faure
1在命令中添加status=progress以查看dd的进度 - Eido95

如果您的USB驱动器是EFI可引导驱动器,那么Plop Boot Manager将无法工作,因为它不支持EFI引导。在这种情况下,对我有效的方法是使用rEFInd引导管理器(http://www.rodsbooks.com/refind/)。
  1. http://sourceforge.net/projects/refind/files/0.11.4/refind-cd-0.11.4.zip/download下载rEFInd可引导iso文件并解压缩。

  2. 在VirtualBox中打开虚拟机设置,并附加rEFInd CD ISO文件。

  3. 确保在“系统”选项卡的虚拟机设置中启用了“启用EFI(仅限特殊操作系统)”选项。

  4. 启动虚拟机,您应该看到rEFInd引导菜单:

rEFInd menu

5. 将您的USB驱动器连接到VirtualBox中。 6. 按下退格键刷新菜单,或者等待几秒钟,驱动器应该出现在菜单中。 7. 选择您的USB驱动器,按Enter键,您的USB驱动器应该开始启动。

最新的rEFInd可启动iso镜像可以从官方网站的"A CD-R image file"部分获取。 - Eido95

我建议按照以下步骤操作:
1. 打开磁盘。 2. 寻找USB设备。 3. 点击那里,在右上角你会看到一个有三条平行线的设置图标。 4. 点击那里,选择“创建磁盘映像...”。 5. 选择位置并点击“创建”。它将创建一个.img文件,您可以在VirtualBox中使用。

我不想以root用户身份运行Virtualbox。 我不希望我的用户属于磁盘组,具有对所有磁盘的完全权限。

所以这是我找到有效方法:

找出内存棒是哪个sd。在下面的说明中,它是sdc

  • 卸载内存棒

    su -
    chmod 666 /dev/sdc1
    chmod 666 /dev/sdc
    exit # 以普通用户身份运行以下命令:
    VBoxManage internalcommands createrawvmdk -filename usb.vmdk -rawdisk /dev/sdc
    su - # 再次切换回root用户:
    chmod 777 usb.vmdk
    chmod 666 /dev/sdc
    
  • 挂载usb.vmdk到virtualbox虚拟机

    chmod 666 /dev/sdc
    
  • 启动virtualbox虚拟机
  • 完成后,为了安全起见,重置sdc1权限:

    chmod 660 /dev/sdc1
    
在上面你可以看到,我不得不多次重置内存棒的权限,因为每次都会被设置回根目录。
我正在使用Mandriva Linux,但在Ubuntu中应该差不多。

这里的权限调整建议非常糟糕。首先,你是以root身份进行操作,所以实际上并不需要改变权限来使这些命令生效。其次,最好将适当的用户添加到磁盘组中,这样甚至都不需要进行权限调整。 - Evan Teran
@ Evan Teran 你试过吗?是的,该用户是磁盘组的一部分。这是我今天仍然在自己的Linux操作系统中使用的方法。Wayne Sallee Wayne@WayneSallee.com - Wayne Sallee
我并没有说它不会起作用,我只是说这不是一个好建议。无论用户组如何,如果你以root身份运行命令,你甚至不需要去处理权限问题,因为root本来就有访问权限。此外,使用777和666来创建文件和文件夹是不好的做法,除非必要,否则不应该将东西设置为全局可读或可写。 - Evan Teran
@ Evan Teran,以root身份运行不需要root权限的程序并不是一个好建议。这个存储设备只会插入一小段时间,并且不连接到服务器上。这只是一个关于你想要承担风险的问题。我选择将风险放在存储设备上而不是系统上。Wayne@WayneSallee.com - Wayne Sallee
更正:我还没有将我的用户添加到磁盘组中。Wayne@WayneSallee.com - Wayne Sallee
我同意你不应该在不需要的情况下建议以root身份运行某些东西...但这正是你所做的!你说要执行的第一个命令是su,它会切换用户到root身份! - Evan Teran
1@ Evan Teran 看起来你在试图为自己的立场辩护,要运行cmod就必须是root用户。是的,有sudo命令,但本质上是一样的,而且我不喜欢sudo。关于Stack Exchange,我讨厌的一点是别人可以编辑你的答案。你的评论让我意识到答案中显示VBoxManage是以root身份运行的。我不会以root身份运行VBoxManage。我不知道这是我的错误还是别人的编辑导致的,所以现在我将编辑它来纠正这个问题,如果系统允许我编辑的话。Wayne@WayneSallee.com - Wayne Sallee