nas-j3455kvm安装win10及集成显卡直通

缘起

之前的基于j3455搞的nas,物理机是win10系统,虚拟机ubuntu是基于hyper-v架构虚拟出来的。

然而运行一段时间后发现,win10系统总是会莫名其妙的重启,少则2天,多则一周必然会出现自动重启的问题。

网上查了些资料,有人说是显卡驱动的问题,我换了从15年到17年所有的驱动,无一例外,都会出现黑屏问题。

于是,狠下心来,反向部署了一套方案,用ubuntu来做物理机系统,kvm架构虚拟出win10来用,这样说不定还更稳定些。

折腾过程

1、新的系统以及虚拟化架构搭建

物理机我选择了ubuntu server 18.04.2,毕竟是长期支持版本,也更加稳定些。虚拟化架构我采用了qemu + kvm,虚拟机管理工具我选择了libvirt,于是,整体的架构如下:

物理硬件
ubuntu_server
kvm+qumu_libvirt
win10

ubuntu系统的安装这里就不说了,按照安装流程一步步走一下就行了。

关于虚拟化环境的搭建,主要的步骤如下:

1、开启bios里的intel虚拟化开关vt-d(j3455是支持硬件虚拟化的)

2、安装libvirt以及quemu等工具链 使用如下命令安装下虚拟化工具:

sudo apt-get install --no-install-recommends qemu-kvm qemu-utils libvirt-bin virtinst cpu-checker

然后输入kvm-ok即可验证环境是否是ok的

2、创建虚拟机并安装系统

使用virt-install安装系统,我的命令如下:

virt-install \
--name win10 \
--memory 4048 \
--vcpus sockets=1,cores=2,threads=2 \
--cdrom=/share_disk/e/cn_windows_10_multi-edition_version_1709_updated_sept_2017_x64_dvd_100090804.iso \
--os-variant=win8.1 \
--disk /home/loong/kvm/win10.qcow2,bus=virtio,size=50 \
--disk /share_disk/e/virtio-win_amd64_1.vfd,device=floppy \
--network bridge=br0,model=virtio \
--graphics vnc,password=Passw0rd,port=5910 \
--hvm \
--virt-type kvm

注意:
1、j3455由于不支持win7系统,如果虚拟机安装win10以下系统的话,显卡驱动会安装不上

2、win10系统不自带virt的io虚拟化驱动,需要自行下载virtio-win_amd64_1.vfd,这个可以在开源网站上找到

3、由于我们需要一个局域网的地址给到虚拟机,因此需要创建一个和物理机桥接的网卡,比如这里是br0

4、在命令行里安装虚拟机,由于没有显示界面,需要映射下vnc的端口,比如这里映射到本机

使用如下命令映射服务器的ip到本地

ssh -L 5910:127.0.0.1:5910 server_ip

然后使用vnc命令链接5910端口,即可看到系统安装界面,以后的系统启动后的显示也可以这样看到(当然也可以开启windows的远程桌面,这样更加方便)

vnc://127.0.0.1:5910

如上步骤,vnc链接到系统安装过程后,就是常规的系统安装操作了,安装完成后自动重启系统后进入桌面。

3、j3455显卡直通配置

由于j3455在intel cpu系列中属于非常低端的系列,平台也没有安装其他的显卡,直通显卡就显得非常的麻烦了,通用的pci直通显卡到虚拟机没有那么好操作。
好在j3455是intel超低功耗cpu中第一个支持vt-d虚拟化技术的,这样的话显卡直通成为可能。

经过网上N多教程的查找,发现对于intel的处理器的显卡直通,主要有2个方案:

3.1 使用类似pci的方式直通集成显卡

worthdoingbadly找到了一篇关于使用intel核显进行直通的文章,使用作者提供的脚本,实测能够正常卸载宿主机的显卡,然后我们可以通过libvirt的pci配置,增加到虚拟机中。

1、在机器开机bios中,开启intel vt-d硬件加速技术

这个网上查下就好,bios中都有关于vt-d的设置

2、在gurb开机选项中,增加iommu的配置,这个是用来控制硬件直通的

sudo vi /boot/grub/grub.conf
#在默认选项中增加 intel_iommu=on 选项, 保存后退出

# 生成新的开启启动项
sudo update-grub

# 重启机器sudo reboot

3、卸载已经加载的核显驱动

    # 下载执行脚本
    wget https://worthdoingbadly.com/assets/blog/gpupassthrough/prepareIntelGPUPassthrough.sh    
    # 执行核显卸载脚本
    sudo bash prepareIntelGPUPassthrough.sh

4、在libvirt中配置虚拟机使用核显

1) 找到核显的pci设备id

virsh nodedev-list | grep pci

可以从输入中找到显卡的设备相关id,主要有两个id字段,4位16进制的字符串

2) 然后使用sudo virsh edit win10进行虚拟机的编辑,这里的win10是我虚拟机的名称。

