本帖最后由 jimmyUC 于 2021-6-6 11:27 编辑
本人刚刚开始玩黑Q, 扫荡论坛, 发现有关黑Q虚拟机的建立方法基本都是虚拟磁盘--IDE0 这样的思路来建。
然而这样的方法似乎不是真正好用的虚拟机黑Q, IDE 接口受限, 总共就2个总线, 可接主从两个设备, 一共就4个盘。
于是我就用手里已经建好的PVE 虚拟机服务器, 首先尝试了下直通磁盘至虚拟机的方式, 注意与正常实体黑Q机用牛年大礼包建立model.conf的要点我就不重复了, 大家可以自己在论坛教程里找到答案, 这里只谈PVE虚拟机建立:
PVE 版本 6.3.6 , 系统硬件是 ASUS Strix B250I 主板, CPU i3-8100T, 16G DDR4, machine type : Q35 (注意这个重要)!我的思路是, 建一个虚拟磁盘, 虚拟控制器是IDE0, 大小2G, 作为这个QNAP虚拟机的启动磁盘, 用一个早就组好的牛年大礼包U盘启动, 然后
qm set 105 --sata0 /dev/disk/by-id/ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E1YTKUK2
直通硬盘去虚拟机,
启动大礼包U盘, 进入tiny-core 10.1系统
嗯......立马碰到了问题,
从ls /dev/disk/by-path 和 lspci -vtnn的结果可以看出, 这个直通的硬盘被挂在了一个虚拟SATA控制器下,但PVE虚拟机程序把这个SATA 控制器加上其他Virtro设备比如网卡, Ballon 都放在了同一个PCI Bus bridge下, 所以Virto SATA Controller的总线地址就变成B0607:F0.我写QNAP model.conf的经验是[system disk X] 所在的dev bus 地址最好是B00:开头, 否则就难以被认出, 当然, 有大佬在关于黑qnap model里各种硬件写法的探讨(抛砖引玉) 一文中使用dev_bus_bridge 来指定 PCI bridge下的设定方法, PVE的虚拟机这种挂载方式更麻烦, 上图中是在PCI Bridge 00:1e:00后面 有06~09:00 4条总线, 而Virto SATA/Ballon/Virto net 都是挂在06:00 下面的第二层桥接, 我是完全不知道该怎么写
我的第一个解决办法是改machine type:分析目前的虚拟机结构, 不知道为啥PVE的Q35 机型中, IDE 硬盘实际是接在了Q35原生的SATA控制器上, 即图中PCI设备地址00:1F.2的那个SATA controller, 这造成我用by-id方式直通SATA磁盘需要KVM建立新的一个SATA控制器。 那么用比Q35更老的机型呢? 于是我把机型设到另一个芯片组型号i440fx, 重新进入TingCore 系统启动, 这下lspci 结果显示, i440fx 芯片组有一个IDE 控制器, 一个SATA控制器, 两个控制器都是i440fx 原生的设备地址: IDE 00:01.1 SATA 00:07.0
这就方便了, 直接在model.conf里写就好, IDE 盘用来启动, 所以我要在Boot Enclosure 写一下:- <blockquote>[Boot Enclosure]
复制代码
这样就可以直通多个SATA 实体硬盘, 摆脱IDE primary/secondary的讨厌限制, 基本发挥SATA 硬盘的速度了。 不过i440fx的构型,芯片组里没有PCIe port, 也就不支持PCIe, 只支持PCI模式设备访问, 如果在i440fx 下直通nvme SSD, 会成为一个PCI设备, 由于没有PCIe支持, nvme 不可用
第二个办法是干脆直通整个SATA 控制器:
顺便, 把一块NVMe也直通了
再次进入TinyCore 系统, 执行lspci, 可以看到一个200 Series PCH SATA Controller, 总线地址 01:00:0; 一个三星SM961/PM961 Nvme SSD, 总线02:00:0 如果我们继续 lspci -vtnn, 那么可以看到其实这两个设备都是挂在00:1C:0的虚拟机PCIe Bridge下, 直通的B250 SATA controller 在00:1C:0, 三星960Pro SSD在 00:1C:1 。 如果你仔细读过论坛文章 关于黑qnap model里各种硬件写法的探讨(抛砖引玉), 那么就应该知道System Disk部分该怎么写了。 我的model.conf里这部分的写法如下, 注意我还挂了一个100G的虚拟磁盘, 为了避免虚拟SATA 控制器不被model.conf认出的尴尬, 我挂的IDE, 设备地址是00:1F.2, 名称是SATA controller原因开头已经说过了。 这个我作为系统盘, 映射成了System Disk1, B250I 直通的SATA控制器, 映射成了System Disk2-5。 - [micxp_gzhmm]
- <div class="blockcode"><blockquote>[System Disk 1]
- DEV_BUS = B00:D31:F2
- DEV_PORT = 1
- [System Disk 2]
- DEV_BUS = B00:D28:F0
- DEV_PORT = 2
- [System Disk 3]
- DEV_BUS = B00:D28:F0
- DEV_PORT = 3
- [System Disk 4]
- DEV_BUS = B00:D28:F0
- DEV_PORT = 4
- [System Disk 5]
- DEV_BUS = B00:D28:F0
- DEV_PORT = 5
复制代码 还有System Disk 6, 是nvme SSD:
- [System Disk 6]
- DISK_FORM_TYPE = PD_FORM_M_2_PCIE
- BUS_TYPE = NVME
- DISK_DRV_TYPE = M_2
- DEV_BUS = B00:D28:F1
- DEV_PORT = 0
- PCI_SWITCH_PORT = 0
- SLOT_NAME = M.2 SSD 1
复制代码 [/micxp_gzhmm]
呵呵, 可能有人要问, 那么B0031:F2 这个控制器的DEV_PORT0 去哪里了? 呵呵, 还记得用来做启动盘的2G 虚拟磁盘吗? 也是映射成 IDE, 注意IDE总线作为老总线有Primary/Secondary 之分, PVE在虚拟磁盘映射成IDE时 , 规矩似乎是偶数号码和奇数号码不能同时映射, 所以我把2G 启动盘映射到IDE0, 100G QNAP 系统盘映射到IDE2. 但是, 这里有个很晕的"但是", PVE 虚拟机在把IDE 硬盘在Q35 type 实现时 , 挂到了ICH9 SATA controller上, 即上图的B0031:F2, SATA 控制器没有什么Primary/Secondary的限制, 所以, IDE2 变成了SATA1......嗯 , 有点绕。所以理论上用磁盘直通的方式, qm set 105 --IDE2 /dev/disk/by-id/ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E1YTKUK2 这样的命令, 也可以挂载整个硬盘, 只是我不喜欢这么用而已。绕回来, 既然2G 的IDE0 只是来启动, 不用写成SystemDisk, 只在Boot Enclosure 内指定就好, 这样这个盘在QTS 里不可见, 可以避免误操作破坏启动盘。 代码如下
- [Boot Enclosure]
- VENDOR = QNAP
- MODEL = BOOT
- MAX_DISK_NUM = 1
- DISK_DRV_TYPE = ATA
- [Boot Disk 1]
- DEV_BUS = B00:D31:F2
- DEV_PORT = 0
复制代码
所以最后在整个PVE VM的Hardware 部分, 我的设定如下图, 整个主板SATA控制器都直通到QNAP虚拟机的好处是很多的, QTS里可以直接看到硬盘的温度,寿命等SMART信息; 硬盘可以在QTS里按QTS的规则休眠唤醒(qm set 命令方式直通单个磁盘做不到);整个磁盘组的速度也比用虚拟磁盘快, 这对我这样用万兆网卡搭建了局域网的还是很有用的
似乎不放隐藏, 连看的人都没有
|