2019-08-25

缘起

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

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

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

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

折腾过程

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

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

物理硬件ubuntu_serverkvm+qumu_libvirtwin10

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个方案:卸载集成核显的驱动,使用类似pci的方式加入虚拟机中

使用intel新的gvt显卡虚拟化技术,能够将宿主的显卡虚拟化为多个显卡到虚拟机

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设备idvirsh nodedev-list | grep pci

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

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

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

使用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 INSTALL_MOD_STRIP=1 modules_install && sudo make install

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

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

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

3、性能问题

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

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

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

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

方案1xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'

方案2:

4、j3455直通后的hdmi/vga视频输出

最近有在这篇博文下讨论关于直通后的物理hdmi接口视频输出的问题,经过一番折腾实现了这个功能,因此在此处记录下。

4.1 关于原理

由于本次直通的是j3455的核显,在直通后主板上的hdmi接口就失效了,可能跟驱动有很大的关系,因为和独显不一样。

如果要hdmi接口输出,就得配置一些intel核显的参数才行,本次主要就设置这些东西(intel的显卡相关的东西都非常的坑)

4.2 hdmi物理输出折腾过程

4.2.1 dump intel核显的bios

为什么要dump显卡bios呢?因为我们要在虚拟机里操作这个核显设备,直通时这个bios做了类似把显卡输出传递到hdmi接口这样的低级别的硬件操作,因此要做这个。

1、制作一个u盘的ubuntu18.04的安装镜像

这个网上教程非常多,不赘述了

2、设置bios里的csm支持 开机按快捷键(不同主板不一样,可以看开机屏幕提示)进入bios,在boot栏目中,选择csm支持,选择enable,然后下面的子项都选择legacy only;f10保存后退出

3、u盘启动,进入ubuntu18.04的live模式(试一试)

4、打开ubuntu live系统的命令行工具,输入如下命令行进行dumpsudo chmod 777 /sys/bus/pci/devices/0000:00/0000:00:02.0/rom

sudo echo 1 > /sys/bus/pci/devices/0000:00/0000:00:02.0/rom

sudo cat /sys/bus/pci/devices/0000:00/0000:00:02.0/rom > ~/vbios.rom

sudo echo 0 > /sys/bus/pci/devices/0000:00/0000:00:02.0/rom

5、记得把家目录的vbios.rom 拷贝到u盘里在重启电脑,不然重启就没了

6、正常启动电脑,使用rom-parser设置下vgarom编号./rom-parser ~/vbios.rom

# 8086这一步选择N,我们不修改这个

# 第二部选择Y,然后输入5a85,这个是和主板上显卡的编号,其他gpu的话自行查找,和下面vfio步骤里一样的

7、拷贝到系统认可的rom存放位置/usr/share/qemu/,这个是ubuntu上的apparmor安全限制,其他系统可能不需要。sudo cp ~/vbios.rom /usr/share/qemu/

4.2.2 设置一些vfio的设置项

1、设置grub,禁止使用显卡sudo vi /etc/default/grub

# 设置启动参数,增加iommu和efifb,如果有其他参数,我们往后追加就好,记得每个参数加空格

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on video=efifb:off,vesafb:off"

# vi保存退出

# 更新grub启动项

sudo update-grub

2、设置vfio modulesudo vi /etc/modules

# 增加如下几行

vfio

vfio_iommu_type1

vfio_pci

vfio_virqfd

3、设置显卡的黑名单

这一步的作用是设置黑名单,让系统启动时不加载显卡驱动,因为我们后面要把显卡给虚拟机的。sudo vi /etc/modprobe.d/blacklist.conf

# 增加如下几行

blacklist snd_hda_intel

blacklist snd_soc_skl

blacklist snd_hda_codec_hdmi

blacklist i915

# 如果echo不了,可以使用vi编辑

# 如果是其他gpu的话,可以lspci -n -s查看

sudo echo "options vfio-pci ids=8086:5a85,8086:5a98" > /etc/modprobe.d/vfio.conf

# 更新启动项参数

sudo update-initramfs -u

# 如果这一步提示少驱动,可以去qemu的仓库下载下

4、设置额外参数# 如果echo不了,可以使用vi编辑

echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf

echo "options kvm ignore_msrs=1" > /etc/modprobe.d/kvm.conf

5、重启电脑

4.2.3 设置libvirt虚拟机

使用virsh edit win10编辑虚拟机配置,有如下几个地方需要修改

1、修改直通显卡hostdev的配置(devices节点下面的),增加romfile的配置

注意:想要进入上文说的legacy模式(物理输出视频),必须设置显卡设备在虚拟机的02地址上,其他地址上不能物理输出视频。

2、增加igd的一些qemu参数

由于intel默认支持的是通过远程连接使用虚拟机的方式(按照前面接近一年的使用,这种方式非常稳定),我们需要额外的qemu设置才行,libvirt还不支持这种使用(可能是因为不稳定吧)。

1)在libvirt xml的第一行增加qemu的参数声明# 改成下面一行

2)增加qemu参数,在最后一行的上一行

4.2.4 运行虚拟机查看是否成功virsh start win10

如果不出意外的话,显示器上应该有视频输出了(我测试的hdmi接口),可以再直通键盘和鼠标进去操作。

4.3 hdmi视频输出直通的坑

上面也说了,libvirt以及intel默认支持的,都是物理hdmi接口不输出视频,远程访问的形式,也是我上一章的配置做的,总体上非常稳定。

但是我们这种legacy的使用方式,相当于从底层显卡bios,到视频物理hdmi输出,都从虚拟机饶了一圈,总体上很不稳定。

我经过测试,虚拟机内win10不同版本的系统、intel显卡驱动,都会影响直通的效果。

