十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Arch Linux分辨率识别不全?从EDID到显卡驱动的排查指南

Arch Linux分辨率识别不全?从EDID到显卡驱动的排查指南 如果你刚装完Arch Linux打开系统之后发现屏幕只有1024x768或者外接一台2K、4K显示器系统怎么都不给原生分辨率选项那这篇文章就是给你准备的。我先把结论放在前面高分辨率识别不上绝大多数时候不是显示器坏了也不是Arch Linux本身不支持而是显示链路里某一层没有正确拿到显示器的EDID信息或者拿到了没传到桌面。从GRUB到TTY从显卡驱动到Wayland合成器每一层都有自己的分辨率决策逻辑只要其中一层掉链子你看到的症状就是“分辨率选项很少”或“画面发虚模糊”。我最近帮一台换了2.5K屏的笔记本装Hyprland折腾了两个晚上最后定位问题花的时间远比解决的时间多。想明白显示链路的分层之后这类问题的排查完全可以系统化。这篇文章会从症状分层开始一直讲到GRUB配置、显卡驱动、xrandr手工注入、Wayland缩放最后给你一套可以照着跑的排查顺序。适合刚接触Arch Linux的新手也适合被外接显示器分辨率折腾到头大的老用户。1. 先分清症状是GRUB小、TTY糊还是桌面列表里缺分辨率很多人在论坛发帖就是一句“Arch Linux不识别高分辨率”但这句话的信息量其实很低。因为“不识别”可能发生在启动流程的不同阶段不同阶段的解法完全不同。我建议先做一次症状分层把问题限定到某一层再决定动哪里。1.1 三层症状对照表为了快速定位我把最常见的现象放在一起对比你一看就知道自己属于哪种症状典型表现常见原因优先级GRUB阶段分辨率低开机引导菜单字体大、字距宽分辨率像640x480GRUB_GFXMODE未配置UEFI/BIOS的回退模式低TTY阶段模糊或字体大登录终端控制台字特别大但进入桌面后一切正常内核fbcon没有采用高分辨率mode或字体本身超大中桌面阶段缺少分辨率桌面环境里分辨率列表只有1024x768或1920x1080没有2K/4K选项显卡驱动、显示服务器或EDID信息缺失高外接显示器不识别外接屏只能输出低分辨率内置屏正常线材带宽不足、转接头问题、EDID校验失败高有分辨率但没有高刷新率2K显示器只给60Hz不给144Hz等选项驱动未完整读取EDID或线材带宽受限中看到这里你应该心里有个数了。如果是GRUB阶段低分辨率却不影响进入桌面那其实对日常使用没什么伤害只是启动界面难看。如果桌面阶段都没识别出原生分辨率那就是驱动或EDID问题得重点排查。1.2 先跑一遍诊断命令我不管什么问题第一件事永远是看系统现在到底认出了多少种显示模式。X11下用xrandr --queryWayland合成器下面用对应的看模式工具比如Hyprland、Sway这类wlroots系用wlr-randr这个输出非常重要。如果目标显示器比如HDMI-1的mode列表里根本没有2560x1440这个选项说明驱动层面压根没拿到这个模式问题出在EDID读取、驱动加载或线材。如果列表里有原生分辨率但选中后画面不正常那是模式切换或缩放的问题。接着看内核日志dmesg | grep -iE edid|drm|nvidia|amdgpu或者用journalctljournalctl -b -g edid|drm日志里出现EDID checksum invalid这种信息说明显示器向显卡发送的EDID数据有校验问题。出现HDMI-A-1: no EDID说明完全没有读到EDID。这两个方向查起来完全不同。1.3 为什么要把问题分层显示链路就像一条水管从BIOS到GRUB再从内核到显示服务器最后到桌面合成器每一层都有自己独立的分辨率逻辑。GRUB小不代表驱动有问题驱动有问题也未必影响GRUB阶段。如果把所有阶段混在一起你会陷入“改了一堆配置却哪都没改对”的状态。我自己的习惯是先把症状锁定到阶段再动手。GRUB阶段单独处理TTY阶段单独处理桌面阶段单独处理这样每次改动都能通过小范围验证出了问题也知道回滚哪里。2. 让GRUB和内核终端输出正确的分辨率GRUB和TTY虽然不是最影响日常体验的部分但很多人会在这儿卡住。尤其是刚装完Arch Linux第一次重启看到GRUB菜单那个又大又扁的字体第一反应就是“系统有问题”。实际上这层问题很好解决。2.1 GRUB为什么总是低分辨率GRUB本身是一套独立的启动环境它要在操作系统起来之前工作只能借助固件UEFI/BIOS提供的帧缓冲和视频模式。很多主板固件默认只向GRUB暴露保守的分辨率列表比如800x600、640x480。如果你不主动告诉GRUB“我想用2560x1440”它就用最保守的模式启动。这其实不是缺陷而是一种兼容性策略。GRUB不知道你的显示器支持什么它只能选一个最不容易出错的模式。所以我们要做的就是手动指定。2.2 修改GRUB_GFXMODE打开/etc/default/grub找到GRUB_GFXMODE这一行。如果没看到自己添加GRUB_GFXMODE2560x1440,1920x1080,auto GRUB_GFXPAYLOAD_LINUXkeep第一行指定GRUB优先尝试的分辨率列表逗号分隔最左边是首选。如果首选模式固件不支持就依次往后尝试最后落到auto让GRUB自己挑。第二行GRUB_GFXPAYLOAD_LINUXkeep很关键意思是让内核沿用GRUB已经选好的模式不要再切一次。如果不加这个参数内核起来后可能又回退到它自己认为安全的低分辨率模式那你GRUB阶段白配了。改完保存执行sudo grub-mkconfig -o /boot/grub/grub.cfg这一步会重新生成GRUB配置文件把设置写进去。很多人改完/etc/default/grub忘记重新生成重启后发现还是老样子就是这个问题。2.3 内核cmdline里的坑/etc/default/grub里的GRUB_CMDLINE_LINUX_DEFAULT是内核启动参数这里藏着很多分辨率问题。最典型的是nomodeset。如果你安装NVIDIA驱动时查过资料很可能被建议加上nomodeset来绕过驱动问题。这个参数的意思是禁用内核模式设置Kernel Mode Setting让系统用通用帧缓冲跑。副作用就是很多显卡的高分辨率模式根本不会启用桌面分辨率基本只有少数几个保守选项高分屏直接废掉。正常情况下装好驱动后一定要删掉这个参数。还有一种情况是手动指定video2560x144060这类内核参数它影响的是KMS和fbcon也就是TTY阶段和启动画面。如果GRUB那边已经用GRUB_GFXPAYLOAD_LINUXkeep实际上内核参数里通常不需要再额外指定除非你想在TTY下用特定分辨率。2.4 TTY字体发虚的误判还有一个容易混淆的细节TTY下字体大不完全等于分辨率低。终端控制台使用的是点阵字体高分屏下如果点阵字体被拉伸看起来就是糊。很多人看到TTY下字又大又糊以为是内核没识别高分屏其实可能是字体选得不好。可以先用setfont临时换一个字体测试setfont ter-132nter-132n是Terminus字体的一种尺寸在实际高分屏终端上显示效果不错。想开机自动生效就编辑/etc/vconsole.confFONTter-132n不过这个优先级低于内核分辨率问题。如果TTY分辨率本身只有640x480再好的字体也救不回来。先通过video内核参数把TTY分辨率提上去再配合合适字体才能得到干净的终端画面。3. 驱动选型和显示服务器分辨率识别问题的重灾区桌面阶段识别不了高分辨率八九成出在显卡驱动这一层。Arch Linux的驱动选型有一点门槛装错了或者没有正确启用KMS显示器的EDID信息就传不到桌面。3.1 确定显卡并匹配驱动先搞清楚自己是什么显卡别猜。一条命令lspci -k | grep -A 3 -E VGA|3D在此基础上驱动选型大致这样显卡推荐的驱动方案备注NVIDIA Turing及以上nvidia或nvidia-open闭源驱动Arch Wiki推荐优先使用NVIDIA Maxwell/Pascal等旧卡nvidia或nvidia-lts面向旧卡的用户态驱动AMD GCN及以上xf86-video-amdgpu 内核自带amdgpu开源驱动开箱即用AMD老卡GCN之前xf86-video-ati 内核自带radeon老平台兼容性更好Intel核显内核自带i915不需要额外装xf86-video-intel额外驱动反而可能引入缩放问题这里我要多说一句Intel核显。很多教程会让你装xf86-video-intel但在高分屏场景下这个驱动有时会跟Xorg的modesetting驱动打架出现画面撕裂、缩放异常。现在Xorg已经内置了modesetting驱动Intel核显裸装就可以用真不用额外装。3.2 NVIDIAEDID加载与KMSNVIDIA闭源驱动在高分屏上的问题主要集中在KMS没有开启。从驱动4750记不太清了反正新驱动开始NVIDIA驱动把NVRM和DRM做了整合但DRM接口需要显式开启。如果不开启Xorg虽然能通过NVIDIA自己的接口拿到显示信息但新一代桌面环境和Wayland合成器会拿不到完整模式列表。检查方法cat /sys/module/nvidia_drm/parameters/modeset输出Y或1说明已开启。如果是N或0需要配置。创建/etc/modprobe.d/nvidia.confoptions nvidia_drm modeset1 fbdev1然后重建initramfssudo mkinitcpio -P这一步非常重要。很多人改完modprobe.d里的配置重启Xorg就以为生效了结果NVIDIA驱动是作为内核模块存在的必须重建initramfs并重启系统才能真正加载。重启后如果分辨率列表还是不全可以再用nvidia-settings看一下每个连接器的详细状态。有时候是多显示器下某个显示器启用了DSCDisplay Stream Compression而驱动版本较旧导致高分辨率高刷新率模式没暴露出来。这种场景先别急着换驱动先检查线材和接口带宽。2K144Hz建议用DP 1.4线4K120Hz要么DP 1.4开DSC要么HDMI 2.1满血线。很多标注“8K HDMI线”的廉价线实际只能跑4K30这类物理层问题驱动再优化也没用。3.3 AMD/Intel核显与接口限制AMD和Intel的开源驱动通常开箱即用但也不是没有问题。AMD这边如果你发现某些模式下分辨率缺失先更新linux-firmware。AMD显卡的部分显示功能依赖固件旧固件可能缺少新显示器的模式组合。还有新内核默认已经启用了DCDisplay Core如果你在用老内核或者加了amdgpu.dc0那显示功能本身就残废了高分屏识别不出来很正常。Intel这边老CPU的HDMI输出经常有物理带宽限制。比如4代到9代酷睿的内置HDMI很多只支持4K30或者2K60不是驱动问题是主板上HDMI控制器的带宽极限。碰到这种情况换DP接口可能就好了因为Intel核显的DP输出带宽通常比HDMI高。还有一个经常被忽视的坑是主板BIOS里的CSMCompatibility Support Module。CSM是给老操作系统用的兼容模式开启后可能导致UEFI GOP失效影响GRUB和内核早期的视频模式协商升级驱动后分辨率仍不完整。如果BIOS里有这项且设为Enabled试试关掉装GPU驱动的环境会干净很多。3.4 显示服务器选型对分辨率的影响理论上Xorg和Wayland都能支持高分屏但如果你发现Xorg下分辨率不对、Wayland下正常多半是Xorg没有正确加载显卡驱动用了回退的modesetting。对NVIDIA用户可以显式写Xorg配置# /etc/X11/xorg.conf.d/20-nvidia.conf Section Device Identifier NVIDIA Driver nvidia BusID PCI:1:0:0 Option PrimaryGPU yes EndSectionBusID的值用lspci -nn | grep -i nvidia看比如01:00.0要写成PCI:1:0:0。改完后重启Xorg或重启系统。Wayland下情况略有不同。wlroots系合成器Sway、Hyprland走的是DRM接口只要内核KMS正常、驱动正确加载一般就能读到完整模式列表。如果Wayland下都不识别高分屏基本上就是驱动或EDID问题了不用怀疑合成器。4. xrandr手工注入EDID模式的完整流程到了这一步如果你已经确认驱动没问题、线材没问题但系统就是不给你原生分辨率选项那就只能手动告诉系统“这台显示器支持什么模式”了。这个操作本质上是绕过EDID的一部分限制把模式直接吃进去。4.1 为什么需要手工注入EDID是显示器通过DDC通道发给显卡的一小段数据里面包含工厂写死的分辨率、刷新率、物理尺寸、色彩深度等信息。显卡和驱动按EDID来枚举显示模式。如果EDID数据损坏、校验失败或者显示器厂商出厂时模式表就没写完整系统就会退回保守模式。xrandr手工注入的思路是我们自己生成一段符合显示器面板时序的参数强制加到系统的mode列表里然后告诉输出端口使用。相当于替显示器写了一份“口述的EDID”。4.2 用cvt生成Modeline生成Modeline最常用的工具是cvt。比如给2560x144060生成cvt 2560 1440 60输出类似这样Modeline 2560x1440_60.00 312.25 2560 2752 3024 3200 1440 1443 1448 1481 -hsync vsync这串数字就是显示模式的时序参数。然后依次执行xrandr --newmode 2560x1440_60.00 312.25 2560 2752 3024 3200 1440 1443 1448 1481 -hsync vsync xrandr --addmode HDMI-1 2560x1440_60.00 xrandr --output HDMI-1 --mode 2560x1440_60.00第一行创建模式第二行把它添加到某个输出端口第三行让输出端口切到这个模式。HDMI-1要换成你机器上实际的输出名以xrandr --query显示为准。如果你显示器是特别老式的CRT可以用gtf代替cvt生成GTF时序。现在的LCD显示器基本都用CVTcvt就够了。4.3 持久化到xorg.conf直接在终端执行xrandr的缺点是重启就失效。要持久化推荐写Xorg配置。在/etc/X11/xorg.conf.d/下新建10-monitor.confSection Monitor Identifier HDMI-1 Modeline 2560x1440_60.00 312.25 2560 2752 3024 3200 1440 1443 1448 1481 -hsync vsync Option PreferredMode 2560x1440_60.00 EndSectionIdentifier必须与xrandr输出的端口名一致。Modeline行的内容直接用cvt生成的那一整串。PreferredMode告诉Xorg优先选择这个模式。保存后重启Xorg。如果你用的是WaylandXorg的配置文件就不生效了。Wayland下要把模式写进合成器的配置比如Hyprland里可以monitorHDMI-A-1,2560x144060,0x0,1但前提是内核DRM层已经有这个模式。如果DRM层没有Wayland合成器也一样拿不到。4.4 用EDID文件强行指定显示器的输入如果连生成Modeline都救不回来dmesg里明确显示EDID checksum错误可以试试强制内核使用某个EDID文件。先把当前EDID导出来看看cp /sys/class/drm/card0-HDMI-A-1/edid ~/edid.bin edid-decode ~/edid.binedid-decode不是Arch默认安装的需要手动装edid-decode包。如果EDID损坏解码时会报错。修复的办法是从同型号显示器或者网上找到一份正常的EDID放到固件目录sudo mkdir -p /lib/firmware/edid sudo cp ~/edid.bin /lib/firmware/edid/mydisplay.bin然后在内核参数里指定drm_kms_helper.edid_firmwareHDMI-A-1:edid/mydisplay.bin重新生成GRUB配置并重启。这个方案是最后的杀手锏但要注意EDID文件如果和你实际显示器面板时序不符画面可能出现偏移、花屏。不要随便用别人的EDID除非你确认型号和面板一模一样。4.5 黑屏自救方法手工注入模式时万一设置的刷新率或时序超出面板支持范围结果就是黑屏。遇到黑屏别慌先用SSH等方式连进系统把刚才的配置撤掉。如果本机能操作可以试试等几秒让画面自动恢复或者切到TTYCtrlAltF2TTY下可以执行sleep 5 xrandr --output HDMI-1 --mode 1920x1080如果配置是写到xorg.conf里的直接删掉对应文件重启就行。这是排查过程中最常遇到的操作值得记住。5. HiDPI和Wayland高分屏上最容易被误会的缩放问题还有一种情况分辨率其实识别对了但画面表现仍然不对——字体特别小眼睛都快贴上屏幕了。这个和“不识别高分辨率”不是一个问题但经常被人混为一谈。我想单开一节把HiDPI和Wayland下的缩放逻辑说清楚。5.1 “分辨率对但字体小”其实是DPI问题DPI每英寸点数决定的是界面元素在实际屏幕上的物理大小。同样是2560x1440在24寸显示器和15寸笔记本屏幕上字体物理大小完全不同。如果系统按默认96 DPI算高分小屏上所有东西都会显得极小。X11下最简单的临时调法xrandr --dpi 144或者写进~/.XresourcesXft.dpi: 144改完需要重启应用才生效。但这个方案是全局DPI对多显示器混合DPI场景不够精细。有些人会在高分屏下把分辨率降级到1080p来换取大字体我不建议这么干画面会发虚浪费了高分屏的价值。正确做法是保持原生分辨率提高DPI。5.2 Wayland/Hyprland下的缩放配置Wayland把缩放设计成了显示器的属性比X11清晰很多。GNOME和KDE Plasma里都有图形化的缩放选项支持100%、200%等整数倍部分版本还支持125%、150%这样的分数缩放但通常需要额外的实验开关。Hyprland的配置是写在配置里的monitor DP-1, 2560x1440144, 0x0, 1.25第4个字段1.25就是缩放倍率。这个值对Wayland原生应用有效XWayland下的应用表现要看合成器的处理策略。如果你发现XWayland应用在高分屏下表现异常模糊Hyprland里可以配置xwayland { force_zero_scaling true }但这会让XWayland应用按100%缩放渲染在高分屏下反而看起来很小。不同的wlroots版本对XWayland缩放的实现有差异我建议先保持默认实际用下来再决定要不要动。5.3 多显示器混合DPI场景笔记本2.5K内屏 外接1080p显示器是高分屏问题最多发的组合。X11下如果全局DPI设为144外接1080p显示器的字会显得偏大设为96内屏字又小到看不清。Wayland下可以让每个显示器独立设置scale但窗口跨屏拖动时会明显缩放跳变。遇到这种场景我的建议是优先以高PPI主屏为准。如果两台屏幕物理PPI差距不大统一用整数缩放。如果外接屏和主屏PPI差距很大那就接受外接屏上字体偏小或偏大的现实不要试图用一个scale满足所有需求累死人。5.4 容易混在一起的两个“模糊”缩放与输入法高分屏下还有一个经常和缩放问题同时出现的情况输入法失效或者文字输入时看不到候选框。这在Wayland的XWayland应用里特别常见。比如你在Wayland桌面里用微信发现打中文没反应很多人会以为是从高分屏缩放引起的显示问题实际上很可能是输入法环境变量没有正确传给XWayland应用。如果你用的是ibus-rime需要确保这些环境变量存在GTK_IM_MODULEibus QT_IM_MODULEibus XMODIFIERSimibus具体设置方式根据你的桌面环境不同有~/.xprofile、/etc/environment、合成器配置等几种途径。我在这里提到它是因为“高分屏模糊应用行为异常”的排查最后经常走向两个方向——一个方向是缩放另一个方向是输入法或者字体渲染环境。遇到问题别只盯着分辨率折腾先分清楚症状来源。6. 一套可以照着跑的排查链路与常见坑位最后给你一套我自己的排查顺序照着跑一遍绝大多数问题能在十分钟内定位。6.1 六步排查顺序看当前模式列表xrandr --queryWayland下用wlr-randr确认目标输出有没有原生分辨率选项。看内核日志dmesg | grep -iE edid|drm|nvidia|amdgpu找EDID报错和驱动加载信息。确认驱动模块lsmod | grep -E nvidia|amdgpu|i915看显卡驱动是否真的加载了。检查内核参数cat /proc/cmdline看有没有残留的nomodeset。检查GRUB配置grep -i gfxmode /boot/grub/grub.cfg确认生成的配置里有没有你想要的分辨率。排除物理层换线、换接口尤其是Type-C转HDMI/DP的转接头带宽不足比驱动问题更隐蔽。6.2 常见现象与处理对照表现象可能原因处理方式GRUB菜单分辨率低桌面正常GRUB_GFXMODE未配置修改/etc/default/grub并重新生成grub.cfgTTY字体很大桌面正常fbcon分辨率低或字体巨大调整video内核参数配合setfont换字体桌面只有1024x768nomodeset残留或显卡驱动未加载删除nomodeset安装对应驱动并重建initramfs显示器能识别但没有高刷选项EDID未完整读取、线材带宽不足更新驱动、换满血DP/HDMI线外接屏识别为低规格模式EDID损坏、转接头带宽不足手工Modeline注入或换转接头分辨率正常但字体特别小DPI设置不当调整DPI或Wayland缩放倍率6.3 我踩过的几个坑说一下真实经历。第一件事我一度把GRUB_GFXMODE直接设成4K120Hz结果GRUB阶段花屏进系统后桌面也异常。后来发现主板的UEFI视频驱动在早期阶段只协商到了HDMI 2.0带宽撑不住4K120。降回2560x144060后一切正常。所以GRUB_GFXMODE不要盲求最高参数够用就行。第二件事有次换了台新显示器dmesg里明确写着EDID checksum invalid。当时用cvt手工注入模式解决了后来给显示器刷了最新固件问题才彻底消失。这让我意识到显示器EDID损坏比想象中常见遇到问题先看dmesg能省很多无用功。第三件事给NVIDIA驱动配置modeset时改完/etc/modprobe.d/下的配置文件只重启了Xorg然后对着分辨率列表一脸懵。后来反应过来内核参数必须重建initramfs加重启系统才会真正生效。这个细节在Arch Wiki上写得很清楚但实际操作中太容易忽略。第四件事排查NVIDIA驱动残留配置时发现老版本的modprobe配置文件里写了modeset0虽然之后换过驱动包但配置一直没清理。那段时间高分辨率一直上不去没想到是这份陈年旧配置在捣鬼。所以排查驱动问题时不光要cat /proc/cmdline还要看看/etc/modprobe.d/下有没有写死的旧参数。把显示链路当成一条有顺序的管道来看排查会轻松很多GRUB只是入口TTY是过渡显卡驱动决定桌面能输出多少种模式缩放和DPI决定你看到的观感。我自己现在处理这类问题的顺序很简单——先看dmesg再开xrandr最后才动配置。这套顺序十次里有九次能精确定位到问题层剩下一次多半是线材或转接头的物理问题。希望这篇能帮你省下几个晚上的折腾时间。
返回列表