在devices节点下增加如下的配置,其中slot和funciton是从上面的pci设备信息中获取到的

<hostdev mode='subsystem' type='pci' managed='yes'><source>
    <address domain='0x0000' bus='0x00' slot='0x1a'         function='0x7'/></source></hostdev>

使用vi的wq方式保存退出即可生效。

5、开启虚拟机验证是否有intel的核显

sudo virsh start win10

可以进入windows系统后,安装标准的intel核显驱动,如果没问题的话,就可以正常使用windows核显了,性能像物理机一样。

3.1.1 pci直通的坑

1、j3455的核显驱动不支持win7系统,否则会出现能够安装驱动,但是重启后黄色问号不能用,错误码43

其实上面第一种方案已经可以正常直通显卡了,但是由于我第一次安装的是win7虚拟机系统,导致显卡驱动一直有问题。

如果安装win10系统,则可以正常安装使用核显的。

2、显卡卸载安装到虚拟机后,宿主的显示器黑屏

这个问题还没有处理,作为nas服务器使用暂时不影响使用,等以后再查查是什么问题吧

3.2 使用intel最新的gvt技术

这种方案intel在github上有详细的操作步骤,这里就不累述了,文档见intel_gvtd,其中关键点有下面几个:

1、需要使用最新的内核,ubuntu系统自带的4.15.x内核是不带这个功能的,可以按照教程步骤编译最新stable内核

echo ""|make oldconfig

make -j8 && sudo make modules_install && sudo make install

这里内核安装有个小坑,需要strip一下不必要的内核模块,否则内核镜像过大导致不能正常启动,见minial-kernel

2、qumu这一套,最好也使用最新版本的,否则会不配置导致问题

这个可以使用下面的脚本进行一键编译安装,非常方便。

https://github.com/doomedraven/Tools/blob/master/Virtualization/kvm-qemu.sh

3、性能问题

这种方案,是把宿主的显卡虚拟化成N个虚拟的GPU,在虚拟机中使用虚拟的显卡,性能非常的差,实测基本卡的不能用,且会出现显卡的贴图错误。

drm/i915: Resetting chip after gpu hang这个错误dmsg里非常多,此时虚拟机就没反应了,因为显卡挂了。

因此这种方案被废弃,不建议使用。

4、至于这种方案在libvirt的配置,有如下两种,实测第一种可以。

方案1

 xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'<hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='on'>
      <source>
        <address uuid='a297db4a-f4c2-11e6-90f6-d3b88d6c9525'/>
      </source>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
    </hostdev>

  <qemu:commandline>
    <qemu:arg value='-set'/>
    <qemu:arg value='device.hostdev0.x-igd-opregion=on'/>
    <qemu:arg value='-set'/>
    <qemu:arg value='device.hostdev0.ramfb=on'/>
    <qemu:arg value='-set'/>
    <qemu:arg value='device.hostdev0.driver=vfio-pci-nohotplug'/>
  </qemu:commandline>

方案2:

    <qemu:arg value='-device'/>
    <qemu:arg value='vfio-pci,sysfsdev=/sys/class/mdev_bus/0000:00:02.0/a297db4a-f4c2-11e6-90f6-d3b88d6c9525,rombar=0'/>
    <qemu:arg value='-nographic'/>
  </qemu:commandline>

4、总结

上面的折腾过程,看似没几步,其实是花了有好几个星期折腾的成果,过程中真的是非常的煎熬,哪哪都不能用。。。

最终的方案,就是第一种卸载后pci方式的挂载,效果非常好且运行非常的稳定,建议大家如果折腾的话采用这一种方案。

其余的,关于kvm虚拟化,可能就是折腾下图形化的管理界面以及虚拟机动态的内存伸缩控制了吧。这两个不是强需求,因为没有那么多的虚拟机需要管理,暂时就不折腾了,等有时间再搞吧。

参考资源

https://worthdoingbadly.com/gpupassthrough/

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/5/html/virtualization/chap-virtualization-pci_passthrough

https://serverfault.com/questions/633183/how-do-i-enable-kvm-device-passthrough-in-linux

https://tommy.net.cn/2017/01/06/install-windows-under-ubuntu-and-kvm/

https://scottlinux.com/2016/08/28/gpu-passthrough-with-kvm-and-debian-linux/

https://github.com/intel/gvt-linux/wiki/GVTd_Setup_Guide

https://askubuntu.com/questions/971126/17-10-netplan-config-with-bridge

https://blog.bepbep.co/posts/gvt/

https://unix.stackexchange.com/questions/270390/how-to-reduce-the-size-of-the-initrd-when-compiling-your-kernel

https://www.zcfy.cc/article/how-to-install-and-configure-kvm-on-ubuntu-18-04-lts-server

https://github.com/doomedraven/Tools/blob/master/Virtualization/kvm-qemu.sh


发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。