我在 FreeBSD 11.1 上的 VirtualBox 中有一个无头运行的 Windows 10 VM。它运行没有问题。我想让 VM 能够访问物理 CD/DVD,这样我就可以插入真正的光盘并在 VM 中打开它们。
当我做
VBoxManage storageattach MyVM --storagectl "SATA Controller" --port 1 --device 0 --type dvddrive --medium host:/dev/cd0
虚拟机不再启动。
$ VBoxManage startvm MyVM
--type headless Waiting for VM "MyVM" to power on...
VBoxManage: error: The VM session was aborted
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component SessionMachine, interface ISession
我确保/etc/devfs.conf
包含
perm cd* 0660
perm xpt0 0660
perm pass* 0660
并且我的用户属于操作员组。此外,VirtualBox 日志不包含任何明显的错误或警告。虚拟机直接中止,没有任何有用的诊断信息。移除 CD 设备可使虚拟机恢复功能。
有任何想法吗?
更新:它似乎VBoxHeadless
因分段错误而关闭。原因我仍不清楚。来自/var/log/messages
:
May 5 12:05:31 the_computer kernel: vboxdrv: XXXXXXXXXXXXXXXX VMMR0.r0
May 5 12:05:31 the_computer kernel: vboxdrv: XXXXXXXXXXXXXXXX VBoxDDR0.r0
May 5 12:05:31 the_computer kernel: pid 61621 (VBoxHeadless), uid 1001: exited on signal 11
更新 2:中止点VBoxHeadless
是 VM 初始化 ATA 设备的位置。如果没有 CD 设备,我会在日志中看到以下内容:
...
00:00:01.280311 VD#0: Cancelling all active requests
00:00:01.280468 PIIX3 ATA: LUN#0: no unit
...
但当我把它加回去时,我得到了
...
00:00:00.273730 VD#0: Cancelling all active requests
[end of file]
答案1
可以尝试的事情:
根据 FreeBSD 手册 §21.6.3:VirtualBox™ 主机 DVD/CD 访问…
需要运行 HAL 才能使 VirtualBox™ DVD/CD 功能正常运行
因此您需要...
启用它
/etc/rc.conf
并启动它(如果它尚未运行)
这是通过添加hald_enable="YES"
到您的/etc/rc.conf
文件然后执行来完成的
# service hald start
/dev/xpt0
这是对用户需要访问、/dev/cdN
和 的要求的补充/dev/passN
,根据手册的同一节,这“通常通过使用户成为 的成员来实现operator
”,并通过在 中添加这些行来更正设备的权限“ /etc/devfs.conf
”
perm cd* 0660
perm xpt0 0660
perm pass* 0660
并(以便系统能够利用这些更改)重新启动devfs
服务
# service devfs restart
如果完成上述所有操作后,您的虚拟机在连接到主机 CD/DVD 驱动器时仍无法启动,请考虑遵循以下建议(摘自同一页面如上):
如果需要,请先创建一个空的 IDE CD/DVD 设备。然后从弹出菜单中选择主机驱动器,以选择虚拟 CD/DVD 驱动器。
如果您不能使用提到的“弹出菜单”,我认为(从阅读文档)以下内容应该是命令行等效的:
关闭虚拟机电源后:连接一个空的虚拟 IDE CD/DVD 设备
VBoxManage storageattach MyVM --storagectl "SATA Controller" --port 1 --device 0 --type dvddrive --medium emptydrive
启动虚拟机:
VBoxManage startvm MyVM
当虚拟机仍在运行时:切换到使用主机驱动器
VBoxManage storageattach MyVM --storagectl "SATA Controller" --port 1 --device 0 --type dvddrive --medium host:/dev/cd0
不幸的是,它可能仍然不起作用:
看来 VirtualBox 中可能存在一个错误,导致此功能无法在您的系统上运行。我建议向项目的 VirtualBox 开发人员报告此问题错误追踪器。
解决方法:
在修复此问题之前,我建议通过从物理光盘制作 ISO 文件以用于 VirtualBox 来解决此问题。(有些人可能更喜欢这种方法。)
读取光盘的块和卷大小,以便制作完美的 ISO
(这一步实际上并不必要的,但是,没有它而制作的 ISO 的校验和将与用于制作 CD 的原始 ISO 文件不同,因为“末尾有一对零数据块”,而且卷大小以后可能会有用)
isoinfo -d -i /dev/cd0 | grep -i -E 'block size|volume size'
您将获得类似这样的输出:
Logical block size is: 2048 Volume size is: 327867
用于
dd
复制光盘内容dd if=/dev/cd0 of=<cd name>.iso bs=<block size from step 1> count=<volume size from step 1>
例如,我将从上面的示例光盘制作一个名为“MyVirtualCD.iso”的 ISO:
dd if=/dev/cd0 of=MyVirtualCD.iso bs=2048 count=327867
- 如果您跳过了步骤 1,则只需离开
bs
,count
如下所示:
dd if=/dev/cd0 of=MyVirtualCD.iso
您的 ISO 仍然可以正常工作,只是最后会有一些不必要的“零数据块”。 - 如果你正在使用它的新版本,可能支持通过添加到上面的命令行来
dd
显示它的状态status=progress
如果你正在使用旧版本
dd
,或者想要一个更好看的进度指示器,你可以pv
通过“Ports 收藏”或者“新鲜港口”,并dd
通过管道传输输出pv
以查看统计数据,由于我们从步骤 1 中知道了卷大小,因此可以得到准确的进度条:
dd if=/dev/cd0 | pv -s <volume size from step 1> | dd of=<cd name>.iso
在我们的示例中,具体如下:
dd if=/dev/cd0 of=MyVirtualCD.iso | pv -s 327867 | dd of=MyVirtualCD.iso
现在您可以将 ISO 附加到 VM 并启动它:
VBoxManage storageattach MyVM --storagectl "SATA Controller" --port 1 --device 0 --type dvddrive --medium /path/to/MyVirtualCD.iso
VBoxManage startvm MyVM
- 此外,如果您在启动虚拟机时将其设置为使用
emptydrive
前面提到的介质,那么空的虚拟 CD 驱动器将可供您storageattach
在虚拟机运行时使用相同的命令随时交换其中一张虚拟 CD。
资料来源:
FreeBSD 使用手册,VBoxManage 文档,托马斯·克伦 维基,询问 Ubuntu 的答案来自“phoibos”
答案2
我认为您的错误在于您应该将存储定义为
IDE Controller
而不是SATA Controller
。
该命令应该看起来像:
VBoxManage storageattach MyVM --storagectl "IDE Controller" --port 1 --device 0 --type dvddrive --medium host:/dev/cd0
如果遇到问题,请尝试以下操作:
$ VBoxManage storagectl MyVM --name "IDE Controller" --remove
$ VBoxManage storagectl MyVM --name "IDE Controller" --add ide
$ VBoxManage storageattach MyVM --storagectl "IDE Controller" --port 1 --device 0 --type dvddrive --medium host:/dev/cd0