
遇到“ubuntu17.04 UHD 驱动出错”这种问题我一度也以为是自己把系统装坏了。后来认真排查下来才明白这个组合背后不只是驱动坏了那么简单而是发行版内核、显卡硬件代次、显示协议、甚至转接头EDID信息在同时捣乱。先说结论如果你手头是Intel UHD Graphics 620或630这类新核显又偏偏装了Ubuntu 17.04那开机黑屏、分辨率只有1024x768、画面撕裂花屏都属于正常翻车。问题从根上说出在Ubuntu 17.04自带的Linux 4.10内核远比你手上这颗核显年纪小它压根不知道该怎么跟UHD 620/630打招呼。这篇文章我会把这套问题从头到尾拆开讲清楚适合所有在旧版本Ubuntu上折腾新硬件的朋友也适合刚接触Linux驱动排查、想搞明白显卡驱动到底是怎么工作的的人。1. 先冷静你的UHD驱动问题到底属于哪一级1.1 先搞清楚Linux里Intel核显根本没有驱动安装包很多人一提到显卡驱动第一反应是去Intel官网下载一个.run或者.deb文件像Windows那样双击安装。这是一个非常根深蒂固的误解。在Linux下Intel核显的驱动主体是一个叫i915的内核模块它早就编译在你的内核里面了。当你开机时内核检测到PCI设备列表里有一个Vendor ID是Intel、Class是VGA Controller的设备就会自动加载i915这个模块来接管它。所以你在Linux下装Intel核显驱动本质上不是在装驱动而是在升级内核或者打补丁。Intel GPU的用户态支持则藏在Mesa、xserver-xorg-video-intel这些包里面负责把OpenGL/Vulkan指令翻译成GPU能执行的命令。这部分在Ubuntu 17.04的官方源里也有但版本老对新GPU的支持同样捉襟见肘。所以整个链条是这样的内核i915驱动负责让GPU能工作Mesa负责让图形应用能跑起来内核如果认不出你的显卡后面的一切都是空谈。1.2 一张速查表对号入座你的故障表现驱动出错这四个字太笼统了实际遇到的症状可能五花八门。我把最常见的情况整理了一下你可以照着先对号入座现象表现常见原因排查优先级开机紫屏/黑屏键盘灯亮但屏幕没反应内核i915加载后未能正确初始化显示输出高查dmesg日志、加nomodeset参数能进系统但分辨率锁死在1024x768或更低显示输出没被正确识别多半和EDID读取有关也可能是驱动没有真正接管GPU高看xrandr输出查Xorg日志画面闪烁、撕裂鼠标拖影驱动加载了但Mesa/合成器与GPU配合不佳或者内核模块版本过旧中查驱动是否用了llvmpipe软渲染开机卡在logo转圈之后无限循环登录混合显卡机器上i915与nouveau/nvidia模块相互抢设备中检查lsmod里模块加载情况能进桌面但浏览器/视频硬解全部CPU占用飙升GPU加速没有真正开启渲染走了软件回退低用glxinfo检查OpenGL渲染器名称如果你只是轻度症状比如分辨率低、界面卡顿后面用升级内核的办法能妥善解决。如果你已经黑屏进不了系统那就得先想办法进TTY或者用恢复模式把问题一步步拆开。2. 为什么Ubuntu 17.04这种组合特别容易翻车2.1 内核4.10与UHD 620/630的时间差Ubuntu 17.04是2017年4月发布的自带的Linux内核是4.10。而Intel UHD Graphics 620这颗核显是2017年下半年随着第八代酷睿Kaby Lake Refresh笔记本才开始大规模出现在市场上的。更晚的UHD 630则要等到Coffee Lake桌面平台。一个发布在上半年、一个硬件下半年才上市Ubuntu 17.04的内核里根本没有准备识别这些新设备的PCI ID也没有对应的初始化代码自然就没法让它们正常工作。Linux内核要支持一款新显卡远远不是加一段代码那么简单。Intel在发布新GPU之前会提前把硬件规范和初始代码片段提交给内核社区经过多个版本迭代测试才会逐渐趋于稳定。UHD 620/630真正达到开箱即用的程度大致要到内核4.15、4.16之后。所以即便你给17.04手动换一个最新内核也最好在4.15以上才谈得上顺滑。2.2 核显独显双显卡机器上的隐藏雷区如果机器同时还有一块NVIDIA或AMD独立显卡那情况会更复杂。Linux下的双显卡切换工具比如NVIDIA的Prime、Bumblebee它们的原理是在核显和独显之间来回切换显示输出。17.04时代这些工具的配置已经很成熟但前提是它能认识你的核显。一旦i915没能正确初始化整个切换链路都会出问题表现可能是开机直接黑屏、登录界面循环、或者切到NVIDIA之后外接显示器没信号。更坑的是NVIDIA闭源驱动的内核模块nvidia.ko和具体内核版本是严格绑定的。你在Ubuntu 17.04的软件源里装nvidia-381这类驱动包它们针对的是4.10内核编译的如果你后来手动升级了内核原来的NVIDIA驱动模块就会加载失败图形界面直接起不来。这个问题我会在后面的实操部分详细讲。2.3 别把型号新和支持新混为一谈很多朋友看到lspci输出显示Intel Corporation UHD Graphics 620就以为系统已经识别了这颗显卡问题只出在驱动版本不够新。其实PCI设备识别和你是否能用上它是两码事。lspci能读出设备的Vendor ID和Device ID哪怕内核完全没有对应驱动它也会把这串信息打印出来。真正判断内核是否认识这颗GPU要看i915模块有没有主动绑定它。这时你就得去查/sys/bus/pci/devices/下面对应的设备目录看看里面有哪个驱动符号链接指向了i915。如果内核里根本没有这个PCI ID的资源表i915即便加载了也不会去碰这颗显卡。这种认得出、管不了的状态比完全认不出更容易让人误判也是很多人折腾半天找不到方向的原因。3. 开一张问诊单完整排查流程3.1 第一步确认硬件有没有被系统看到不管症状是黑屏还是低分辨率我建议你都从硬件识别开始查。打开终端如果图形界面进不去就按CtrlAltF3切到纯命令行TTY登录依次执行下面几条命令# 查看显卡PCI设备及已绑定的内核驱动 lspci -nnk | grep -iA3 vga # 查看i915模块有没有被加载 lsmod | grep i915 # 查看当前使用的显卡驱动和渲染器 glxinfo | grep -iE openGL renderer|OpenGL version第一眼先看lspci的输出。如果里面出现了Kernel driver in use: i915说明i915已经接管了显卡这时候还黑屏问题多半出在用户态、显示管理器或者分辨率设置上。如果显示Kernel modules: i915但Kernel driver in use是空白甚至整行都找不到i915字样那就说明内核压根没让i915去管这颗GPU。glxinfo这个命令需要安装mesa-utils才能用。如果系统走的软件渲染输出会显示llvmpipe而不是Mesa Intel(R) UHD Graphics这也是一个非常关键的判断依据。3.2 第二步盯住内核日志这里才有真正的报错很多人在图形界面看到黑屏第一反应是去翻显示器设置其实真正的答案在系统日志里。Ubuntu 17.04用的是systemd可以用journalctl查内核日志也可以用传统命令查看# 只过滤i915相关的日志 journalctl -b -k | grep -i i915 # 看有没有明显的内核报错 dmesg | grep -iE error|fail|firmware # 如果进不了图形但这台机器还留着Xorg日志 cat /var/log/Xorg.0.log | grep -iE \(EE\)|\(WW\)|i915有一次我在一台Kaby Lake机器上调试dmesg | grep i915只输出了一堆Direct firmware load for i915/xxx_dmc_ver1_04.bin failed。这其实是显卡固件缺失会导致某些电源管理特性失效但还不至于完全黑屏。更致命的报错是[drm:xxx] ERROR比如[drm:gen9_dc_state_verification] ERROR DC state mismatch这在老内核配新核显时很常见说明硬件状态已经到了内核预期之外的地方。3.3 第三步判断加载了但没生效的几种表现有时候lsmod明明显示i915已经加载lspci也说驱动正在使用中可系统分辨率就是上不去。这种情况多半是驱动加载成功了但没能真正初始化某个显示接口或者显示器没有把EDID信息正确反馈回来。你可以看看/sys/class/drm/下面有哪些设备ls /sys/class/drm/正常会有card0-DP-1、card0-HDMI-A-1或card0-eDP-1这类条目。如果接口列表不完整比如外接显示器的DP口没列出来那就要怀疑是不是接口本身的探测出了问题。此时xrandr输出也会很诚实xrandr如果屏幕列表里只有VGA-1或没有外接显示器的名字那基本可以判定是显示输出链路上的问题不一定是显卡驱动核心坏了。4. 对症下药三种程度不同的修复路径4.1 应急先用启动参数把系统弄亮如果你现在已经黑屏进不了图形界面最稳妥的第一步不是立刻升级内核而是先给内核加一个nomodeset参数让系统暂时不加载显卡驱动KMS功能用最基础的显示模式把桌面拉起来。操作方法是重启在GRUB菜单出现时按e进入编辑模式找到以linux开头的那一行在末尾加上nomodeset然后按CtrlX启动。如果这样能进系统说明确实是i915初始化的问题而不是硬件损坏。之后把参数永久写进GRUB配置sudo sed -i s/GRUB_CMDLINE_LINUX_DEFAULTquiet splash/GRUB_CMDLINE_LINUX_DEFAULTquiet splash nomodeset/ /etc/default/grub sudo update-grub注意nomodeset只是应急手段它会禁用内核的显示模式设置系统会回到比较老的VESA兼容模式分辨率一般也上不去GPU加速更谈不上。它的作用就是让你能看清问题、抢救数据、或者完成后续的内核升级操作不是一个长期可用状态。4.2 治本升级内核而不是满世界找Intel官方驱动前面说了UHD 620/630需要的内核支持要到4.15以后才完善所以治本方案只有一个升级内核。这里有个很多人没想明白的关键点升级内核不会改变你的Ubuntu发行版版本17.04升级内核之后依然是17.04只是运行的内核变了而已。我推荐两种途径。第一种是用Ubuntu硬件支持栈HWE仓库sudo apt update sudo apt install linux-generic-hwe-17.04这条命令会把内核升级到4.13系列。注意4.13对UHD 620的支持也只是刚开始很多设备ID还需要手动加i915.force_probe参数才能被强制识别。第二种途径是直接上Ubuntu主线内核构建页Mainline Kernels下载4.15或4.16版本的linux-image、linux-modules、linux-headers三个deb包然后用sudo dpkg -i *.deb安装重启后从GRUB的高级选项里选择新内核启动。主线内核的来源虽然不是Ubuntu官方仓库但却是Ubuntu内核团队自己维护的构建站点可信度远高于各种第三方PPA。装完之后记得执行sudo update-grub如果你之前装过NVIDIA官方驱动大概率还要重新装一次NVIDIA模块这个坑稍后细说。4.3 特殊情况双显卡机器怎么选驱动、怎么切如果你这台机器是核显加NVIDIA独显的双显卡配置升级内核之后还有一个绕不开的问题独显驱动怎么处理。如果独显比较老直接用系统仓库里的NVIDIA驱动就可以但版本要和你当前内核匹配。Ubuntu 17.04时代仓库里的NVIDIA包一般都会针对当前启用内核编译好升级内核后需要用sudo apt-get install --reinstall nvidia-driver-XXX这类操作重新触发模块编译。如果独显比较新仓库里找不到合适版本那得去NVIDIA官网下载.run安装包。这里我必须提醒一句官网安装包装完是一定要重新编译内核模块的而且它和你系统里的Xorg版本、GCC版本都有强弱依赖稍有不慎就会陷入登录循环。我建议这种机器优先考虑升级到更新版本的Ubuntu而不是在17.04上硬扛。切换逻辑上NVIDIA Prime工具在17.04里的用法是sudo prime-select nvidia sudo prime-select intel切换到NVIDIA模式后一般需要注销重新登录。如果切换后黑屏大概率是当前NVIDIA驱动和内核不匹配回到nomodeset应急模式重装驱动即可。5. 复盘那些我交过的学费与必知避坑细节5.1 亲手把Intel官方驱动装坏的经历有段时间我也执迷于官方驱动在17.04上尝试安装Intel Graphics Installer结果系统直接起不来连TTY都进不去。后来查资料才发现Intel官方的图形驱动安装器只面向特定的Ubuntu LTS版本折腾17.04这种短期版本根本不在支持列表里。就算你从第三方源强行装上也会因为Xorg ABI版本不匹配而崩掉。从那以后我养成一个习惯凡是Intel核显先看一眼内核版本再决定动不动用户态驱动。老的xserver-xorg-video-intel包甚至在某些新内核上会有反效果卸掉它让内核走modesetting反而更稳定。在Linux下不装驱动往往就是最好的驱动。5.2 分辨率上不去真凶却是线材和转换头有一次我把DP线接上外接4K显示器怎么调分辨率都只有1920x1080怀疑驱动有问题折腾了大半天。后来换了一根DP线分辨率立刻正常。问题出在劣质线缆和转接头没有完整传输EDID信息。显示器通过EDID告诉显卡我能支持哪些分辨率如果线材的DDC通道不通显卡就只知道一个非常保守的底线分辨率。排查这类问题有个小技巧在终端看xrandr --verbose如果输出里连显示器的型号字符串都是乱码或者空的基本可以断定EDID读取失败。换线、换转接口、或者直接把显示器接到别的接口上测一下比重新编译驱动快得多。5.3 升级内核后的下半场DKMS与第三方模块升级内核不是重启就完事了还需要检查一堆依赖内核版本的第三方模块。Ubuntu有个机制叫DKMS它能在内核升级后自动把第三方模块重新编译一遍。比如VirtualBox、ZFS、某些USB串口驱动包比如厂商提供的特定CH340/CP210x驱动、ST-Link/J-Link调试器驱动如果它们用DKMS机制注册过内核升级后会自动重编不需要你手动操作。你可以用这条命令查看待处理的状态dkms status如果某个模块显示installed但对应内核版本和你当前不一致问题就藏在里面。有一次我升级内核之后发现VirtualBox虚拟机全打不开了就是这个原因执行sudo dkms autoinstall就恢复了。NVIDIA驱动如果没有走DKMS而是用官网安装包装的升级内核后它不会自动重编需要重跑一遍安装脚本这也是很多人升级内核就黑屏的常见幕后黑手。5.4 给同样想折腾老版本系统的你一条路线建议如果你看到这篇文章时电脑上还装着Ubuntu 17.04而且机器本身不算太老旧我的建议很直白把系统升级到18.04或之后的LTS版本用官方仓库自带的HWE内核会省下大把时间。17.04早就结束支持了官方源都已经被迁移到old-releases继续用它来当主力系统安全和软件源两方面都会很痛苦。如果因为特殊原因必须留在17.04比如在跑某个老工程环境、或者只是想拿它做内核编译练习那就按本文第4节的思路升级内核到4.15并且把i915相关固件包补齐。就算这样系统整体体验也谈不上完美比较适合能开机、能干活的底线需求。最后再分享一个小经验遇到显卡问题别一上来就重装系统。Linux下几乎每个硬件问题都能通过日志找到端倪先把dmesg和Xorg日志存下来再决定下一步动作。很多时候你以为的驱动问题其实是线材、电源管理、或者固件缺失在捣乱。当年我在那台UHD显卡机器上踩过的坑一半以上和驱动本身无关。保持耐心一层层查下去你才能真正搞懂Linux图形栈的工作方式这对以后的排障帮助极大。