
如果你正在 Ubuntu 20.04.1 系统上被鼠标闪烁和移动时不停抖动折磨这篇东西应该能帮你省下不少折腾时间。先说清楚这个问题不是个例尤其是 20.04.1 这个版本显卡驱动、桌面合成器、USB 电源管理都会引发光标重绘异常和指针抖动而且经常是几个因素叠加在一起出现。这篇文章我会按从外到内、从软到硬的顺序把排查思路、具体命令、配置调整方案都写出来适合刚接触 Linux 的新手也适合已经折腾半天但没找到方向的老人。1. 先别急着换鼠标搞清楚问题到底出在哪1.1 这类问题通常不是鼠标坏了很多朋友第一次遇到这个情况第一反应就是把鼠标换到另一台电脑上试或者直接下单买新的。但以我的经验Ubuntu 20.04.1 里出现的光标闪烁和抖动绝大多数都不是鼠标硬件本身的问题而是软件栈里面某个环节工作不正常导致的。具体来说光标闪烁通常表现为指针自己一亮一灭、重绘残留或者桌面上出现不规则的色块拖影这种问题大部分出在显卡驱动和桌面合成器的配合上。GNOME 桌面环境默认开启了不少动画和半透明效果合成器需要持续对画面做 GPU 重绘一旦驱动有问题鼠标指针区域就会跟着遭殃。而移动时抖动则更复杂一些可能是输入设备被另一个设备干扰、鼠标回报率过高导致中断频繁、USB 口供电不稳定甚至是系统把接收器的睡眠和唤醒逻辑搞乱了。比较麻烦的是这两种症状往往同时出现。因为无论是重绘异常还是输入采样异常最终都汇聚到同一个图形输入栈上。所以排查时要有一个全局视角不要只盯着换驱动或换鼠标这两个选项。1.2 用三分钟快速定位当前会话与显卡环境在动手改配置之前我建议你先执行下面三个命令把基础环境信息捞出来。这就像看病先测体温一样后面所有操作都要基于这些信息来判断。echo $XDG_SESSION_TYPE lspci | grep -i vga ubuntu-drivers devices第一个命令会输出x11或wayland告诉你当前登录会话用的是哪个显示协议。Ubuntu 20.04 默认登录的是 Xorgx11但桌面环境通常也提供了 Wayland 会话入口这两个会话下的问题的表现和处理方式是不一样的后面我会专门讲切换。第二个命令能看出当前机器在用哪家的显卡是 Intel、NVIDIA 还是 AMD。第三个命令是针对 Ubuntu 系统查询推荐的显卡驱动版本特别是有 NVIDIA 独显的机器这一步基本能看到系统建议装什么版本。如果你手头正好有 U 盘我强烈建议你刻录一个 Ubuntu 20.04 的 Live USB用它的默认环境测试一下鼠标是否还会闪、还会抖。Live 环境跑的是系统自带的开源驱动和默认配置如果在 Live 环境里鼠标表现完全正常那基本上可以断定是当前系统里的驱动、配置或某个服务出了问题如果在 Live 环境里一样抖那才需要把怀疑对象放到鼠标硬件、接收器或者周围的电磁干扰上。这个测试的成本最低也最能切分问题范围。2. 从外到内做一轮排查外设、接口、系统日志2.1 外设与接口层面的验证系统层面稍后再说先把硬件层面能排除的排除掉。我自己的操作顺序是这样的找一个没有任何干扰的桌面把鼠标换个 USB 口插最好是机箱后面板的主板直出 USB 2.0 口而不是 USB 3.0 口。因为很多 2.4GHz 无线鼠标接收器对 USB 3.0 接口产生的电磁干扰非常敏感插在 USB 3.0 旁边会出现随机断连、光标飘移、抖动这些奇怪现象。这个不是我编的USB 3.0 的信号频率和 2.4G 频段确实会互相干扰很多外设厂商的 FAQ 里也明确写了这条。如果你的鼠标是有线游戏鼠标回报率往往默认设置在 500Hz 甚至 1000Hz。这个频率在 Windows 下没问题但在 Linux 上高回报率意味着 USB 中断请求频率很高如果系统没有做相应优化CPU 调度不过来鼠标移动时反而会出现卡顿、抖动看起来像是在被什么东西拽着走。遇到这种情况你可以试试把回报率降到 500Hz 或 250Hz。部分鼠标需要在 Windows 下用厂商驱动或者网页版驱动调整后才会被记住调整完再插回 Ubuntu 就行。还有那种带 OLED 屏或者灯效的鼠标固件里的灯控逻辑偶尔也会影响 Windows 兼容但在 Linux 下遇到的不多知道有这么回事就行。另外一个大坑是内置触控板和外接 USB 鼠标共存。很多笔记本用户会外接鼠标但触控板仍然处于可用状态当你手指或者掌根不小心碰到触控板时光标就会突然跳动一下表现为移动时抖动或多处跳动。这个其实不算系统故障但在排查时很容易被误判。可以先在系统设置里的鼠标与触摸板中把触控板临时禁用或者干脆用 Fn 快捷键关掉触控板再观察是否恢复正常。2.2 用系统日志找实锤如果外设层面都试过还是老样子那就该看日志了。Linux 的好处是几乎所有底层事件都会在dmesg和journalctl里留下记录。先执行sudo dmesg | grep -i -E error|fail|usb|drm|nvidia|amdgpu我一般会加-i忽略大小写然后重点看有没有这样几类内容USB 设备反复 disconnect/enumerate、NVIDIA 的GPU fallen off the bus、DRM 相关的page flip timeout。一次两次重连可能只是优盘插拔但如果不断出现基本可以确定是 USB 电源管理或驱动层面的问题。如果问题是间歇性的普通dmesg看不到就打开终端挂一个实时追踪sudo watch -n 1 dmesg --tail然后在另一个窗口里正常移动鼠标、点击、折腾桌面回来盯着日志的输出。闪烁和抖动发生时如果正好有新的内核消息弹出来那基本就是实锤了。比如我之前在一台笔记本上排查时发现每次光标抖动的瞬间dmesg里都会出现一行usb 1-2: reset full-speed USB device number 9 using xhci_hcd这个就是典型的 USB 设备在运行中被重置了多半是电源管理策略导致的。再配合journalctl --since today | grep -i -E error|fail|usb|drm看用户态和桌面环境相关的报错。这一步不用追求完全看懂每一条日志重点是看事件是否与鼠标抖动发生的时间点吻合。如果每次抖动都有日志事件对应说明问题出在系统底层继续往下看解决方案如果日志干干净净那反而更可能是硬件或电磁干扰回到前面的外设排查去。3. 对症下药显卡驱动与桌面合成器调优3.1 NVIDIA 闭源驱动和 GNOME 合成器的兼容性处理Ubuntu 20.04.1 上最常见的光标闪烁根源是 NVIDIA 闭源驱动和 GNOME 桌面环境之间的兼容性问题。尤其是 20.04 刚发布那阵默认推荐的 NVIDIA 450 系列驱动在 GNOME 3.36 上经常出现光标区域重绘异常表现为指针旁边出现黑色方块、亮块或者光标本身闪烁不定。这个问题的原理其实很简单GNOME 的合成器使用 OpenGL 做画面合成NVIDIA 闭源驱动对 OpenGL 的支持虽然比开源驱动好但在特定版本组合下光标平面和合成缓冲区的同步会出问题表现为闪烁和残影。第一步先搞清楚当前装的哪版驱动nvidia-smi这个命令会显示驱动版本、 CUDA 版本和显卡型号。如果驱动版本比较旧比如 450 或 470 初版先试试升级到该系列最新的分支或者干脆换成 Ubuntu 当前推荐的新版本。Ubuntu 20.04 标准仓库里能选的驱动大概有 450、470、510、530 这些越新的版本通常对 GNOME 合成器的支持越好。操作上推荐走ubuntu-drivers这个工具sudo ubuntu-drivers autoinstall它会根据你的显卡型号自动安装推荐版本并配置好比手动dpkg -i一个.deb靠谱得多。装完重启看问题是否消失。如果驱动已经是最新但还是闪烁那可以先对合成器做一次降火处理临时关掉 GNOME 的界面动画看看是不是动画重绘导致的。执行gsettings set org.gnome.desktop.interface enable-animations false关闭动画后光标闪烁通常会明显缓解。既然切换驱动和关动画这两个动作都是非破坏性的我建议你不管后面怎么折腾先各试一遍能快速排除一大半可能性。还有一个在 Xorg 会话里非常管用的快捷键组合Alt F2输入r然后回车这会重启 GNOME Shell桌面框架但不会注销你的会话。当你看到桌面闪一下消失又恢复说明合成器被重新拉起来了。如果重启后的一两分钟内光标表现正常之后又开始闪那大概率是某个后台进程或驱动状态在长时间运行后进入了异常模式这种时候可以考虑下面要说的会话切换方案。3.2 Wayland 与 Xorg 的取舍和切换Ubuntu 20.04 默认的登录会话是 Xorg但系统同时提供了 Wayland 会话登录界面右下角的齿轮图标可以切换。为什么切换会话能解决鼠标闪烁和抖动因为 Xorg 和 Wayland 处理输入和输出的方式完全不同。Xorg 的架构里所有程序都能直接访问输入设备和显示输出GNOME 的合成器需要在一个共享的缓冲区里绘制所有窗口遇到显卡驱动配合不好的时候光标层就容易被画花。Wayland 则把合成器完全收进显示服务器里客户程序只能通过协议间接与显示系统交互整个重绘流程更加封闭但更可控。很多在 Xorg 下出现的闪烁问题切到 Wayland 会话后立刻就好了尤其是 NVIDIA 驱动配合不好时哪天卡的愣愣的切换会话往往立竿见影。但也有反过来的情况。Wayland 在 NVIDIA 闭源驱动下的表现早年并不稳定如果你遇到的是光标完全消失或者窗口拖动时撕裂那反而应该留在 Xorg 里或者从 Wayland 切回 Xorg。切换方式很简单注销当前登录在登录界面先选中用户名然后点击屏幕右下角的设置图标一个齿轮选择Ubuntu on Wayland或Ubuntu on Xorg输入密码登录。等登录进去后重新执行echo $XDG_SESSION_TYPE确认当前会话类型确实变了。这里有个小建议如果切换会话解决了问题你可以把该会话设为默认项。Ubuntu 20.04 的 GDM 默认项可以通过修改/etc/gdm3/custom.conf里的WaylandEnablefalse来控制 Wayland 的启用与禁用但每次登录时手动选择其实也花不了几秒钟。我自己常用的做法是把这两种会话都留着哪个环境下工作正常就用哪个反正需要的软件和文件都在。4. 输入设备、电源管理和内核参数深入优化4.1 用 xinput 调整鼠标与触控板参数如果会话切换和驱动调整都没能根治那就需要把手伸到输入设备参数层面。Xorg 下有一个非常好用的工具叫xinput它负责查看和修改输入设备的运行时属性。先查看当前有哪些输入设备xinput list输出里会列出所有鼠标、键盘、触控板设备找到你的鼠标设备名比如Logitech USB Optical Mouse。然后查看它的参数xinput --list-props Logitech USB Optical Mouse重点关注libinput Accel Profile Enabled这个属性。它的默认值通常是按[0, 1, 0]排列表示启用的是自适应加速模式系统会根据你的移动速度动态调整指针加速度。这个模式在平滑鼠标移动的同时也可能引入微妙的前瞻处理在个别机器上就会产生指针在自我抖动的错觉或者让人感觉光标移动不够干脆。可以把它临时改成 flat 模式让指针和手部移动一比一对应xinput --set-prop Logitech USB Optical Mouse libinput Accel Profile Enabled 0 1 0等等上面这条命令其实不对完整的格式是需要把三个布尔值都写出来按位置调整。正确写法是把第二个值设为 1其他为 0xinput --set-prop Logitech USB Optical Mouse libinput Accel Profile Enabled 0 1 0其实你应该先执行xinput --list-props查看这个属性当前的值确认顺序。我的实际经验是如果你只需要扁平加速直接设成0 1 0大多数情况下是对的三选一flat1其他0。但不同内核版本的 libinput 对这个属性的参数定义有细微差异所以建议你先用--list-props看明白再改。这个修改是瞬时的不对就再改回去不会破坏系统。顺带一提很多笔记本用户会在这里同时确认触控板的设备名然后用xinput disable 设备名临时禁用触控板排除外接鼠标和触控板互相抢夺输入焦点的问题。4.2 禁止 USB 自动挂起、调整鼠标回报率日志里如果出现过usb reset或者device descriptor read error那基本可以断定问题出在 USB 电源管理上。Linux 内核默认对 USB 设备启用自动挂起Autosuspend设备空闲一段时间后会被挂起以省电。但是很多鼠标接收器对挂起/唤醒的时机非常敏感重新唤醒时如果信号握手出了问题就会出现一瞬间的断流表现就是光标抖动、卡顿甚至短暂消失。先看看当前全局的 autosuspend 设置cat /sys/module/usbcore/parameters/autosuspend如果输出是正数比如2单位是秒说明确实启用了自动挂起。临时禁用可以这样echo -1 | sudo tee /sys/module/usbcore/parameters/autosuspend-1表示禁用。这个修改立即生效但重启后会恢复。要想永久生效两种做法一是把这个参数写进内核命令行二是写 udev 规则。我更推荐前者简单直接编辑/etc/default/grub找到GRUB_CMDLINE_LINUX_DEFAULT那一行在双引号里追加参数GRUB_CMDLINE_LINUX_DEFAULTquiet splash usbcore.autosuspend-1然后执行sudo update-grub并重启。注意这个参数是全局的会影响所有 USB 设备相当于把所有 USB 设备的自动挂起都关了。对台式机来说完全无所谓笔记本用户如果在意续航建议改成只对鼠标接收器生效的 udev 规则而不是全局禁用。再说回报率的问题。之前提到过高的回报率会导致系统中断频繁如果你用的游戏鼠标支持在 Linux 下调整轮询率可以试试piper、libratbag或罗技的solaarsudo apt install piper solaar打开后找到你的鼠标设备把轮询率从 1000Hz 降到 500Hz。如果你不确定自己的鼠标是否支持可以先在网上查一下设备型号是否在 libratbag 的支持列表里。我个人实测过几个主流游戏鼠标在 Ubuntu 20.04 上把回报率从 1000Hz 降到 500Hz 后移动抖动的现象确实消失了代价是理论上指针看起来没有 1000Hz 那么丝滑但实际使用中几乎感觉不到差异。4.3 内核参数微调从源头减少不稳定前面提到的日志和电源管理问题最终都可以靠内核参数来兜底。除了usbcore.autosuspend-1之外还有一个参数值得试acpi_osiLinux。这个参数的目的是让 ACPI高级配置与电源管理接口对 Linux 系统提供更完整的硬件状态信息在一些笔记本上能解决 USB 设备反复重置、显卡电源状态切换异常等问题。同样在/etc/default/grub里操作GRUB_CMDLINE_LINUX_DEFAULTquiet splash acpi_osiLinux usbcore.autosuspend-1执行sudo update-grub后重启。提醒一句内核参数是系统层面的改动改之前最好备份一下grub文件改完之后如果发现问题更严重把这个参数删掉再update-grub就能回退。这一节的内容比较底层你可能会觉得自己只是用鼠标怎么还要动内核。但说实话鼠标闪烁和抖动这类问题往往就是底层某个参数引起的前面的软方案扫过一遍后剩下的问题绕不开这一层。5. 两个高频特殊场景虚拟机与双屏5.1 VMware 虚拟机里鼠标闪烁怎么办如果你是在 VMware 虚拟机里装的 Ubuntu 20.04.1遇到的问题可能完全不同于物理机。虚拟机的图形栈多了一层 VMware 的虚拟 GPU 和 3D 加速层这会引入一类光标闪烁独有原因。比较典型的场景是虚拟机里开着 Gazebo、Rviz 或者其他需要 OpenGL 渲染的程序时鼠标光标开始闪烁移动起来一顿一顿的。很多人第一时间去改客户机里的 NVIDIA 驱动但虚拟机里根本没有 NVIDIA 显卡问题在虚拟硬件的 3D 加速与客户机桌面合成器配合不佳。VMware 默认给虚拟机开启了加速 3D 图形选项这个选项在需要 OpenGL 渲染的时候确实能提升性能但在一些版本组合下会跟 GNOME 合成器产生严重的重绘冲突。解决方向有两个。第一个是在 VMware 虚拟机设置里找到显示器Display选项取消勾选加速 3D 图形然后重启虚拟机。关闭 3D 加速后GNOME 会自动切到软件渲染模式LLVMpipe虽然整体动画效果没有之前流畅但鼠标闪烁问题通常会立刻消失。第二个方向是确认系统已经安装并启用了 VMware Tools新版本叫 open-vm-tools它负责虚拟机的鼠标集成驱动、显示分辨率的自动调整等功能sudo apt install open-vm-tools-desktop装完重启虚拟机鼠标从宿主机进出虚拟机切换是否顺畅、光标是否会闪烁都会有明显改善。我见过有人把虚拟机里的 Ubuntu 折腾了大半天重装了好几次桌面环境最后发现只是 VMware 没有装 open-vm-tools因为关掉 3D 加速后鼠标就开始乱飘——那其实是鼠标集成驱动的问题不是闪烁的问题。总之虚拟机里遇到光标异常先装 tools再关 3D 加速这两步能解决九成以上。5.2 双屏不同刷新率下的光标抖动另一个很容易踩的场景是双屏特别是外接高刷新率显示器和笔记本自带屏幕混用时。比如笔记本屏幕是 60Hz外接显示器是 144Hz在 Xorg 会话下合成器必须同时处理两个不同刷新率的输出画面鼠标光标作为一个跨屏幕的输入层经常会在两个屏幕之间移动、跨越时出现撕裂感、抖动甚至掉帧。Xorg 对混合刷新率的支持一直不太好因为它的合成模型要求全局同步。Wayland 在这方面设计得更合理它允许每个输出独立合成所以如果你用的 Xorg 且桌面是混合刷新率可以先用第一节说的方法把当前会话切换到 Wayland看抖动是否消失。如果坚持用 Xorg另外一个立竿见影的笨办法是把外接显示器的刷新率也改成 60Hz先保证两块屏幕刷新率一致。用xrandr查看输出名称和刷新率xrandr找到外接显示器对应的输出名比如 HDMI-1然后强制设为 60Hzxrandr --output HDMI-1 --mode 1920x1080 --rate 60这个修改只在当前会话内生效不会永久改变系统设置非常适合用来验证抖动问题是否由混合刷新率引起。如果改成 60Hz 后鼠标立刻恢复正常那就能实锤了。长期使用的话要么接受 60Hz要么像前面说的用 Wayland 享受各自的刷新率。6. 常见问题速查表与实操心得6.1 问题排查速查表下面这张表是我实际遇到过的症状和对应处理方案的汇总优先级从上到下。你可以把它当成排查路线图也可以存下来下次直接对照。症状最可能的原因优先处理动作光标闪烁伴随黑色方块或残影NVIDIA 闭源驱动与 GNOME 合成器兼容性换较新驱动版本关闭桌面动画移动时指针卡顿、一抖一抖鼠标回报率过高或 USB 信号不稳换 USB 2.0 口回报率降到 500Hz无线鼠标随机断连、飘移2.4G 接收器离 USB 3.0 口太近接收器换 USB 2.0 口插延展线USB 鼠标间歇性重置内核 USB 自动挂起禁用 autosuspend光标在 Xorg 下闪烁切 Wayland 就好合成器架构差异切换到 Wayland 会话虚拟机里光标闪烁VMware 3D 加速冲突安装 open-vm-tools-desktop关 3D 加速双屏鼠标抖动、撕裂混合刷新率同步问题临时统一刷新率或切 Wayland6.2 我自己踩过的坑和几条经验第一个坑不要一上来就重装驱动。我看过太多人在论坛里问Ubuntu 显卡驱动卸载不掉怎么办实际上大部分闪烁问题根本轮不到卸载驱动的地步。先花五分钟做 Live USB 测试、看 dmesg很多时候问题就水落石出了。重装驱动不仅耗时还容易把系统搞坏尤其是手贱移除nvidia-*包之后又没装回正确版本那种局面比闪烁难受一百倍。第二个坑注意鼠标本身也有睡眠行为。有些无线鼠标为了省电空闲几秒后会进入休眠恢复时系统需要一点时间重新建立连接这段时间内你动鼠标光标准确说不是抖动而是反应滞后然后猛地跳一大段。这种情况在蓝牙鼠标上尤为明显。解决方案是在鼠标驱动软件里关闭自动休眠或者换一个不会睡眠的有线鼠标反正不贵不值得为了省电把体验折进去。第三个坑小心 GNOME 扩展。20.04.1 上系统自带的 GNOME 3.36 可以通过扩展中心安装各种小工具但第三方扩展如果写得不严谨会持续干扰 GNOME Shell 的合成循环导致鼠标抖动。这个貌似和驱动无关的问题有几次我排查到最后才发现是一个过时的扩展在捣乱。排查方法也简单按住AltF2输入r重启 GNOME Shell或者在 GNOME 的扩展管理界面里把所有第三方扩展全部禁用挨个开启看哪个出问题。第四个经验学会区分闪烁和重影。如果光标正常移动但移动路径上留着一条残影尾巴这是显示器的响应时间和桌面合成器未知同步的问题可以试试在终端打开显示指针位置功能系统设置的辅助功能里有关键帧设置发现指针之类的功能可以在按住某个按键时高亮指针位置。还有如果你在设置里曾经打开过光标轨迹有些桌面环境叫 Pointer trails它会让鼠标头后面拖一截尾巴很多人会误以为这是闪烁抖动实际是设置项作祟在鼠标设置里关掉就好。第五条经验也是我给别人排障时最常强调的一次只改一个变量。改完一个方案重启或重新加载观察一会儿确认有效或无效再继续下一个。很多人喜欢同时关动画、换驱动、改 USB 参数、切会话一顿操作猛如虎最后问题解决了也说不清到底是哪步起的作用下次换个环境又不会了。问题不重要重要的是知道自己有哪些可用的工具以及它们各自能解决什么层面的问题。谈到工具我个人平时最依赖的就是dmesg和xinput这两个命令一个查底层一个调输入层再配合xrandr查看显示参数。这些工具都是系统自带的用不上安装任何额外软件排查问题的时候能节约大量时间。最后分享一个我个人收尾时的小习惯问题解决之后我会把当前环境的关键信息系统版本、内核版本、驱动版本、会话类型、最终生效的配置项记录到一个文本文件里。下次系统升级内核或者重装系统之后鼠标万一又不听话了翻出这份记录照着恢复配置就行不用再从头排查一遍。