Blog from August, 2020

手里有一个工控机想读一下串口数据,结果装了 Ubuntu、CentOS 7 都不能正常显示用户界面,换了 CentOS 8 显示了一个灰色的界面,不能登录。

实际上我也很少在 Linux 下使用用户界面,只是现在想给别人用这个系统的浏览器,不得不尝试一下,再说遇到问题不解决总是疙瘩。

起初怀疑是驱动层的问题,查看的 drm 和 i915 的两个模块,尝试打印一些详细日志:在 grub 的 GRUB_CMDLINE_LINUX 加入一下配置项目例如 drm.debug=0x1e

实际上安装到 CentOS 8 的时候已经能够正常显示一些内容,而且 i5-4210U 已经是比较早的 CPU 了,核显的支持应该不会出问题。

考虑在 X Window System 相关的软件中寻找问题。X server 是 Linux 界面系统的服务端,负责实现 X 协议并与 drm 层交互等。

在 /var/log/Xorg.0.log 里找到了如下的日志:

[   114.183] (II) intel(0): Using Kernel Mode Setting driver: i915, version 1.6.0 20190619
[   114.195] (--) intel(0): Integrated Graphics Chipset: Intel(R) HD Graphics 4400
[   114.195] (--) intel(0): CPU: x86-64, sse2, sse3, ssse3, sse4.1, sse4.2, avx, avx2; using a maximum of 2 threads
[   114.196] (==) intel(0): Depth 24, (--) framebuffer bpp 32
[   114.196] (==) intel(0): RGB weight 888
[   114.196] (==) intel(0): Default visual is TrueColor
[   114.196] (II) intel(0): Output eDP1 using monitor section Monitor0
[   114.197] (**) intel(0): Found backlight control interface intel_backlight (type 'raw') for output eDP1
[   114.197] (II) intel(0): Enabled output eDP1
[   114.197] (II) intel(0): Output HDMI1 has no monitor section
[   114.197] (II) intel(0): Enabled output HDMI1
[   114.197] (II) intel(0): Output DP1 has no monitor section
[   114.197] (II) intel(0): Enabled output DP1
[   114.197] (II) intel(0): Output HDMI2 has no monitor section
[   114.197] (II) intel(0): Enabled output HDMI2
[   114.197] (--) intel(0): Using a maximum size of 256x256 for hardware cursors
[   114.197] (II) intel(0): Output VIRTUAL1 has no monitor section
[   114.197] (II) intel(0): Enabled output VIRTUAL1
[   114.197] (--) intel(0): Output eDP1 using initial mode 1920x1080 on pipe 0
[   114.197] (--) intel(0): Output HDMI1 using initial mode 1920x1080 on pipe 1
[   114.197] (==) intel(0): TearFree disabled
[   114.197] (==) intel(0): Using gamma correction (1.0, 1.0, 1.0)
[   114.197] (==) intel(0): DPI set to (96, 96)

可以看到实际输出到了两个端口 eDP1 和 HDMI。

我的外置显示器连接到了 HDM1。考虑到这种工控主机实际上是从笔记本 oem 方案修改简化的,一般来说 eDP 就是笔电的内置显示器输出口。

[root@bpc ~]# ls -l /sys/class/drm/
total 0
lrwxrwxrwx. 1 root root    0 Aug 18 21:11 card0 -> ../../devices/pci0000:00/0000:00:02.0/drm/card0
lrwxrwxrwx. 1 root root    0 Aug 18 21:11 card0-DP-1 -> ../../devices/pci0000:00/0000:00:02.0/drm/card0/card0-DP-1
lrwxrwxrwx. 1 root root    0 Aug 18 21:11 card0-eDP-1 -> ../../devices/pci0000:00/0000:00:02.0/drm/card0/card0-eDP-1
lrwxrwxrwx. 1 root root    0 Aug 18 21:11 card0-HDMI-A-1 -> ../../devices/pci0000:00/0000:00:02.0/drm/card0/card0-HDMI-A-1
lrwxrwxrwx. 1 root root    0 Aug 18 21:11 card0-HDMI-A-2 -> ../../devices/pci0000:00/0000:00:02.0/drm/card0/card0-HDMI-A-2
lrwxrwxrwx. 1 root root    0 Aug 18 21:11 renderD128 -> ../../devices/pci0000:00/0000:00:02.0/drm/renderD128
-r--r--r--. 1 root root 4096 Aug 18 21:11 version

工控机上输出只有一个 HDMI 和一个 VGA,但是实际上还有其他接口,执行以上命令可以看到显卡连接的所有接口。

在搜索 i5-4210U 问题的时候,在网上也看到挺多笔记本 Linux 显示的问题。其中很多建议禁用 LVDS-1。

实际上这也算一种过时的方案:旧版本的 Linux 可能不识别 eDP 这种接口,所以认为是 LVDS-1。在这里我直接禁用了 eDP-1:

GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet video=eDP-1:d video=HDMI-A-1:e"

另外一种就是修改 Xorg.conf 的方案(没有尝试):

Section "Device"
    Identifier "You can write anything here"
    Driver "<your Xorg display driver name here>"
    Option  "Monitor-eDP-1" "Nonexistent monitor"
EndSection

Section "Monitor"
    Identifier "Nonexistent monitor"
    Option "Enable" "false"
EndSection

参考:

https://access.redhat.com/discussions/3211901

另外,在桌面不能用的情况下拿 VNC 试了试可以访问。

事后简单看了下 VNC Server 的原理,对于应用程序来说,Xvnc 相当于 X server。而渲染后的结果由 tcp 协议传输到了用户端。用户端也通过网络传输了用户的操作。

Linux 的图形界面似乎永远不是那么好用,还是用命令行比较舒服。