问题的由来
为了提高生产力,特别搞了个双屏(笔记本 LVDS + VGA),但是最佳分辨率是1280x1024的VGA显示器在archlinux系统里面最高分辨率只有1024x768。导致的结果就是显示出来的图像和文字都怪怪的,跟笔记本电脑显示器上面的大小不一致,这样一来眼睛就会非常的疲劳。
一路折腾
由于在KDE下的各种设置都没效果,所以本着不搞定这个问题不睡觉了精神,熬夜无数去追寻答案,试图搞出一个解决方案来。一路折腾,折腾得到了一些解答:
VGA连接上笔记本之后,没有被显卡驱动正确识别,显卡只知道又有个显示器连接上来了,能传输显示的数据,但是不能传输控制数据(控制显示器黑屏,获取显示器EDID信息等)。所以结果就是显卡按照1024x768的默认安全的分辨率输出显示信号,而系统里面对于VGA的显示模式,也只有最高1024x768的模式,所以KDE里面的display设置也就只能设置成了1024x768.
路上研究了下EDID,然后沿着「显卡驱动」「Xorg」「KDE」的途径一个一个“排查”。
路上先研究了下archlinux系统Xorg下面的ati显卡驱动,闭源私有驱动已经不支持笔记本上若干年前的老显卡了,而开源显卡驱动是支持的,而且archlinux上面还说了开源显卡对多屏(multihead)的支持更好。所以结果就是显卡驱动这方面不能干什么。
路上又跑去看Xorg的相干内容,发现「可以在KMS或者Xorg.conf文件里面增加自定义的EDID文件」,于是跑去了windows系统搞了个VGA的EDID信息。先试了下KMS里面添加EDID文件,结果没有反应。然后又试试添加了xorg.conf文件里面,试了几次,有的没有反应,有的直接不能进入X界面(KDE当然不能启动了。。)
最后路上去搞了搞KDE系统本身,倒是发现了display存储的显示配置信息(./KDE4/share/config/krandr)。不过发现修改这个文件也不起作用。
柳暗花明又一村 发现xrandr的强大
路上在各处追寻问题的时候,发现原来xrandr可以直接定义显示器的显示模式,然后试了试,感觉非常棒!
比如这篇文章就说了,如何在Linux下设置屏幕分辨率。简单讲步骤有这些:
使用cvt命令生成VGA最佳分辨率的显示模式(1280x1024)
$cvt 1280 1024
输出:
\# 1280x1024 59.89 Hz (CVT 1.31M4) hsync: 63.67 kHz; pclk: 109.00 MHz
Modeline "1280x1024_60.00" 109.00 1280 1368 1496 1712 1024 1027 1034 1063 -hsync +vsync
’modeline‘这行就是我们下面要用到的显示模式 "1280x1024_60.00" 是显示模式的名字,下面我们可以重命名
给系统添加1280x1024的模式
#xrandr --newmode "1280x1024" 109.00 1280 1368 1496 1712 1024 1027 1034 1063 -hsync +vsync
将这个模式添加到VGA显示器的显示模式中,这样VGA就可以使用这个显示模式来显示内容了。首先使用
xrandr
命令获取VGA显示器在系统中的名称,路上的VGA显示的名称是VGA-0。然后执行:
xrandr --addmode VGA1 "1280x1024"
- 最后在KDE里面设置或者直接使用xrandr设置VGA显示器的显示模式
待解决的问题
但是,xrandr只能存在本次X session下,不会保存在系统中。所以重启之后...回到解放前..
解决方法上篇文章也说了,可以添加自启动脚本。但是在KDE下面添加的时候要注意的是,如果用KDE自带autostart添加,一点要选择在KDE启动之前执行(pre-KDE)。按照这种方法,成功为VGA添加了1280x1024的模式。但是上面提到的KDE配置信息不认,最后的结果就是恢复到了KDE桌面显示的安全模式(双屏输出,LVDS克隆VGA显示内容)。然后只能手动的在KDE设置下面更改分辨率和显示模式(这时候又1280x1024的选项)
所以最后的问题是:如何让xrandr的信息被保存下来并正确配置KDE。
上面的问题实际将xrandr配置信息直接写到自启动脚本去,然后让KDE去调用这个脚本就行。虽然这样显示器会出现闪烁,但是总比每次手动修改容易!