ARTICLE DETAIL

资讯详情

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

银河麒麟分辨率调不动?xrandr自定义模式与黑屏自救全解

银河麒麟分辨率调不动?xrandr自定义模式与黑屏自救全解 如果你和我一样在银河麒麟上插过外接显示器大概率遇到过这种场景系统设置里分辨率列表只剩 1024x768 和 800x6001920x1080 就像被系统遗忘了或者接上会议室的老投影仪输出的画面拉伸变形怎么调都找不到合适比例。这时候桌面设置界面基本帮不上忙但别急着重装驱动——X11 下这类问题的标准解法是xrandr银河麒麟虽然改成了国产化系统但桌面层依然是 Xorg/X11xrandr这套机制完全通用。从查看当前显示器支持哪些分辨率到临时切换一个不存在于列表的模式再到把自定义分辨率固化进系统配置让重启不失效我会按实际排障的顺序把xrandr的用法完整走一遍。如果你是系统运维、信创终端管理员或者只是普通用户想解决分辨率选项缺失的问题这篇都适用。黑屏怎么救、报错BadMatch怎么查、开机怎么自动加载这些坑我也会逐一说清楚。1. 先弄清银河麒麟上分辨率调不动的三种典型原因1.1 最常见的现象不是分辨率没有而是系统读不到很多人遇到分辨率问题时第一反应是显卡驱动坏了。实际上银河麒麟桌面出现分辨率异常大多数情况下驱动本身没大问题问题出在显示输出的协商环节。显示器通过 HDMI、VGA、DP 线缆连接后显卡要读取显示器里存储的 EDID 信息——一个包含支持分辨率、刷新率、物理尺寸等参数的扩展数据块。如果 EDID 读取失败、被干扰或者被转接头翻译错了Xorg 就只能按保守默认值输出分辨率列表里自然只剩几个基础选项。我自己在办公机上接过一条劣质 HDMI 转 VGA 线开机后显示正常但分辨率最高只有 1280x1024。换一根带芯片的双向转接线EDID 能完整读回来2K 选项立刻出现在列表里。所以排查顺序很重要先换线、换口、直接插拔一次看有没有变化再谈软件层。1.2 第二个元凶显卡驱动没加载对或加载成通用框架同样一块 NVIDIA 显卡或 AMD 显卡在银河麒麟上如果没装对应闭源驱动系统会退回fbdev或vesa这类通用驱动。这些驱动的能力非常有限只能输出最基础的 VESA 标准分辨率GPU 的真实模式列表根本不会暴露给 Xorg。检查方法很简单打开终端执行lspci | grep VGA确认显卡型号后再看系统实际加载的驱动glxinfo | grep renderer如果输出里带着llvmpipe或者末尾是Software Rasterizer说明 3D 加速没起来显示驱动大概率不是硬件厂商的原生驱动。此时 xrandr 能看到的模式列表也会明显偏少。先解决驱动加载再谈分辨率调整。银河麒麟的应用商店里有部分驱动包但内核版本对不上时容易踩坑我通常建议优先用厂商提供的 deb 包或压缩包安装。1.3 第三个原因桌面控制面板只是前端它掩盖了真实信息麒麟桌面的显示设置打开后很多版本只列出系统已经启用过的模式不会主动扫描所有潜在可用的 timing。这有点像手机相册默认只显示最近项目而 xrandr 是那个全部文件入口。理论上某个分辨率显示器硬件完全支持但控制面板没显示就不代表它不存在。银河麒麟桌面基于 UKUI/MATE 体系底层走的是 XRandR 协议控制面板只不过是把xrandr的查询功能用图形界面包了一层。所以当你发现系统设置里找不到想要的分辨率时别急着灰心先打开终端跑一遍xrandr很可能你需要的模式正在列表里问题只是怎么把它激活而已。2. 现状摸底xrandr 输出的每一行分别代表什么2.1 基础查看命令与一次完整输出在应用 xrandr 之前一定要养成先查询的习惯。什么都不带直接运行xrandr典型输出如下我用一台联想台式机接 HDMI 显示器做示例Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 16384 x 16384 eDP-1 connected primary 1920x108000 (normal left inverted right x axis y axis) 344mm x 194mm 1920x1080 60.02* 59.97 1680x1050 60.00 1400x1050 60.00 1280x1024 60.00 1280x800 59.81 1280x720 60.00 1024x768 60.00 800x600 60.00 640x480 59.94 HDMI-1 connected 1920x108019200 (normal left inverted right x axis y axis) 521mm x 293mm 1920x1080 60.00* 59.94 1600x900 60.00 1280x1024 60.00 1280x720 59.94 1024x768 60.00 800x600 60.00 640x480 59.94第一行的含义最容易被忽略。current 1920 x 1080是 X 服务当前输出的总画布尺寸maximum 16384 x 16384是 GPU/驱动允许的最大帧缓冲这个值限制了你能添加多大自定义分辨率。有些旧驱动上限被写得很小比如最大只能到 4096x4096那你想加 5120x1440 就根本没戏再折腾 newmode 也没用。第二段开始是每个显示接口的状态。connected表示有设备接入且有信号disconnected表示接口空闲或线缆没检测到信号。eDP-1、HDMI-1这类是输出接口的名字同一台机器叫法可能有差异。2.2 接口命名规则与状态标记速查输出接口的命名有规律可循知道规则后就不会把命令写错。接口类型常见命名备注笔记本内屏eDP-1、LVDS-1、DSI-1一般固定存在HDMIHDMI-1、HDMI-A-1多路时递增数字VGAVGA-1、VGA-2老投影仪常见DP/DPDP-1、DisplayPort-1部分机型叫 DP-0扩展坞/USB-C 转接DP-2、DP-3、HDMI-2取决于 GPU 重新枚举的端口名每行接口下方是模式列表。模式行的三个关键标记要记住*表示当前正在使用的模式表示该接口的推荐模式既无*也无的就是可用但还没启用的模式。所以当你有1920x1080的标记时基本可以确定显示器原生支持这个分辨率问题只是切换过去而已。2.3 几个值得一用的进阶查询参数基础xrandr输出已经很直观但排障时往往需要更细的信息xrandr --listmonitors输出当前逻辑显示器信息包括编号、尺寸、位置适合多屏布局核对。xrandr --verbose展示每个输出的详细状态包含 EDID 是否加载成功、亮度参数、连接类型重要还能看到scaling mode等相关信息。xrandr --dryrun --output HDMI-1 --mode 1920x1080假装执行切换但实际不生效用来验证命令本身有没有写错。如果你发现某个接口显示disconnected但明明插着屏幕可以看看--verbose输出里EDID那段是不是invalid。EDID 状态异常往往是线缆质量、转接头供电不足的信号而不是系统配置问题。3. 临时修改分辨率命令背后的参数逻辑与黑屏自救3.1 一条命令完成切换--output、--mode 与 --rate 的关系xrandr修改分辨率的语法并不复杂最常用的形式是xrandr --output HDMI-1 --mode 1920x1080 --rate 60这里的逻辑拆开看很清晰--output指定你想改的是哪个接口--mode指定模式名不一定非要写分辨率数字也可以直接写模式列表里的完整名称比如1920x1080_60.00--rate指定刷新率。只要模式列表中已经存在你想要的分辨率这条命令就能立刻生效不需要额外添加任何东西。另一个常见写法是xrandr -s 1920x1080。这个简化参数会自动把有该分辨率的主输出切过去适合单显示器场景。但多显示器时我建议始终用--output否则 xrandr 可能把模式套在错误的接口上。切换前有个小细节值得养成习惯先查看当前哪个接口处于connected状态。笔记本用户尤其要注意明明插的是投影仪接口名却是HDMI-1而不是VGA-1如果接的是扩展坞可能还要先确认坞站的 DP 口被枚举成了DP-1-1之类带编号的名字。命令写错接口名xrandr 会直接报output ... cannot find不会造成任何实际影响。3.2 切换后黑屏怎么办先别按电源按这个顺序救这是我被问得最多的问题之一。改分辨率后屏幕突然黑了、或者进入无法使用的花屏状态大多数人第一反应是强制重启。但在 X11 下请先给系统 10 到 15 秒的观察时间——部分桌面环境包括麒麟的 MATE/UKUI 桌面在应用了新显示设置后会有短暂的信号重新握手过程这段时间黑屏是正常的。如果超过 15 秒还黑着再进入自救流程。最稳妥的自救路径是# 1. 按 Ctrl Alt F2 切到字符终端tty # 2. 在终端里直接用 xrandr 把输出切回一个已知安全的分辨率 xrandr --output HDMI-1 --mode 1024x768 # 3. 按 Ctrl Alt F7或 F1切回图形桌面在这个流程中tty 与图形桌面的 X server 是共享的xrandr在 tty 下执行同样能修改正在运行的 X 会话这是 X11 的设计特性。如果切到终端后xrandr命令提示找不到HDMI-1先查一下xrandr不带参数时的输出确认接口名再执行。只要模式切换没有涉及不可修复的硬件故障这个方案几乎能救回所有黑屏。如果担心改错了回不来还有一个更聪明的做法执行切换命令时顺手加一个自动回滚的兜底xrandr --output HDMI-1 --mode 1920x1080 sleep 5 xrandr --output HDMI-1 --mode 1024x768每 5 秒自动切回安全分辨率适合在不确定某个模式是否可用的场合做试探。确认没问题后再删掉sleep和后面的回滚命令。3.3 多显示器场景主屏、副屏、镜像和扩展一次说清--mode只是修改单个输出的分辨率但多屏用户还需要处理画面布局。xrandr 支持最常用的四种布局操作扩展桌面xrandr --output HDMI-1 --right-of eDP-1把副屏摆到主屏右侧并各自保持独立分辨率。镜像画面xrandr --output HDMI-1 --same-as eDP-1两个屏显示相同内容适合做演示。指定主屏xrandr --output HDMI-1 --primary把系统任务栏、快捷键弹窗等放到该屏。单独关闭某屏xrandr --output HDMI-1 --off比拔线干净也能省电。多屏情况下每个输出都可以单独执行--mode比如笔记本内屏用 2560x1440外接屏用 1920x1080完全互不影响。需要注意当两个屏幕分辨率不同时可以配合--scale参数做缩放对齐比如xrandr --output HDMI-1 --scale 1.2x1.2--scale 1.2x1.2表示把该输出实际帧缓冲放大 1.2 倍再输出适合用 1080p 的副屏对齐 2K 主屏的缩放比例。不过这个功能有一定副作用显示会略糊非必要不常用。4. 自定义分辨率从 cvt 到 newmode 的完整添加链路4.1 为什么系统模式列表里没有我需要的分辨率有些显示器比较老实它的 EDID 里只列出了少数几个标准模式比如老式 1024x768 面板有些则是新面板支持 2560x1440但转接头或采集设备把 EDID 过滤成了 1080p。不管哪种情况Xorg 只会把 EDID 中存在的模式加进列表这也是模式列表不全的根本原因。自定义分辨率的思路就是绕过 EDID手动告诉显卡请你输出一个这样的信号。 最安全、兼容性最好的方式是用 VESA 标准中的 CVT 算法计算模式参数再通过 xrandr 注入到图形服务器里。系统没有的分辨率就用这个链路手动添加。4.2 cvt 命令计算模式参数那些数字代表什么首先生成目标分辨率的 mode linecvt 1920 1080 60输出类似Modeline 1920x1080_60.00 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync vsync这一串不是随机数字里面包含像素时钟173.00 MHz、水平前肩/后肩/同步宽度2048、2248、2576、垂直同步参数1083、1088、1120以及同步极性-hsync vsync。这些参数共同描述了一个 60Hz 的 1080p 信号时序绝大多数支持 1080p 的显示器都能接受这个标准 timing。如果你需要 30Hz 而不是 60Hz可以执行cvt 1920 1080 30像素时钟会大幅下降模式参数随之变化。老投影仪或者通过采集卡连接的场景30Hz 往往比 60Hz 更容易点亮。而gtf命令用的是另一套 GTF 标准跟 CVT 互不兼容一般以 CVT 的cvt为准即可。4.3 三步注入newmode、addmode 与最终切换拿到 Modeline 后完整的添加过程分三步# 第一步把模型参数注册进 X server 的模式库 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执行第一、二步时不会有任何显示变化只有第三步真正切换过去。建议先把三步命令写在一个脚本里再执行避免中途打错一个字符导致后面无法接续。一旦模式被--newmode注册它就会出现在该会话的 xrandr 模式列表里此时你加不加号都能被识别。注意模式名建议直接用 cvt 生成的名字比如1920x1080_60.00不要自定义名字否则后续 Xorg 静态配置引用时容易对不上。如果某次场景用完想删掉模式反向操作即可xrandr --delmode HDMI-1 1920x1080_60.00 xrandr --rmmode 1920x1080_60.004.4 BadMatch 报错排查不是命令写错是设备不配合执行--addmode或--mode时报BadMatch是自定义分辨率最常见的失败信号。它表示 X server 认为你要添加的模式与硬件不兼容。我总结了一下最常踩到这几个原因输入的模式名与 newmode 注册时不一致尤其是漏了引号或空格X server 找不到模式会直接拒绝。显示器/转接头/采集链路的实际带宽不够比如 VGA 老线在长距离传输下无法承载高时钟频率。添加的模式像素时钟超过了 GPU/驱动允许的最大值此时第一行的maximum字段会给出线索如果最大画布只有 4096x4096那你添加高于这个尺寸的模式基本必然报错。输出接口正在被另一个会话占用少见但远程桌面和本地同时操控时可能出现。排查手法可以这么做先在另一个输出接口上执行--addmode比如从HDMI-1换到eDP-1如果同样报BadMatch基本锁定是模式本身超出硬件能力如果只有特定接口报错则问题在那个接口的线缆或转接链路上。用xrandr --dryrun --output ... --mode ...做预演排查也是一个好习惯。4.5 添加分辨率时容易被忽略的细节第一个细节添加的刷新率未必需要和系统默认完全一致。有些显示器 EDID 里只声明了 59.94Hz而 cvt 给的是 60Hz 标准值此时有些挑剔的屏幕会沿用 59.94xrandr 会显示为59.94 *这不影响使用。只要画面不抖、不闪刷新率数字差 0.06Hz 完全不用纠结。第二个细节如果cvt生成的模式在你的屏幕上显示模糊优先排查分辨率是不是没有和屏幕物理像素做 1:1 映射最常见的是笔记本内屏有 HiDPI 缩放。可以配合xrandr --dpi 96调整 DPI 值也可以不管它——应用层字体缩放和 xrandr 的 DPI 设置是两个维度很多人混在一起调越调越乱。第三个细节别一口气添加十几个自定义模式。每加一个模式都会写入 X server 的显示配置添加过多会影响启动速度还会让 xrandr 列表变得难以阅读。只要把你实际用的那几个模式加好就收手保持系统干净。5. 让分辨率永久生效三种持久化方式的对比与实操5.1 为什么重启之后 xrandr 设置会全部丢失xrandr 对模式列表和输出布局的所有修改都是发生在当前运行的 X server 内存里的。一重启或注销整个 X server 被重新拉起之前 newmode 注册的模式自然烟消云散。这不算缺陷是 X11 的机制设计如此——它希望系统每次启动时都按固定的静态配置来组织显示把动态微调交给用户。所以想让自定义分辨率真正固定下来只有两条路线要么把 Modeline 写进 Xorg 的静态配置文件要么把 xrandr 命令包装成登录时自动执行的脚本。两种路线各有适用场景下面逐一说明。5.2 方式A登录脚本自动执行 xrandr 命令最直觉的想法是把第三、四章的 xrandr 命令段放进一个脚本在图形会话启动时自动执行。创建/etc/profile.d/下的脚本不推荐因为 profile 只在登录 shell 中执行图形会话的启动时机未必能对上。更接近标准答案的路径是用户级.xsessionrc或桌面自启动项。最简单粗暴的写法是把以下内容追加到~/.xsessionrc# ~/.xsessionrc 在 X session 启动前被读取 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 还没枚举出来拔掉显示器开机稍后才插上命令会因为找不到输出而报错模式不会自动晚点再试。这种情况下你还需要额外延时或循环判断脚本复杂度就上来了。5.3 方式BXorg 静态配置里写 Modeline最稳妥如果目的是系统级、对所有用户都生效、开机即恢复我建议用 Xorg 配置。创建/etc/X11/xorg.conf.d/10-custom-resolution.confSection Monitor Identifier HDMI-1 Modeline 1920x1080_60.00 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync vsync Option PreferredMode 1920x1080_60.00 EndSection如果你的接口名在不同机型上不固定可以把Identifier换成更通用的匹配方式比如用VendorName和ModelName匹配特定显示器或干脆省略 Identifier 让它全局生效。但全局生效的风险是如果你的电脑还接过一台不支持 1080p 的老显示器切换过去后 X 会尝试套用这个 Modeline容易花屏所以还是建议绑定到具体接口。写好配置文件后重启或重新登录 X session。注意这个方式要求 X server 启动时就能解析 Modeline所以模式参数里的1920x1080_60.00这个名字必须和你在登录脚本里 newmode 时用的名字一致否则两套体系会各自注册两份模式混乱排查起来很头疼。5.4 方式C桌面自动启动项GUI 登录时执行如果你不想碰 xorg.conf也不想抢着改~/.xsessionrc还有个折中方案用桌面自启动目录。在~/.config/autostart/下创建resolution.desktop[Desktop Entry] TypeApplication NameCustomResolution Exec/home/你的用户名/bin/set-modes.sh X-GNOME-Autostart-enabledtrueset-modes.sh里的内容和 5.2 完全一样。这个方案的好处是只在图形桌面登录后执行给了桌面足够的时间完成设备枚举坏处是如果你用的桌面环境启动顺序特殊比如等待网络、等待外接显示器脚本可能在设备接好前运行完依然会失败。如果脚本失败可以在脚本开头加一句sleep 5再执行 xrandr缓解设备枚举时序问题。这个土办法实测下来比大多数 fancy 的等待机制都管用。5.5 三种持久化方式对比持久化方式生效层级适用场景缺点~/.xsessionrc脚本用户会话日常办公单机每个用户都要配时序敏感Xorg xorg.conf.d系统级 X server机房运维、固定机型需要重启 X按接口绑定需小心桌面 autostart用户 GUI 登录临时性更强、适合家用登录后才有时序上不如 xorg.conf按我的实操习惯系统级优先用方式B个人开发机用方式A遇到不想改系统配置的临时任务用方式C即可。6. 实战场景外接投影、远程桌面与虚拟机里的麒麟6.1 投屏演讲老投影仪死活没有对应分辨率投影仪是 xrandr 的高频场景。很多会议室投影仪只有 1024x768 或 1280x720 的固定物理分辨率接上后笔记本虽然能显示但画面比例拉伸字是全的但糊。这时候直接xrandr --output HDMI-1 --mode 1024x768 --rate 60切到投影仪的原生分辨率文字会立刻变清晰。如果投影仪支持 1080p 但系统列表里没有用第四章的方法先加模式再切换。注意做到一半黑屏是投屏常见的惊吓时刻直接按 3.2 的黑屏自救流程处理切回安全分辨率即可。另一个实用场景是接了一块分辨率高于笔记本内屏的显示器你想把主屏和外接屏以不同比例缩放对齐。比如笔记本是 125% 缩放外接屏是 100%可以只在 X 层面做--scale 1.25x1.25而不去改系统全局缩放这样窗口在两屏间拖拽时的尺寸感知会更一致。6.2 远程桌面win 客户端连接麒麟时分辨率被锁用 Windows 自带远程桌面连接银河麒麟有时会话分辨率会被锁死在 1024x768 或 1280x720。登录进去后执行xrandr你会看到虚拟显示器只有一个固定模式列表里根本没有更高的选项。这种情况下先尝试在远程客户端设置里改分辨率一般叫显示设置里选择全屏或自定义分辨率多数场景能解决问题。如果客户端调整无效可能是 xrdp 服务端的配置限制了会话画布安装的桌面会话模板里把分辨率写死了需要在 xrdp 配置中调整后重启服务。如果 xrdp 配置属于系统管理员管理的范围普通用户能做的事就是在会话里执行xrandr --output ... --mode 更高分辨率前提是虚拟显示器驱动支持添加模式。多数虚拟驱动只支持固定模式所以远程桌面下 xrandr 能发挥的空间有限——一般认为这是远端会话架构限制不是 xrandr 命令的问题。6.3 虚拟机里的银河麒麟分辨率上不去先看增强工具银河麒麟跑在 VMware 或 VirtualBox 里时分辨率上不去的概率比物理机高得多。原因也很简单默认的虚拟显卡只模拟了最基础的 VGA 显示器EDID 能力有限模式列表里可能只有 800x600 和 1024x768。这时候不要直接硬上 xrandr 自定义模式虚拟显卡的 mode 范围受虚拟硬件限制优先装好虚拟机增强工具VMware安装open-vm-tools-desktopVirtualBox安装 VirtualBox Guest AdditionsQEMU/KVM使用 virtio-vga 显卡并安装对应的 virtio 驱动装好后重启虚拟机再执行xrandr你会看到列表自动多了很多标准分辨率直接切换即可。如果增强工具装完还是缺分辨率再去考虑自定义模式。这个顺序很重要前者是重建 EDID 能力后者是强行注入时不兼容就报错。6.4 驱动层面的最后检查查日志比乱试命令高效所有 xrandr 手段都试过仍然失败时不要继续盲试。把精力转回驱动和 EDID 层面先查两个地方# 查询显卡驱动加载日志 dmesg | grep -i drm # 查询 X 图形服务是否有显卡相关报错 cat /var/log/Xorg.0.log | grep -i (EE)(EE)行如果出现screen 0 fails或者virtio_gpu之类的字样说明在更底层就有问题xrandr 层面的任何操作都是治标不治本。此时回到第一章的思路检查线缆、换接口、重装驱动把底层链路修通后再回来用 xrandr 微调。我自己经历过的案例一台麒麟工作站接双屏外接屏始终只有 1360x768所有 xrandr 添加模式都报BadMatch后来dmesg里发现是 Intel 核显在双屏高分辨率下撞到了带宽限制换了一个 DP 接口后 4K 直接能上。显卡某些输出口支持的带宽是不同的这个问题远比想象中常见。最后分享一个配合 xrandr 用着很顺的小技巧把你自己常用的几条设置命令整理成/usr/local/bin/res这个脚本以后执行res就能一键恢复到熟悉的分辨率组合比每次敲一长串参数靠谱得多。因为 xrandr 虽然强大但命令字符串长、接口名难记一旦环境切换多次靠脑子背命令迟早把某个参数记串。脚本化之后你的常用显示配置就变成了一条短命令既降低出错率也方便其他同事接手你的机器。
返回列表