关于自建虚拟机下NAS的硬盘直通,你姿势对了吗?
桃花坞自主的聆曦
2023年12月07日 13:34
收录于文集
共2篇

其实网上大多数关于自己组装的NAS教程只是教会你如何使用,或者怎么用起来,从来不告诉你硬盘安全以及硬盘休眠和硬盘意外断电(这里的意外断电指的是关机重启等操作,而非没有ups的意外断电)等带来的硬盘数据丢失或者损坏的问题!

  自己组装的NAS,不管安装哪家的NAS系统,一般都是建议宿主机直装这个NAS系统,就和我们买回来的电脑一样,直接底层就安装windows系统使用即可,能保证用其所有与硬件相关的功能;如果你和我一样,组装NAS的硬件配置还可以,想宿主机使用pve和esxi这样的系统作为底层,然后用虚拟机去做NAS系统,这样可以分配更多的虚拟机,虚拟机拓展更多可用的独立东西,比如再虚拟机一个Linux系统,搭建网站环境小程序环境以及docker啥的等,相互之间又不干扰,而且还能充分利用硬件的性能,那么你的NAS系统就要注意了,一定要保证硬盘的安全,要不然每次只要底层系统开机,你的硬盘随之而启动,关机的时候硬盘可能就是一瞬间直接断电,对于阵列来说,这是一件很危险的事情,对于使用NAS作为生产力的伙伴们来说,比如在线剪辑,存大量素材,这是一件更危险的事情,可能会导致前面的工作都灰飞烟灭。

所以这里提出一个概念,就是虚拟机的硬盘直通,那硬盘直通一般分为两种,至于非直通的映射方式,就不提了太影响硬盘I/O性能了;这里以pve作为底层系统,虚拟机装TrueNAS来演示:

直通方法一:单盘直通(除了软路由,NAS不推荐)

输入命令:ls -l /dev/disk/by-id/,列出PVE系统下所有的磁盘存储设备并查看磁盘ID序列号。

使用qm命令把硬盘按块数一个一个直通给虚拟机TrueNAS系统,例如:

qm set 100 --SATA1 /dev/disk/by-id/ata-HGST_HUS728T8TALE6L4_VR2LG97K

 这样直通的好处,随便玩玩,只有一两块硬盘,并不用于大储存的生产力;

这样直通的坏处,硬盘还是在宿主机pve下控制的,关闭虚拟机trueNAS,也只是让硬盘休眠,不会让硬盘断电,关闭pve系统的时候,硬盘依然有意外断电的情况,当你启动PVE的时候,硬盘也随之而启动,假设你要不断地重启调试PVE系统,那硬盘就跟着一起启动断电,总之,这样很危险。

 

直通方法二:直通 SATA Controller(SATA 控制器)(强烈推荐,前提是你主板和CPU支持)

这个就上升一个难度了,需要确定自己的主板和CPU是否支持Vt-d功能,注意VT-D是io虚拟化,不是VT-X,这里很多人容易混淆,有很多新手,以为主板开启虚拟化功能,就能直通,并不是这样的,需要开启vt-d才能io虚拟化。AMD平台是iommu,某些OEM主板上叫SRIOV。

这样直通的好处,硬盘可以休眠,检测硬盘健康度等,充分利用NAS系统优势;再就是虚拟机关机时,硬盘是彻底断电,并非休眠。省电的同时,节省机械硬盘的寿命和保护硬盘,假设需要一直重启调试PVE系统,那么不开NAS的虚拟机,硬盘是完全不会启动的,完全不影响硬盘;

这样直通坏处就是,当宿主机是SATA固态时,直接直通SATA controller,会导致宿主机不能开机,有时候你的SATA控制器和其他设备在IOMMU的同一分组里面,直通SATA控制器后,会导致同组的设备也不能在宿主机下使用,所以这时候你只能通过上面描述的直通方法一来直通了,当然还有一种方法,就是IOMMU拆分,这个涉及到内核构建,难度相当大;所以建议新手小白使用直通方法一,入门进阶的以及生产力为主的伙伴使用直通方法二。

 至于哪些CPU主板支持什么样的功能,PCI与CPU直连的还是走南桥芯片组的,SATA控制器独立的还是啥样的,总线多少条通道啥的,都需要一定的硬件基础知识积累,然后去产品对应的官网就可以看明白,这里就不过多的叙述了,下面简单写一下IOMMU分组与直通方法二的步骤,同时附一些对比图:

1.  使用lspci -vv命令,查询pci设备是否可以直接支持IOMMU分组,如果设备信息中支持ACS(Access Control Services),便可直接通过设置开启IOMMU分组。若不支持ACS,需要更新内核,关闭ACS检查,开启IOMMU分组。

2.  使用vi /etc/modules打开,然后键入:

vfio

vfio_iommu_type1

vfio_pci

vfio_virqfd

3.  使用vi /etc/default/grub编辑/etc/default/grub文件:

找到GRUB_CMDLINE_LINUX_DEFAULT="quiet ",修改为:

GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on pcie_acs_override=downstream,multifunction"

Intel的CPU就改成:

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on pcie_acs_override=downstream,multifunction"

4.  使用update-grub和update-initramfs -u -k all更新grub引导以及ramfs;

5.  如若正常,所有设备均有独立IOMMU Group 编号,重启后使用dmesg | grep iommu命令查看,如下图;

附图:

再放一张core与scale的对比图吧!