快速回忆要点
# 获取display
for i in {0..10}; do echo; echo "---Display $i:"; xrandr --display :$i; done
# 根据display设置分辨率、旋转和刷新率
xrandr --display :1 --output VGA-1 --mode 1600x900 --rotate normal --rate 60
重要坑:分辨率设置必须包含在硬件支持里面,以及分辨率如何配合rotate之后需要折算后看新的是否包含,否则会黑屏
背景
显示器连接服务器,想调整为横屏显示。于是在Anolis中设置了竖屏显示,结果就黑屏了,但是ssh可以连接。经过一定摸索。特此记录如何解决。
结论
ssh中执行xrandr命令修改分辨率、旋转和刷新率。
结社找到使用display:1 并且叫做VGA-1
xrandr --display :1 --output VGA-1 --mode 1600x900 --rotate normal --rate 60
参数说明:
– display 指定虚拟显示器(对于gdm或者x11来说的一个虚拟显示器)
– output 指定对应的显示器名字
– mode 指定分辨率,需要xrandr --display :1列出来的数据
– rotate 指定旋转方向。总的四个,normal、inverted(180°旋转)、left、right
注意上面的display根据后文的方式获取,包括output名字,以及支持的mode
坑
坑1:xrandr在ssh中需要指定display参数来说明用哪个虚拟的display
坑2:指定rotate之后如果实际显示器不支持,可能无法显示。(我本次就是落在这里了)。比如800x600,指定left之后假设是600x800,如果显示器不支持这个,配置能够生效,但是实际显示会异常。具体显示器支持哪些直接使用xrandr进行配置
坑3:注意在不同用户模式下执行后获得的display以及实际的显示器是不一样的。
避坑指南:
重要坑:分辨率设置必须包含在硬件支持里面,以及分辨率如何配合rotate之后需要折算后看新的是否包含,否则会黑屏。
常见问题处理
xrandr报错:Can’t open display
原因:ssh中xrandr无法读取环境变量DISPLAY,xrandr无法配置数据。默认的display 是:1
解决办法:
- 在非ssh执行
- 使用xrandr的–display参数,详细参考后文
如何查询使用的是哪个display?注意使用对应的账户
一定要注意,使用什么账户登录,就在对应账户查询。比如在root查询其他的。
执行下面的命令遍历10个display,找到有显示的
for i in {0..10}; do echo; echo "---Display $i:"; xrandr --display :$i; done
这里是root查询出来的(root我用vnc登录的):这里就是display2。
这里是登录账户查询出来的:
其他要点
- 不同用户,不同显示器,使用的display是不一样的。名字也不一样
- GDM(GNOME Display Manager)是 Linux 系统中的一个登录管理器,它通常用于启动 GNOME 桌面环境。
- EDID(Extended Display Identification Data): 每个显示器都包含一个存储在其内部的 EDID 数据,其中包含了有关显示器的详细信息,如分辨率、刷新率、制造商等。
- 重启GDM的方式:
sudo service gdm restart
或者sudo systemctl restart gdm
,如果修改某些配置可能需要重启gdm - 查看系统使用的窗口管理工具是gdm还是display-manager:
systemctl list-units --type=service | grep display-manager
以及systemctl list-units --type=service | grep gdm
- gdm和x11类似于一个前端一个后端,gdm是前端,x11是后端
- 关闭所有x11的方式:
killall Xorg
。查看当前启动的xorg:ps -aux |grep -i xorg
- XRandR是X Rotate and Reflect Extension(改变大小与旋转扩展)的缩写,用来在命令行界面中对Linux系统中的X窗口系统的多屏幕做出一些设定的软件,能更改外接屏幕的大小、分辨率等, 参考:https://zh.wikipedia.org/zh-cn/XRandR
- 需要一台对比显示器,尤其是低分辨率的显示器
- 高分辨率的显示器可能服务器不支持
- 结合linux驱动中的framebuffer以及显示器驱动刷新方式作为分辨率相关的辅助信息进行分析
最后
本文记录了一次服务器因为修改显示器旋转造成黑屏的问题。并且针对此需要理解x11、gdm、xrandr的关系以及xrandr命令如何获取显示器配置等信息,以及如何通过xrandr配置linux的分辨率、旋转、刷新率等信息。并且尝试理解xrandr作为一个配置工具,从display中看到了session、display、显示器硬件的EDID等关系,进一步看到Linux如何将显示器硬件与显示"display桌面"解耦,如何将不同用户管理display、如何将桌面管理与桌面会话(session)解耦(gdm与x11关系)、如何将EDID与硬件绑定作为ID等相关信息。进一步看到了字啊工程上解耦带来了生态的繁荣。比如桌面管理可以有多个方式等进一步。
大道至简,Linux显示分层为硬件、session、display、gdm、cmd等多个维度。对于软件开发设计也是一个不错的范例。