VirtualBox 学习
从3.2版开始,当 Guest运行特定的 Server OS时, VirtualBox支持CPU的热插拔. 也就是在虚机正在运行时,添加和移除虚拟CPU。CPU 热插拔只在支持这个特性的OS上才能工作,也就是说,只有Linux 和 Win 2008 x64 data center 版。Win 2008 x64 data center 版只支持 hot-add,不支持 hot-remove。 Linux 对 hot-add,hot-remove都支持,但是要求至少8个CPU的64位Linux
----- 注: 这里说的CPU是虚拟CPU,或者称 logic processor(LP),不同于物理CPU,它是虚拟化工具将物理CPU的计算功能虚拟化后的分配单元。 例如:配置两个Intel E5530CPU的服务器,E5530是4核并支持超线程的CPU,LP 数量= 2 CPU * 4核 * 2 (超线程)= 16 LP,而 E5440 双CPU的服务器,因为不支持超线程,总共只有 LP = 2 CPU * 4 核 = 8 LP
当前,只能通过命令行来调用LP热插拔功能
1. 需要为某个虚机enable CPU热插拔功能
VBoxManage modifyvm "VM name"--cpuhotplugon
2. 使用 --cpu 参数指定该虚机可以使用的CPU的最大数量
VBoxManage modifyvm "VM name"--cpu8
3. 然后,如果虚机是关机状态,可以用如下命令添加删除LP
VBoxManage modifyvm "VM name"--plugcpu 3
VBoxManage modifyvm "VM name"--unplugcpu3
注意,CPU 0 永远不能remove
如果虚机正在运行,使用如下命令添加LP:
VBoxManage controlvm "VM name"plugcpu 3
VBoxManage controlvm "VM name"unplugcpu 3
Linux 中,为了防止CPU正在使用时被remove,首先必须在guest 内将它eject。 Linux 的 guest additions 包含一个服务,它接收 hot-remove事件,然后eject CPU。 同样的,Linux中,在CPU被添加时,它不会被OS自动使用,guest additions 服务会检测CPU是否被安装了。 如果CPU没有被使用,可以用如下命令指定开始使用
echo 1 > /sys/devices/system/cpu/cpu<id>/online
Host的 PCI Passthrough
当运行在 Linux host 之上的时候, 如果有足够新的内核 (至少 2.6.31),可以使用实验性的 host PCI passthrough 特性 (VirtualBox 4.1 版本开始)
1.PCI passthrough 模块是在 VirtualBox 扩展包中被带入的,必须另外安装,而且它不使用VirtualBox的 GNU 许可证,这个要注意。
2. 这个特性允许 guest 直接使用host上的物理PCI设备,即使host 没有这个设备的驱动,支持通常的PCI和 部分PCIe 卡。当前不支持AGP和特定的一些PCIe 卡,如果他们依赖GART (Graphics Address Remapping Table) 单元编程来用于纹理管理,因为它使用非常特殊的函数操作来访问IOMMU的页面重映射接口。将来的版本或许会去除这个限制。
3. 为了能全功能使用,VirtualBox的PCI passthrough 支持依赖于一个 IOMMU硬件单元,但是这个硬件还没有被广泛应用。 如果硬件使用bus mastering ( 也就是说它执行DMA操作来访问它自己的OS内存),那么就需要使用IOMMU,否则这种DMA事务可能会写入错误的物理内存地址,因为设备DMA引擎被编程使用设备特定的协议来执行内存事务。 IOMMU硬件单元会作为翻译单元,通过guest OS的物理地址和host物理地址的翻译规则的信息,来映射来自设备的物理内存访问请求。
Intel的 IOMMU实现被称为 intel virtualization technology for directed I/O(VT-D),AMD的 IOMMU实现被称为 AMD-Vi ,所以请检查主板说明和BIOS设置。 即使你的主板没有一个IOMMU,特定的PCI卡仍然可能可以工作,例如串口PCI卡,但是 guest 启动时会出现警告,而且如果虚机的驱动尝试enable card bus mastering 时,虚机的操作会被中断。
非常常见的是,IOMMU被 BIOS 或者 host OS 缺省disable了。所以,检查:
1. 主板有一个 IOMMU单元
2. CPU支持 IOMMU
3. BIOS中enable了 IOMMU
4. 虚机必须使用 VT-x/AMD-v +nested paging enabled.
5. Linux 内核必须编译来支持 IOMMU (包含 DMA重映射,看内核编译选项的 config_DMAR), PCI stub driver (config_PCI_stub) 也需要编译。
6. Linux 内存必须能识别和使用 IOMMU单元 (可能需要 intel_iommu=on 启动选项),请在内核引导log中查看DMAR, PCI_DMA
然后,就是选择PCI卡,将它attach到guest OS上。 使用 lspci 列出可用的 PCI设备,输出类似如下信息:
01:00.0 VGA compatible controller: ATI Technologies Inc Cedar PRO
01:00.1 Audio device: ATI Technologies Inc Manhattan HDMI Audio
02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 03)
03:00.0 SATA controller: JMicron Technology Corp. JMB362/JMB363 Serial ATA Controller (rev 03)
03:00.1 IDE interface: JMicron Technology Corp. JMB362/JMB363 Serial ATA Controller (rev 03)
06:00.0 VGA compatible controller: nVidia Corporation G86 (rev a1)
其中,第一列是 PCI地址 (格式为: bus:device:function)这个地址可以被用于在以后的操作中指示这个设备。例如,上例中的host的第二个PCI总线上的 PCI网卡 attach到 虚机中作为 device5, function0,可以使用如下命令 (在host上执行)
VBoxManage modifyvm"VM name"--pciattach02:00.0@01:05.0
如果要detach, VBoxManage modifyvm"VM name"--pcidetach02:00.0
注意,host 和 guest 都可以在运行时任意分配其它的 PCI 地址给 attach的卡,所以上述命令中的地址只是在 attachment 操作时(host上)和 BIOS PCI 初始化时(guest上)才有效的地址
如果虚机有 PCI设备attach了,那么有如下的限制:
1. 仅支持非共享中断的PCI卡 (例如host上使用 MSI ?? 谁能解释一下)
2. guest 的状态无法被可靠的保存和恢复 (指的是快照),因为PCI卡的内部状态无法获得。
3. Teleportation (类似 MS 的 live migration,VM的 vMotion) 无法工作 (和上面同样的原因) --------- 是的,VirtualBox 从 3.1版开始就支持这个功能了。
4. 无法实现 lazy 物理内存的分配,host 将在虚机启动时预先分配给该虚机所有它指定的内存。还是因为上面的原因,造成无法获得物理硬件对物理内存的访问信息。
关于 IOMMU,参见
http://baike.baidu.com/view/3100269.htm
http://www.iyunv.com/jh/4/985872.html---- 这个帖子里有 intel 的 IOMMU 技术规范文档的下载地址。
从纯技术角度讲,AMD的 IOMMU 貌似更有趣
页:
[1]