
1. 为什么大家都会卡在Ubuntu分辨率这一关说到Ubuntu修改分辨率做过Linux桌面的人基本都遇到过这种场景装好系统打开一看界面大得离谱图标全挤在屏幕中间想用图形界面设置去调结果选项里根本没有显示器支持的最高分辨率。或者明明在Windows下一切都正常换了Ubuntu之后外接显示器就死活认不出原生分辨率画面模糊得跟蒙了一层油似的。这个问题的本质其实不难理解Ubuntu对显示器EDID信息就是显示器通过数据线告诉显卡自己支持哪些分辨率的一组数据的解析和Windows并不完全一致。Windows驱动层比较“霸道”读到EDID之后就照着最高值来不行就直接给个通用驱动顶上。Linux这边走的是开源显卡驱动加Xorg/Wayland显示协议里面有一个又一个校验环节比如显卡驱动认为某个分辨率刷新率组合超出带宽范围就直接把它过滤掉不显示在设置项里。所以你看着明明“支持”系统却偏不肯给。这篇文章就是专门来解决这个问题的。我会从最简单的图形界面操作一直讲到xrandr命令行、自定义模式、开机自启脚本最后把黑屏、字体模糊、虚拟机里分辨率不对这几个高频问题一并说清楚。适合刚装Ubuntu的新手也适合给远程服务器装桌面、跑虚拟机、折腾双系统的老手参考。2. 修改分辨率先要搞清楚的几件事2.1 不同的显卡和系统环境改法完全不一样很多人上网搜Ubuntu改分辨率照着一个教程敲命令结果在自己机器上就是不行。原因十有八九是没搞清楚自己属于哪一类环境。大致可以分四种情况核显环境Intel或AMD的核芯显卡用的基本上是开源驱动系统自带就能工作。这种情况下xrandr增删分辨率非常自由成功率也最高。NVIDIA独显环境如果装的是NVIDIA闭源驱动xrandr的部分操作会被驱动层拦截改起来更麻烦优先建议用nvidia-settings控制面板。虚拟机环境VMware、VirtualBox里的Ubuntu分辨率其实是由虚拟显卡和增强工具如open-vm-tools、VirtualBox Guest Additions共同决定的跟物理机逻辑还不一样。WSL环境WSL里的Ubuntu如果有图形界面WSLg分辨率默认跟随Windows窗口大小走跟传统Ubuntu桌面修改方式又不同。这个判断非常关键因为你后续选择方案、排查问题第一步都是先确定自己属于哪一类。你可以用下面命令快速确认lspci | grep -i vga输出里能看到类似“Intel Corporation UHD Graphics”“NVIDIA GA106 [GeForce RTX 3060]”这样的信息据此就能判断是核显还是独显。如果是虚拟机里查出来的是一堆VMware SVGA、VBox等虚拟设备字样那走虚拟机专属方案就够了。2.2 先分清显示协议X11还是WaylandUbuntu从17.10开始把Wayland作为默认显示协议但很多人不知道目前会话登录界面底部的齿轮图标就是用来切换Xorg和Wayland的。两种协议下修改分辨率的思路差异不小X11Xorgxrandr是绝对主力可以实时增删模式、修改分辨率也能把配置写进启动脚本。Wayland原生Wayland会话下xrandr基本是废的你需要用gnome-control-center的显示设置里那种图形化界面或者通过gnome-randr这类第三方工具操作。好消息是Ubuntu的GNOME桌面在显示设置里已经提供大部分常见分辨率选项而且Wayland下的分缩放fractional scaling做得比X11舒服。检查当前会话用的是不是Wayland一条命令就够了echo $XDG_SESSION_TYPE输出wayland就是Wayland输出x11就是Xorg。这一步确定后后面操作才不会白忙。注意如果开了远程桌面VNC、RDP等连Ubuntu通常跑的是Xorg的虚拟显示跟物理显示器的分辨率设置又有所区别后面专门说。3. 图形界面和xrandr命令两种最常用的改法3.1 图形界面设置适合大多数人的首选回到最简单的路径。Ubuntu桌面版GNOME桌面下打开“设置”左侧找到“显示器”Displays就能看到分辨率下拉框。如果里面出现了你想要的分辨率直接选中点击“应用”系统会弹出15秒倒计时确认框点击保留即可。这个设计是为了防止你设置一个看不了的参数后把自己锁在门外算是桌面环境比较贴心的机制。这里值得多说一句的是16:10的屏幕、带鱼屏之类如果系统识别正确一般会给一个“默认”或者“最佳分辨率”的推荐标签。不要为了字体大小而刻意降低分辨率因为那种模糊感不是缩放能弥补的后面我会讲更好的缩放方案。如果下拉框里压根没有你想要的分辨率那就别在图形界面里死磕了跳到3.2用命令行操作。另外还有第三种情况就是用HDMI或DP线接了电视当显示器。很多电视因为过扫描overscan问题会显示不全画面这时去显示器设置里找“Underscan”或者“缩放”选项优先级要高于硬调分辨率。这是硬件层面的事xrandr也救不了。3.2 xrandr命令查看和切换分辨率的基础操作xrandr是Linux下管理显示输出的老牌工具X11下功能尤其强大。它相当于你在命令行里直接跟显卡驱动对话“你支持什么、我要改成什么、输出端口是哪个”全都能看到。先查看当前显示状态xrandr输出内容分两部分上半部分列的是各个输出接口HDMI-1、DP-1、eDP-1等以及当前连接状态后半部分每个接口下跟着一排带*和的分辨率*表示当前分辨率表示当前刷新率有的版本还会在括号里标注显示器的物理尺寸。现在来改分辨率比如把主屏幕改成1920x1080xrandr --output VGA-1 --mode 1920x1080如果你要指定刷新率可以加上--rate 60。这个操作是实时的合适就直接保留不合适就在终端里马上切回原来的分辨率。但要说明的是这种操作只是“临时”的重启系统后会失效。要让设置长久保留需要把它写进启动脚本或系统服务这个放到第4章讲。这里还想特别提一个高频问题xrandr报错cannot find mode 2560x1440意思是当前驱动或显示协议没有这个模式需要手动添加模式。这个属于自定义分辨率范畴下一章详细展开。3.3 如果图形界面和xrandr都不行还可以试试显专工具NVIDIA用户的另一个选择是nvidia-settings。装了NVIDIA官方驱动后通常自带这个工具命令行就可以操作nvidia-settings它的界面里有个“X Server Display Configuration”页面可以右键分辨率、设置“Advanced”后手动输入自定义分辨率。这本质上也是调用xrandr但NVIDIA闭源驱动有自己一套封装兼容性比直接xrandr稳。另外NVIDIA也有命令行版本的nvidia-settings可以直接设置nvidia-settings -a CurrentMetaModeDPY-1: 2560x1440_60 00不过这类命令的语法受驱动版本影响比较大建议优先用图形界面。AMD用户的话新一代显卡用amdgpu驱动X11下xrandr就可以正常工作很少需要额外工具。4. 为显示器添加系统没有的自定义分辨率4.1 用cvt或gtf自己算一个显示模式出来前面说过系统不会平白无故给你分辨率它得从显示器EDID里读到信息才缓存到模式列表里。遇到比较老的显示器、特定的电视屏或者用了转换线HDMI转VGA、DP转HDMIEDID信息经常丢失或不完整这时就得靠手动添加。先来看如何生成一个显示模式。以1920x1080、60Hz为例cvt 1920 1080 60输出大概长这样Modeline 1920x1080_60.00 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync vsync这串数字就是显示器的工作参数包括像素时钟173.00MHz、行扫描参数、帧扫描参数等。不要被这些数字吓到你只需要把整行复制下来后面的xrandr --newmode会用到。如果你的显示器对GTF标准更友好老式CRT比较多见也可以用gtf 1920 1080 60生成格式类似但计算标准和cvt不同。现在大多数LCD显示器以CVT标准为主实际测试下来cvt兼容性更好。两个都试一下哪个显示效果好就用哪个。4.2 把新模式加进系统并应用拿到Modeline之后依次执行三条命令xrandr --newmode 1920x1080_60.00 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync vsync xrandr --addmode HDMI-1 1920x1080_60.00 xrandr --output HDMI-1 --mode 1920x1080_60.00第一步是把模式注册到X服务器里第二步是把模式和某个物理输出接口关联第三步才是真正切换过去。如果第三步没有报错说明设置成功。注意第二步里面的HDMI-1要替换成你自己xrandr里查到的输出接口名称。另外如果你只有一条VGA-1接的是老显示器那就把它换成VGA-1。如果你是用脚本一次性执行这三条建议在关键命令前加一个判断防止没有对应输出接口时报错退出。比如xrandr | grep -q HDMI-1 connected xrandr --output HDMI-1 --mode 1920x1080_60.004.3 重启失效怎么办写开机脚本和配置文件临时模式重启后会消失新手最容易在这栽跟头。X11下让自定义分辨率永久生效常见方式有几种方式一写.xprofile脚本在用户主目录下创建或者编辑~/.xprofile文件#!/bin/bash xrandr --newmode 1920x1080_60.00 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync vsync xrandr --addmode HDMI-1 1920x1080_60.00 xrandr --output HDMI-1 --mode 1920x1080_60.00给脚本执行权限然后重新登录生效。这个方案适合X11桌面环境。方式二用systemd用户服务有些人的系统尤其是自己编译的桌面环境没有.xprofile机制那就用systemd用户服务来执行启动命令。创建~/.config/systemd/user/resolution.service文件[Unit] DescriptionSet custom resolution Aftergraphical-session.target [Service] Typeoneshot ExecStart/home/你的用户名/bin/set-resolution.sh [Install] WantedBydefault.target然后在~/.local/bin下写对应的脚本内容执行systemctl --user enable --now resolution.service。这种方案比较接近“服务化”管理排查起来也方便。方式三写到/etc/X11/xorg.conf的Monitor段这是最底层的方案对显卡驱动要求也更高。核心思路是定义Display子段并给它指定Modeline。这种方式比较老派适合排查驱动层级的问题但不好调试而且Wayland下依然不生效。所以这里不展开推荐除非你用的是X11且对xorg.conf已经很熟悉。4.4 Wayland下怎么办如果你用的是Wayland会话xrandr的newmode和addmode基本不会生效。这时有两条路一条是图形界面硬选。GNOME的显示设置会自己枚举显示器支持的默认模式如果你想要的分辨率只是不在列表里但显示器其实支持可以试试“缩放”来凑合。另一条是修改启动参数。某些情况下添加以下内核参数可以改变Wayland分配给显示器的默认分辨率videoHDMI-A-1:1920x108060具体放到哪要看你的启动引导配置。Ubuntu现在用的是GRUB2编辑/etc/default/grub里的GRUB_CMDLINE_LINUX_DEFAULT然后运行sudo update-grub sudo reboot这个参数的作用是告诉内核在初始化显示输出时直接使用指定模式在一些内核对EDID识别不准的场景有奇效。不过Wayland下也不是所有显卡驱动都买账兼容性属于“试了才知道”的范畴。5. 分辨率相关的缩放与高清屏适配5.1 高分屏字体太小降低分辨率是错的方向很多刚接触Ubuntu的人误以为4K屏字太小就非要把分辨率调成1080P这其实是最不推荐的方案因为非原生分辨率下文字边缘发虚长时间看眼睛非常累。正确的做法是开缩放Scale。GNOME的显示设置里有“缩放”选项部分版本支持100%、125%、150%、200%等档位。如果你需要非整数缩放比如140%在X11下需要打开实验性缩放功能。打开方式gsettings set org.gnome.mutter experimental-features [scale-monitor-framebuffer]重启后回到显示设置就能看到更多缩放档位。Wayland下这个功能通常默认就可以用体验比X11流畅不少。所以如果你有高分屏又特别在意字体渲染清晰度可以考虑优先用Wayland会话。5.2 缩放后模糊或窗口错位开启非整数缩放后有些老应用会模糊或者窗口在屏幕间移动时会卡一下。这其实是显示协议层面的问题X11下尤其明显。我的建议是如果你主要在Ubuntu里跑浏览器、VS Code、终端这类现代应用用Wayland fractional scaling体验会好很多如果是跑一些老旧的X11专用软件还是老老实实整数缩放或者想办法用原生分辨率。另外在虚拟机场景里缩放和分辨率经常纠缠不清。VMware或VirtualBox里如果装了增强工具窗口拉大时Ubuntu桌面应该自动调整分辨率。如果你发现没有自动适应先检查增强工具是否在运行。VirtualBox下命令是lsmod | grep vboxguest如果为空重装Guest Additions。VMware则检查open-vm-toolssystemctl status open-vm-tools很多虚拟机里的分辨率问题根本不是显示器不支持只是工具没装好而已。6. 黑屏、花屏、重启失效常见问题排查实录6.1 改了分辨率直接黑屏这个情况我身边朋友遇到很多。如果你在图形界面里操作系统给了15秒倒计时设计点“取消”就能恢复但如果你是通过xrandr命令改的黑屏了没有倒计时保护怎么办别慌先按CtrlAltF2切换到TTY终端登录然后用命令行把分辨率切回来xrandr --output HDMI-1 --mode 1920x1080如果记不得原来的分辨率可以先xrandr查看一遍再用--mode切回去。还有一招是直接重启桌面会话X11下按CtrlAltBackspace需要先在键盘布局里启用Wayland下就只能从TTY里执行sudo systemctl restart gdm这会把整个图形界面重启但至少不会丢数据。记住这句话永远不要因为一个也许可用的分辨率让自己失去对系统的控制权。6.2 xrandr报错“Configure crtc failed”或“BadMatch”这两个报错非常经典。Configure crtc failed一般表示显卡驱动认为你设置的模式超出硬件能力比如带宽不够、刷新率过高。BadMatch则多发生于模式与显示器EDID不匹配或者你addmode时的接口不对。解决思路依次是重新用cvt生成模式检查刷新率是否过高。144Hz的2K模式对线材要求极高HDMI 1.4可能就带不动降到60Hz即可。确认输出接口名称。有人在多屏环境下认错了输出口对着没接显示器的口操作自然会报错。加上--rate指定刷新率。有时候模式存在多个刷新率不指定的话X服务器选择算法会自己挑一个容易出问题。6.3 重启之后自定义分辨率又没了如果你确认脚本写了、服务也启了重启还是不行最可能的坑是脚本执行的时机太早——图形环境还没完全起来,xrandr找不到显示输出直接静默失败。解决办法是在脚本开头加个延时比如sleep 5或者把服务里的Aftergraphical-session.target改成Afterdisplay-manager.service确保显示管理器先启动。我自己踩过这个坑加延时之后一发解决问题。另外要留意.xprofile和systemd服务是否重复执行了同一批命令。重复newmode同一个名字会报错xrandr: Rename ...不影响结果但会刷屏建议在脚本里先xrandr --delmode清理掉旧模式再new。6.4 虚拟机/云服务器里怎么“改分辨率”前面提到的都是物理机场景。虚拟机里改分辨率的诉求往往不是显示器而是远程桌面窗口大小。VMware和VirtualBox装了增强工具之后会自动适应窗口但如果遇到不自动适应的情况在Ubuntu虚拟机里手动设置分辨率的方法是xrandr --output Virtual1 --mode 1920x1080VirtualBox的输出接口名通常是Virtual1VMware可能是Virtual1或者类似命名。如果没有所需模式也用cvt大法添加。如果是云服务器或纯命令行环境根本没有显示器修改分辨率的意义其实是给Xvfb或者虚拟显示指定屏幕大小。例如启动Xvfb时Xvfb :1 -screen 0 1920x1080x24 这种场景下你不需要xrandr因为Xvfb自己就把分辨率定好了。6.5 WSLg里分辨率不对Windows Subsystem for LinuxWSL里的Ubuntu如果装了GUI应用用的是WSLg提供的RDP后端分辨率跟随Windows窗口自动变化不需要手动设置。如果出现应用窗口大小和屏幕不匹配可以尝试在Windows窗口标题栏调整窗口大小或按下最大化按钮。这部分跟传统Ubuntu修改分辨率不是同一个概念不用费劲去折腾xrandr。6.6 双系统下NVIDIA驱动与原分辨率匹配双系统用户在Ubuntu下最容易遇到的一个问题Windows下2560x1440正常Ubuntu下最高只有1920x1080。这种十有八九是NVIDIA闭源驱动没装好系统跑在nouveau开源驱动上而nouveau对较新的显卡支持不完整分辨率识别保守。解决方式和分辨率本身没关系先装好官方驱动sudo ubuntu-drivers autoinstall sudo reboot回到桌面后再用显示器设置或nvidia-settings调整分辨率基本都能解开限制。如果装完驱动还是不行再检查显示线和接口DP 1.2以上、HDMI 2.0以上才能跑满2K 144Hz这一点Ubuntu和Windows的物理要求完全一致不是软件能凭空变出来的。7. 三个值得记住的实操总结第一次在黑屏状态下手忙脚乱的时候最能感觉到一个道理的重量修改分辨率这件事本质是在跟系统的显示栈协作不是在跟它打架。先查协议、再查输出接口、然后查驱动这几个排查顺序清楚了绝大多数问题都能定位到具体环节。我现在给自己的常用机器写了一个set-resolution.sh脚本脚本里先自动检测输出接口然后判断模式是否存在不存在就cvt生成再addmode最后实测成功才写入持久化配置。整个流程跑下来不到十秒比每次开图形界面翻设置快得多。你把第一条命令xrandr的输出存到笔记里下次出问题照猫画虎就能很快解决。最后再分享一个小技巧改分辨率之前先在终端里敲一下xrandr并截图保存。这一条信息是后面所有排错的基础很多人一黑屏就手忙脚乱就是压根不记得自己原本用的是什么分辨率。先知道自己在哪才知道要往哪走这个原则不只在改分辨率时适用。