玩底层虚拟系统,硬件直通是基操。简单来说,直通给虚拟机的硬件就像虚拟机系统直接安装到物理机上一样。UNRAID系统一个强大的地方就在于直通非常方便。
哎不是网上讲UNRAID直通的教程文章视频已经很多了么,为啥还要讲直通呢?这是因为老鱼在折腾UNRAID的直通时,踩过几个大坑,与其说是进阶避坑指南,不如说是踩坑血泪史!所以你们一定要看完这篇文章再去折腾UNRAID的硬件直通。
老鱼用的是当年的妖板华擎J4205-ITX安装UNRAID。说它是妖板并不是想赞美它有多么高的性价比,完全是因为这块板子有够坑的。最大的坑就在于说的是4 SATA3支持,但有两个SATA接口是 ASMedia ASM1061芯片转的,还有一巨坑就是IOMMU的BUG,老鱼后面再慢慢讲到这些坑有多大。
老鱼原来是用这块板子装的群晖,所以数据基本都被锁死在群晖系统里了,为了无痛迁移到UNRAID系统,直通硬盘肯定是最佳解决方案,但我们这一系列的文章既然叫UNRAID进阶避坑指南,那肯定不会只是讲简单的硬盘直通,这一回咱们一步到位直通硬盘控制器和网卡,将硬盘读写效率直接拉满。
最终,老鱼在华擎J4205上安装上了UNRAID系统,装了一个群晖虚拟机,将硬盘控制器和网卡直通给了群晖虚拟机,通过群晖的SMB、NFS服务和iSCSI服务使用群晖里的大容量硬盘空间和数据,让群晖安安静静的做一个数据仓库。
这么做带来的好处就是,将数据和文件完全交给群晖管理,什么下载啊,docker啊,虚拟机啊完全从群晖里剥离出来放在UNRAID上折腾,再也不用担心折腾影响到数据安全,而且UNRAID拥有更高的底层虚拟效率和更少的宿主系统消耗,是玩虚拟机和docker的首选。这里不得不再提一下油管eSir大佬做的各底层虚拟平台的测试,毫无疑问要玩底层虚拟的话,首选PVE、ESXi或者UNRAID。
老鱼这块板子只配了8G内存,原来装群晖的时候要独占8G内存,现在只用为群晖虚拟机分配1G内存,群晖依然跑得很稳,平时内存占用率基本不超过50%。还有一个更意外的收获就是,原来物理机装群晖系统,千兆内网的写入速度只有90M/s左右,现在居然可以稳定写入保持在110M/s,跑满千兆,老鱼分析这和我更换了数据硬盘的硬盘控制器有关,后面会讲到。
硬件直通原理
UNRAID的直通原理非常简单粗暴,简单来说,就是屏蔽硬件UNRAID不能使用,就可以直通给虚拟机使用。
为了实现完美的直通,首先要确认的是你的硬件是否支持IOMMU。IOMMU简单来说就是将虚拟内存地址映射为物理内存地址,让实体设备可以在虚拟的内存环境中工作。对于Intel芯片来说,就是必须要支持VT-D技术。怎么确认是否支持这些技术呢?首先是CPU参数,比如老鱼用的这块J4205板子,CPU是J4205,它是支持VT-D技术的,再来看看UNRAID系统,点击右上角的信息图标,
如果是显示支持硬件虚拟化和IOMMU的话,就表明是支持硬件直通的,如果没有就不要瞎折腾了。
直通硬件改造
敲黑板!这是很多同学按照硬盘直通教程去做但始终直通不了,或者即便直通成功,但群晖SMB共享读写没有速度,直接卡死的根本原因,也只有这一点做正确的了,才能保证虚拟机的群晖硬盘读写速率跟物理机一样,甚至更快!
刚才已经讲了华擎J4205-ITX这块板子妖就妖在有两个SATA口是ASMedia ASM1061芯片转出来的,如果你的主板SATA口有一部分是用芯片转的,就需要格外注意了!
仔细观察主板上的SATA接口编号,4个SATA口编号分别是sata1,sata2,sata-a1,sata-a2。从名字上就可以看出,通过ASMedia ASM1061芯片转出的两个SATA口编号是sata-a1,sata-a2。
划重点!如果要直通硬盘控制器给群晖
重点一:要直通给群晖的硬盘一定要接在原生的SATA口上,要不然就会出现群晖SMB共享读写没有速度或者直接卡死的问题。
重点二:要直通的硬盘要接在同一块硬盘控制器上,比如你要直通两块硬盘给群晖,要都接在原生的SATA口上,不要一块接在原生SATA口,一块接在转出来的SATA口,不然只能直通两个硬盘控制器给虚拟机,UNRAID就没得硬盘控制器可用了。
有同学会问,为啥要一定要把原生的SATA控制器直通给群晖?这就是折腾的血泪史了,经过老鱼多次试验(掉坑)发现,在华擎J4205-ITX这块板子上,原生SATA控制器的读写速度比ASMedia ASM1061芯片转出来SATA接口更快!这就是之前而为啥说可能直通硬盘控制器后的读写速度比物理机还要快的原因,老鱼的两块主力数据硬盘原来在物理机上就鬼使神差的接到了ASMedia ASM1061芯片转出来的SATA口,写入速度锁死在了90M/s上不去。
直通非原生SATA接口另一个诡异的问题就在于,SMB共享直接卡死,或者只有几KB的速度,但是登录DSM直接下载文件速度却又很快。老鱼在网上搜了下,出现这种问题的案例数还不少,但都找不到确切原因,老鱼也尝试过修改SMB协议版本,修改SMB配置参数等等,都没有用,最后换成原生SATA口,速度直接起飞。
当然这可能只是ASMedia ASM1061这块芯片的个别兼容性问题,也不排除其它主板接原生SATA接口反而速度更慢的情况,这里老鱼提出一个思路,如果出现莫名其妙的兼容性问题,请尝试更换直通给虚拟机的SATA控制器
硬盘直通VS硬盘控制器直通
我们先说一下原理以及两种方式的区别在哪儿。
我们已经知道要实现直通的大前提是CPU支持虚拟化技术,以及在UNRAID系统中屏蔽这个硬件设备。任何操作系统读写硬盘数据都要借助硬盘控制器,也就是我们前面说的SATA控制器来帮忙。SATA控制器是一个翻译和中转,把系统的读写指令翻译给硬盘执行,把写入和读取的数据做中转。
硬盘直通
直通硬盘的本质呢,相当于是UNRAID系统实际控制着硬盘资源,但UNRAID不用这块硬盘,将它挂载到虚拟机里。如果要直通某块硬盘,那就不能把硬盘添加到UNRAID的硬盘序列当中,
直接硬盘的好处是因为是宿主系统UNRAID管理硬盘资源,很稳定,基本不会出现SMB共享速度为0的这种情况,而且不用管硬盘是接到哪个SATA控制器上的,不用动硬件,可以跨硬盘控制器直通硬盘,使用灵活;
直通硬盘的坏处嘛,因为UNRAID管理硬盘,那肯定是有一定的资源消耗的,读写速度应该是没有直通硬盘控制器来得快,而且UNRAID系统资源不足时,有可能影响到硬盘读写速率,而且因为本质是挂载硬盘给虚拟机,可能影响某些高级的硬盘管理功能,比如休眠,S·M·A·R·T等。
硬盘控制器直通
直通硬盘控制器的本质相当于是虚拟机直接驱动硬盘控制器,跟物理机上安装一样。
直通硬盘控制器的好处是不依赖宿主系统,读写效率理论上应该是最高的,而且接到直通的硬盘控制器上的所有硬盘都会直通进虚拟机。因为虚拟机直接驱动硬盘控制器,可以实现如硬盘休眠这样的高级管理功能;
直通硬盘控制器的坏处就是要调整硬件。要直通的硬盘必须接到同一硬盘控制器上,有可能你直通的硬盘控制器有兼容性问题,那就整个翻车,读写任何一块硬盘都会很慢或者卡死,你得再换一个硬盘控制器。
所以,到底用哪种直通方案呢,得看个人需求。喜欢折腾,有性能洁癖的上硬盘控制器直通;喜欢稳的上硬盘直通。
硬盘直通已经有很多教程讲过了,大家可以搜搜阿文菌和司波图大佬的相关教程。老鱼接下来分享一下硬盘控制器的直通方法。
修复IOMMU BUG
J3455/J4205都有IOMMU分组的BUG。简单来说这个BUG让原本应该分开的硬件IOMMU分组绑到一起了,比如网卡和硬盘控制器分到同一个IOMMU分组了,就不能单独直通硬盘控制器或者单独直通网卡。
老鱼为J4205这块板子添加了一张Intel 82576 双口网卡,打算用来直通给群晖使用,在Tools->SysDevs中查看IOMMU分组,当时的分组情况就像这样
可以看到原生的SATA控制器分在了4组,而板载的螃蟹网卡、ASMedia的SATA控制器、Intel 82576网卡全部挤在了5组。那这就很难办了,要直通就只能把上面所有设备全部直通,一旦这样做了,就会出现一个隐藏巨坑,UNRAID系统就没有网卡可用了!连不上UNRAID系统!(别问我怎么知道的),大家要注意一下。
要修复这个BUG,就得打个补丁(补丁是蓝冰血魄制作,unRAID•RSG博客群•NAS群 江苏-biu 协助测试,感谢大佬,找不到补丁可以留意发)。打补丁就两步:
- 在settings->vm Manager ->PCIe ACS override:开启 Downstream,重启后在MAIN->FLASH->Uraid OS配置中看到pcie_acs_override=downstream就开启成功了
- 将补丁文件覆盖到UNRAID启动U盘根目录,重启UNRAID就可以了
打了补丁之后,可以看到IOMMU分组就正常多了
网卡和SATA控制器已经分开了,但是Intel 82576的IOMMU分组虽然正常了,但ID还是同一个,因为屏蔽硬件是通过ID来配置的,所以Intel 82576这张双口网卡只能要么直通给虚拟机用要么留给UNRAID。不过好在直通后,可以分给不同的虚拟机使用。
如果只选择一个网卡,要注意连接网线的那个口是不是直通给群晖虚拟机了,要不然群晖里没有网络接口。老鱼是两个网卡都给了群晖,但只有一个口接了网线,群晖下面就能看到两个网络接口,但只有一个生效。
网卡直通的好处是在大量网络数据交换的时候可以明显减少CPU的运算量,由网卡自己完成数据交换。缺点呢就是直通后要为这个网卡连接网线,像老鱼的设备就连接了两根网线,一根给UNRAID,一根给群晖,稍微有点麻烦。
开启硬盘控制器直通
老鱼两块大容量硬盘原来是一直用在群晖系统中存储数据的,而原生SATA控制器刚好就两个SATA口,所以老鱼的硬盘直通方案就是把原生的SATA控制器直通给群晖(说了这么多,就是觉得直通SATA控制器要比直通硬盘读写速度更快)。我们先按上面的讲的把IOMMU的分组BUG修复,然后在Tools->SysDevs找到要直通的原生SATA控制器和Intel 82576网卡的硬件ID,在我的设备上分别就是8086:10c9和8086:5ae3
进入MAIN->FLASH->Uraid OS编辑配置
- 备份一下原来的配置,因为是文本配置,直接复制到Notepad++里保存就可以了
- 修改配置如下(注意替换成你的直通硬件ID),保存重启,直通就完成了。kernel /bzimage
append vfio-pci.ids=8086:10c9,8086:5ae3 pcie_acs_override=downstream initrd=/bzroot
注意硬件ID不能写错!如果要直通网卡,要确认直通了之后还有别的网卡给UNRAID使用,要不然会进不了系统,比如我把Intel 82576网卡直通给虚拟机使用,把板载的螃蟹网卡留给UNRAID使用,需要提前连接一根网线到螃蟹网卡的网口上才能进入系统
重启UNRAID之后,进入虚拟机的配置页面,在其它PCI设备当中已经可以看到直通后的SATA控制器和网卡
确保要直通给虚拟机的硬盘已经接到原生的SATA口上,勾选SATA控制器和网卡,开启高级视图,在XML配置文件中删除系统自动配置的虚拟网卡(interface之间的部分,包含interface)保存,就可以完美的实现虚拟机群晖直通硬盘控制器和网卡了。进入群晖系统,硬盘和网卡一切正常,就跟物理上安装的一样。
小结
UNRAID上的硬件直通操作起来是非常简单的,只要明白了直通的原理。
老鱼有一个折腾心得分享给大家,在折腾的时候不要直接按着教程就开始操作,首先你要完全看完教程,要尝试理解其中的原理是什么,只有明白了原理,折腾起来就会得心应手。
在UNRAID上直通硬盘控制器和网卡给群晖,最终效果我还是非常满意的,压缩了群晖系统的资源占用,让群晖专职数据存储分享,腾出更多资源可以折腾其它的虚拟机或者docker,而且保障了数据的安全,不至于全体翻车。