手里有一个工控机想读一下串口数据,结果装了 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 的图形界面似乎永远不是那么好用,还是用命令行比较舒服。