PVE中安装TrueNAS的嵌套虚拟化问题(创建虚拟机提示不支持虚拟化、虚拟机只能单核)
家用NAS一般会兼顾多种用途,为了在一定程度上避免all in boom的情况,用pve或者esxi这种虚拟机系统作为底层,在上面分别安装NAS,软路由,虚拟机等应用会显得更保险一点,但是这里面会出现一些虚拟化的问题。
本文主要是讲:安装在pve上的truenas scale系统,在启用truenas scale中的虚拟机服务的时候(大娃套小娃),会提示【EFAULT】 This system does not support virtualization. 或者 Only one Virtual CPU is allowed in this system. 的问题。
之所以有这种套娃操作那是因为nas系统有raid和快照功能,某些特殊虚拟机安装在nas系统里面会更加保险一点。

正文开始:
网上关于pve上安装truenas的教程有是有但是不多,而且写的都不是很细致,就像本文中的问题,即便是司波图也没有避开这个坑hhhh (我这算是补充教程吧)
先来讲讲网上常规的pve上安装truenas的教程吧,常规的操作步骤这里不讲,只讲配置中一些特别要注意的点。
1、主板bios里面关于CPU虚拟化的选项都要启用。pve本身的硬件直通相关选项记得打开,immo什么的好像,网上有教程。
2、系统-机型 这里要选q35,不然以后好像不能硬件直通(这个我当时没注意,是看了司波图的教程才发现的)
3、重点:CPU-类型 这里网上所有教程都是选默认,就是kvm64的,这个CPU类型一般使用是没问题的,但是要开启truenas里面虚拟机的时候就有问题了,这里应该选host,选了host嵌套虚拟化自动就打开了,不需要再做任何额外设置了!
如果是新安装的用户,照着做到这里就算避开坑了,后面的东西可看可不看了。

下面开始爬坑之路:
最开始我在pve里面安装truenas的时候,主板虚拟化以及pve硬件直通都是开启了的,但是cpu类型用的是默认的kvm64,一直正常使用了一段时间,直到某一天开始折腾truenas里面的虚拟机的时候。
在我创建虚拟机设置虚拟机的CPU参数的时候,无法创建虚拟机,会提示【EFAULT】 This system does not support virtualization.的错误。这个问题咨询了sagit大佬,也去google了一下(truenas的问题还是得去google用英文查,中文资料太少太少了),得到的答案是没有开启pve的嵌套虚拟化(意思就是pve的虚拟化是支持了,但是pve上安装的系统还没有支持虚拟化),那就想办法开启呗。
然后就是出bug的地方了,目前网上关于pve开启嵌套虚拟化的教程,基本上都是为了在pve上安装群晖准备的,他们的教程都是在 /etc/pve/nodes/pve/qemu-server/这个路径下,修改100.conf 这个配置文件(100为对应的虚拟机ID),在文件的第一行加上 :
args: -cpu 'kvm64,enforce,+kvm_pv_eoi,+vmx,+kvm_pv_unhalt,+lahf_lm,+sep',
这样修改之后进truenas里面再次添加虚拟机就会发现,错误变成了Only one Virtual CPU is allowed in this system. ,意思就是你现在开启了虚拟化,但只能创建单核心的虚拟机,多核心不行。那就再去google吧,发现大家都说的是CPU架构太老,不支持高级的虚拟化功能,而我的CPU是个八代i7,不存在这个问题的。现在想起来,在conf里面增加kvm的参数,相当于把你的物理CPU虚拟成了kvm的处理器,kvm属于很老的架构了,不支持多核虚拟机也就是情理之中了。(这一点可以在truenas的shell里面输入lscpu来确认,此时lscpu显示的处理器信息是kvm processor,而不是真正的CPU型号)
最后我是在一篇讲的不是很清晰的嵌套虚拟化教程里面看到了说开启host的操作,然后我就想着试试看把conf里面的kvm参数删了,只把pve里面虚拟机的CPU类型改为host看看会怎么样。结果问题就解决了。此时在truenas的shell里面输入lscpu时,输出的CPU型号就是自己真正的物理机CPU型号了,truenas创建虚拟机也可以选择多线程了,这种奇奇怪怪的问题就是一个简单设置的问题。。。。

题外话:
网上的教程很多都是说用 egrep --color 'vmx|svm' /proc/cpuinfo 命令来查看有没有开启虚拟化,但实际上这个命令只是显示你的CPU支不支持虚拟化,并不能代表他真的能完全支持虚拟化。因为在本文的问题里面,你用参数把CPU虚拟成了kvm和你直接在pve里面选择host,在truenas里面用 egrep 命令,都会显示vmx的字样,这个并不清晰。
最后发现最简单的 lscpu 的命令倒是能很直观的看到问题,只有你虚拟化后还能看到真实的物理CPU型号,那基本上就不会报什么错了。
图片没来得及截,好像也不需要,有空再放吧。。。