如果你刚装完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阶段分辨率低 | 开机引导菜单字体大、字距宽,分辨率像640x480 | GRUB_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"或者用journalctl:
journalctl -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_GFXMODE=2560x1440,1920x1080,auto GRUB_GFXPAYLOAD_LINUX=keep第一行指定GRUB优先尝试的分辨率列表,逗号分隔,最左边是首选。如果首选模式固件不支持,就依次往后尝试,最后落到auto,让GRUB自己挑。
第二行GRUB_GFXPAYLOAD_LINUX=keep很关键,意思是让内核沿用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),让系统用通用帧缓冲跑。副作用就是很多显卡的高分辨率模式根本不会启用,桌面分辨率基本只有少数几个保守选项,高分屏直接废掉。正常情况下装好驱动后一定要删掉这个参数。
还有一种情况是手动指定video=2560x1440@60这类内核参数,它影响的是KMS和fbcon,也就是TTY阶段和启动画面。如果GRUB那边已经用GRUB_GFXPAYLOAD_LINUX=keep,实际上内核参数里通常不需要再额外指定,除非你想在TTY下用特定分辨率。
2.4 TTY字体发虚的误判
还有一个容易混淆的细节:TTY下字体大不完全等于分辨率低。终端控制台使用的是点阵字体,高分屏下如果点阵字体被拉伸,看起来就是糊。很多人看到TTY下字又大又糊,以为是内核没识别高分屏,其实可能是字体选得不好。
可以先用setfont临时换一个字体测试:
setfont ter-132nter-132n是Terminus字体的一种尺寸,在实际高分屏终端上显示效果不错。想开机自动生效,就编辑/etc/vconsole.conf:
FONT=ter-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 NVIDIA:EDID加载与KMS
NVIDIA闭源驱动在高分屏上的问题主要集中在KMS没有开启。从驱动4750(记不太清了,反正新驱动)开始,NVIDIA驱动把NVRM和DRM做了整合,但DRM接口需要显式开启。如果不开启,Xorg虽然能通过NVIDIA自己的接口拿到显示信息,但新一代桌面环境和Wayland合成器会拿不到完整模式列表。
检查方法:
cat /sys/module/nvidia_drm/parameters/modeset输出Y或1说明已开启。如果是N或0,需要配置。
创建/etc/modprobe.d/nvidia.conf:
options nvidia_drm modeset=1 fbdev=1然后重建initramfs:
sudo mkinitcpio -P这一步非常重要。很多人改完modprobe.d里的配置,重启Xorg就以为生效了,结果NVIDIA驱动是作为内核模块存在的,必须重建initramfs并重启系统才能真正加载。
重启后如果分辨率列表还是不全,可以再用nvidia-settings看一下每个连接器的详细状态。有时候是多显示器下,某个显示器启用了DSC(Display Stream Compression),而驱动版本较旧,导致高分辨率高刷新率模式没暴露出来。这种场景先别急着换驱动,先检查线材和接口带宽。
2K@144Hz建议用DP 1.4线,4K@120Hz要么DP 1.4开DSC,要么HDMI 2.1满血线。很多标注“8K HDMI线”的廉价线实际只能跑4K30,这类物理层问题驱动再优化也没用。
3.3 AMD/Intel:核显与接口限制
AMD和Intel的开源驱动通常开箱即用,但也不是没有问题。
AMD这边,如果你发现某些模式下分辨率缺失,先更新linux-firmware。AMD显卡的部分显示功能依赖固件,旧固件可能缺少新显示器的模式组合。还有,新内核默认已经启用了DC(Display Core),如果你在用老内核或者加了amdgpu.dc=0,那显示功能本身就残废了,高分屏识别不出来很正常。
Intel这边,老CPU的HDMI输出经常有物理带宽限制。比如4代到9代酷睿的内置HDMI,很多只支持4K30或者2K60,不是驱动问题,是主板上HDMI控制器的带宽极限。碰到这种情况,换DP接口可能就好了,因为Intel核显的DP输出带宽通常比HDMI高。
还有一个经常被忽视的坑是主板BIOS里的CSM(Compatibility 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。比如给2560x1440@60生成:
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显示器基本都用CVT,cvt就够了。
4.3 持久化到xorg.conf
直接在终端执行xrandr的缺点是重启就失效。要持久化,推荐写Xorg配置。在/etc/X11/xorg.conf.d/下新建10-monitor.conf:
Section "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。
如果你用的是Wayland,Xorg的配置文件就不生效了。Wayland下要把模式写进合成器的配置,比如Hyprland里可以:
monitor=HDMI-A-1,2560x1440@60,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_firmware=HDMI-A-1:edid/mydisplay.bin重新生成GRUB配置并重启。这个方案是最后的杀手锏,但要注意EDID文件如果和你实际显示器面板时序不符,画面可能出现偏移、花屏。不要随便用别人的EDID,除非你确认型号和面板一模一样。
4.5 黑屏自救方法
手工注入模式时万一设置的刷新率或时序超出面板支持范围,结果就是黑屏。遇到黑屏别慌,先用SSH等方式连进系统,把刚才的配置撤掉。如果本机能操作,可以试试等几秒让画面自动恢复,或者切到TTY:
Ctrl+Alt+F2TTY下可以执行:
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或者写进~/.Xresources:
Xft.dpi: 144改完需要重启应用才生效。但这个方案是全局DPI,对多显示器混合DPI场景不够精细。有些人会在高分屏下把分辨率降级到1080p来换取大字体,我不建议这么干,画面会发虚,浪费了高分屏的价值。正确做法是保持原生分辨率,提高DPI。
5.2 Wayland/Hyprland下的缩放配置
Wayland把缩放设计成了显示器的属性,比X11清晰很多。GNOME和KDE Plasma里都有图形化的缩放选项,支持100%、200%等整数倍,部分版本还支持125%、150%这样的分数缩放,但通常需要额外的实验开关。
Hyprland的配置是写在配置里的:
monitor = DP-1, 2560x1440@144, 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_MODULE=ibus QT_IM_MODULE=ibus XMODIFIERS=@im=ibus具体设置方式根据你的桌面环境不同,有~/.xprofile、/etc/environment、合成器配置等几种途径。我在这里提到它,是因为“高分屏+模糊+应用行为异常”的排查,最后经常走向两个方向——一个方向是缩放,另一个方向是输入法或者字体渲染环境。遇到问题别只盯着分辨率折腾,先分清楚症状来源。
6. 一套可以照着跑的排查链路与常见坑位
最后给你一套我自己的排查顺序,照着跑一遍,绝大多数问题能在十分钟内定位。
6.1 六步排查顺序
- 看当前模式列表:
xrandr --query(Wayland下用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.cfg |
| TTY字体很大,桌面正常 | fbcon分辨率低或字体巨大 | 调整video=内核参数,配合setfont换字体 |
| 桌面只有1024x768 | nomodeset残留或显卡驱动未加载 | 删除nomodeset,安装对应驱动并重建initramfs |
| 显示器能识别但没有高刷选项 | EDID未完整读取、线材带宽不足 | 更新驱动、换满血DP/HDMI线 |
| 外接屏识别为低规格模式 | EDID损坏、转接头带宽不足 | 手工Modeline注入,或换转接头 |
| 分辨率正常但字体特别小 | DPI设置不当 | 调整DPI或Wayland缩放倍率 |
6.3 我踩过的几个坑
说一下真实经历。
第一件事,我一度把GRUB_GFXMODE直接设成4K@120Hz,结果GRUB阶段花屏,进系统后桌面也异常。后来发现主板的UEFI视频驱动在早期阶段只协商到了HDMI 2.0带宽,撑不住4K@120。降回2560x1440@60后一切正常。所以GRUB_GFXMODE不要盲求最高参数,够用就行。
第二件事,有次换了台新显示器,dmesg里明确写着EDID checksum invalid。当时用cvt手工注入模式解决了,后来给显示器刷了最新固件,问题才彻底消失。这让我意识到,显示器EDID损坏比想象中常见,遇到问题先看dmesg能省很多无用功。
第三件事,给NVIDIA驱动配置modeset时,改完/etc/modprobe.d/下的配置文件,只重启了Xorg,然后对着分辨率列表一脸懵。后来反应过来,内核参数必须重建initramfs加重启系统才会真正生效。这个细节在Arch Wiki上写得很清楚,但实际操作中太容易忽略。
第四件事,排查NVIDIA驱动残留配置时,发现老版本的modprobe配置文件里写了modeset=0,虽然之后换过驱动包,但配置一直没清理。那段时间高分辨率一直上不去,没想到是这份陈年旧配置在捣鬼。所以排查驱动问题时,不光要cat /proc/cmdline,还要看看/etc/modprobe.d/下有没有写死的旧参数。
把显示链路当成一条有顺序的管道来看,排查会轻松很多:GRUB只是入口,TTY是过渡,显卡驱动决定桌面能输出多少种模式,缩放和DPI决定你看到的观感。我自己现在处理这类问题的顺序很简单——先看dmesg,再开xrandr,最后才动配置。这套顺序十次里有九次能精确定位到问题层,剩下一次多半是线材或转接头的物理问题。希望这篇能帮你省下几个晚上的折腾时间。