中途各种驱动版本上遇到绿屏错误,卡死错误,memory manage蓝屏崩溃等等问题,目前是进入系统前都可以,输入登录密码进入桌面时,必然是蓝屏崩溃,还没有解决。

5、总结

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

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

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

补充关于j3455直通hdmi显示的问题,感觉这块intel做的太辣鸡了,里边的坑实在是太多,我也不会进一步的折腾了,需求不强烈,且真的坑大~~~

看看下面这一大坨的参考资料,就知道这块的折腾是有多费劲,so Intel f**k you!!!

参考资源

j3455安装linux 4k驱动,nas-j3455kvm安装win10及集成显卡直通相关推荐

  1. j3455安装linux 4k驱动,J3455安装centos步骤

    J3455安装centos步骤 admin • 2021 年 May 月 Wed 日 备忘 去年开始折腾了一台J3455的NAS机,前前后后折腾了黑裙.ubuntu.win10系统.之前一直用cent ...

  2. freebsd安装linux网卡驱动,freebsd从安装到想要的状态配置

    1.前言 笔者出来工作多年,对属于unix分支的bsd系列freebsd的大名早有耳闻.今天终于下定决心去玩一下,发现与linux的细致还是有差异的,将常见的配置记录于此,供往后参阅. 2.系统的安装 ...

  3. sr650安装linux网卡驱动,Lenovo SR650安装Windows Server 2012之Solarflare驱动导致系统异常...

    Lenovo SR650安装Windows Server 2012,同时配置Solarflare万兆网卡,但当下载Solarflare安装完成Solarflare万兆网卡驱动后导致OS无法正常启动,同 ...

  4. thinkpad装linux无线网卡驱动,Thinkpad SL510 笔记本安装 Linux 无线网卡驱动

    在某些 Linux 发行版本中,没有包含一些笔记本的无线驱动程序,例如 Fedora,完成安装后不能自动驱动 Thinkpad SL510 笔记本的无线网卡. 要对网卡进行驱动,首先需要知道网卡的型号 ...

  5. 7080mt安装linux网卡驱动,Intel英特尔PRO100/1000/10GbE系列网卡驱动

    Intel英特尔PRO100/1000/10GbE系列网卡驱动17.3版For WinXP/2003-32/2003-64/Vista-32/Vista-64/Win7-32/Win7-64/Win8 ...

  6. linux mfc驱动下载,Ubuntu 安装 Brother MFC7470D 驱动

    Ubuntu 安装 Brother MFC7470D 驱动 办公室的打印机是 Brother MFC7470D ,在 Ubuntu 中安装打印机驱动时,发现没有这个型号的驱动.只有 MFC7450 的 ...

  7. Ubuntu 14.04 16.04 Linux nvidia 驱动下载与安装

    Ubuntu 14.04 16.04 nvidia 驱动安装 最简单直观的方式是在如下的对话框中直接选择驱动安装即可 但是有时候,驱动不够新,比如14.04用的是340.98版本,如果手动安装驱动可以 ...

  8. linux无线网卡驱动文件安装,linux无线网卡驱动安装

    环境  在笔记本里的虚拟机10.0版本,centos-6.5 无线网卡fast-fw300um 第一步要查看芯片  lsusb  当你得到芯片之后接下来查看内核,如果内核已经有芯片模块就不用再装了,如 ...

  9. x3650 m5U盘安装Linux,x3650 m5 u盘安装win10u盘驱动修复失败怎么办

    相关阅读:浏览器实用技巧 原因分析: 1.显卡驱动导致 windows7旗舰版 在此也非常感谢大家对脚本之家网站的支持! 在win7 xp系统怎么换成win7系统系统里面如何做目录的具体方法小编就给大 ...

最新文章

  1. java 网站转app_java – 将现有Web应用程序转换为桌面应用程序
  2. 2017年第八届蓝桥杯 - 省赛 - C/C++大学A组 - C. 魔方状态
  3. OSS音频编程概述(DSP部分)
  4. Scrapy框架的用法实例
  5. Java:Linux上java -jar xxx.jar命令执行jar包时出现Error: Invalid or corrupt jarfile xxx.jar解决方案
  6. jQuery EasyUI 简介
  7. 跟人合作人工智能,方案没有,钱又不出,这怎么合作?
  8. mysql互为主从有什么问题吗_mysql 互为主从复制常见问题
  9. 玩转基金(3)买卖基金
  10. 详解EtherCAT主站SOEM源码_eepromtool.c
  11. UltraEdit如何激活
  12. 以下内容被锁定不能编辑:mxh983 ph6527 zyt2538 zyt9276 zy2674 zyt4372 zyt8731 zyt2832求解
  13. SOP标准作业——让企业持续改善工作
  14. 台式计算机读不到u盘怎么回事,电脑读不出u盘怎么办
  15. 微信小游戏排行榜卡顿或无法滑动
  16. 哈工大csapp大作业程序人生
  17. word中统一修改mathtype公式和大小对应
  18. jQuery网格插件 ParamQuery
  19. cdn有几种加速方式
  20. 今日金融词汇---量化宽松

热门文章

  1. 高通ims架构android,深度揭密高通4/5G移动基带消息系统和状态机
  2. thinkadmin点击跳转页面的切换
  3. 监控他人摄像头,并发送图片到邮箱
  4. java basefont_itext 文本域 字体样式设置
  5. 阿里云牵手行业龙头香港快运航空,支持特区数字化升级
  6. laravel 实现微博第三方登陆
  7. c语言浮点数和0比较大小,C-浮点数为什么不能和0比较?
  8. ROS2 Humble测试版功能包列表
  9. Leetcode.43:(Python)给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
  10. CRC碰撞概率 与CRC校验长度的理解