正因为进了爱国为网技大赛,所以终于有机会用上大名鼎鼎的eNSP了。一开始看着那是个小软件,所以没怎么当一回事,像EDA软件一样直接装在了虚拟机中。但当我看到它装了个VirtualBox的时候,我意识到问题的严重性——半虚拟化虽然能有很快的速度,但虚拟CPU并没有VT-d的支持,也就是那个vmx指令集,完全的二进制转译的虚拟化肯定要卡死。开了一个拓扑图,开机,果不其然。

macOS下Parallels Desktop配置方法

cpu use without vtd这是来得非常愉快了,自己也意识到这个问题的重要性,所以试着打开了nested虚拟化,在任务管理器中系统识别为非虚拟机,开启了虚拟化,再开机,一切正常,CPU占用40%左右。

在VirtualBox中出现了半虚拟化接口,就是nested虚拟化开启了的一个标志。

Linux QEMU/KVM 配置方案

这里配置好了,但感觉笔记本运行还是很力不从心,所以决心折腾Linux KVM虚拟机。大致这次配置的内容有几个:

使用逻辑卷管理器(LVM)配置存储池

听说(真的就是听说罢了),对于KVM而言,LVM这种映射真实设备的存储池类型,能最大程度接近物理磁盘本身的性能。所以就试着搞一个。

首先,通过fdisk/gdisk命令建立一个或多个LVM分区;

其次,在/etc/libvirt/storage中加入lvm池配置文件lvm_pool.xml:

<pool type='logical'>
  <name>lvm_pool</name>
  <source>
    <device path='/dev/sdb4'/>
    <name>lvm_pool</name>
    <format type='lvm2'/>
  </source>
  <target>
    <path>/lvm_pool</path>
  </target>
</pool>

再次,执行以下命令定义和初始化LVM存储池:

virsh # pool-define /etc/libvirt/storage/lvm_pool.xml
virsh # pool-build lvm_pool

顺便,启动、自动启动,了解一下!

virsh # pool-start lvm_pool
virsh # pool-autostart lvm_pool

大概看到这样子就很好了:

 名称                  状态      自动开始
-------------------------------------------
 default              活动      是
 image                活动      是
 lvm_pool             活动      是

CPU配置的一部分问题

因为我们要强求支持嵌套虚拟化,所以CPU配置的弯路是少不了的。先确认下nested虚拟化是否开启:

cat /sys/module/kvm_intel/parameters/nested

如果出现Y,那么就很好了;反之,这样子处理下:

echo "options kvm-intel nested=1" >> /etc/modprobe.d/kvm-intel.conf
#重启 或者
rmmod kvm-intel
modprobe kvm-intel nested=1

这里选择的是直通,会把CPU信息暴露给VM,有可能会影响部分系统的迁移。
修改命令:

virsh # edit <hostname> 

然后CPU部分配置修改如下:

<cpu mode='host-passthrough'>
  <topology sockets='1' cores='4' threads='2'/>
</cpu>

里面拓扑配置设定的是1插槽、4内核、2线程,一共1*4*2=8个逻辑处理器
具体分配的CPU数目不应超出宿主机逻辑处理器的总和。

如果在VirtualBox上出现上文硬件加速选项,即配置已妥当。

FAQ

  1. 为什么我分配了多个内核,但Windows只出现2个内核?
    A: 对于普通的Windows来说,最多只支持2个插槽的CPU,如果使用默认的拓扑规则,可能会生成8个插槽的CPU,导致只能使用前2个插槽的CPU,一共2个逻辑处理器。
  2. 我的Windows更新了,为什么eNSP启动会出现40错误?
    A: 这时候需要做的有两个:

    1. 重新新建Host-Only网络适配器
      管理->全局设定->网络->Host-Only网络
      新建网卡,IP地址为192.168.56.1,关闭DHCP
    2. 在eNSP中重新注册设备
  3. 我的Windows大版本更新经常卡在某个进度,怎么办?
    A: 关闭nested虚拟化进行更新即可。

References

[1]. 在 libvirt 上使用 LVM 存储设备, IBM中国Linux与虚拟化实验室.