0 避坑提醒

第4部分的解决办法,很多网友反映,会导致物理显示器不能用!请仔细阅读文章里的解决办法。

请仔细阅读第5部分的特别注意事项,虚拟显示器会和物理显示器冲突。让虚拟显示器和物理显示器同时工作的解决办法,请参考第5部分,合并虚拟显示器和物理显示器的 xorg.conf 文件

请大家慎用虚拟显示器,并提前下载好 SSH 和 远程控制软件,并设置好开机自动启动,备份好xorg.conf 文件,当物理显示器不能用时,这些措施可以进行补救恢复。

1 问题背景:

疫情以来,依赖远程办公,远程的机器是 ubuntu 20.04系统,nvidia 驱动版本原先是 470.103,系统自己更新版本后,显卡用不了,万恶的自动更新啊。

另外,因为是远程,我的 ssh 是可以一直远程连接的,我所有的操作是通过 ssh 实现的。因为远程的机器联网时间有限制,一旦断网,ssh 也断了,那么我就彻底没办法解决了。所以必须要赶在远程机器断网之前解决问题,进入图形界面,这样就可以延长联网时间,确保这台机器一直联网。

所以,我必须要通过 ToDesk 或者向日葵等软件,进入图形界面。

我的物理显示器一直是连着机器的,只是把屏幕关闭了,让屏幕黑屏,因为怕一直亮着伤屏幕,这个时候还是可以正常用 ToDesk 或者向日葵等软件远程连接的。

命令行输入

nvidia-smi

报错信息: Failed to initialize NVML: Driver/library version mismatch

这个问题,一般重启机器就可以解决,因为我是远程,就在命令行输入

sudo reboot

远程重启机器, 重启之后,问题来了。

2 问题描述:

重启之后,远程的显卡是可以使用的,输入

nvidia-smi

是可以正确显示显卡的状态的,说明远程的机器,显卡没有问题,但是这个时候,ToDesk 远程连接黑屏

显示提示为:当前系统并无桌面环境,或无显示器,无法显示远程桌面,您需要自行安装X11桌面环境,或使用终端文件功能。

这个时候以为是 ToDesk 软件出了问题,改用向日葵远程连接试了一下,向日葵远程连接上之后,直接黑屏,然后不到一秒直接断掉。

3 失败的解决办法:

3.1 重装图形界面

因为 ToDesk 提示无桌面环境,外加上我又搜索到和我情况相似的博客,就是下面这篇:

ubuntu服务器图形界面崩溃解决方案_florashiying的博客-CSDN博客_ubuntu图形界面崩了

看到唯一一个和我目前 ToDesk 错误提示一样的图片,我就简单断定是我的系统是图形界面出了问题,这是一个错误的判断

其实这个时候,我的 ToDesk 还能远程连接上,就是显示不出来画面,当我真正把图形界面卸载掉准备重装的时候,我发现,卸载掉图形界面之后,ToDesk里面远程的设备根本不亮, 像下面这样

而我之前,ToDesk 还能远程连接上,就是显示不出来画面,是下面这样,是蓝色的

 我折腾了一波,安装了 GUI 图形界面,安装了 gdm 管理器,以为是 gdm 管理器不起作用,又重启 gdm,折腾之后,发现还是老毛病, ToDesk 能远程连接上,但就是显示不出来画面。

也就是说,重装图形界面并没有解决问题。

3.2 重装 nvidia 驱动

经过上面失败的方法,还没有解决问题,我在想是不是驱动有问题,于是就卸载掉nvidia新驱动,重新手动安装驱动版本为 470.103 的 nvidia 驱动,因为这个版本我百分百确定和我的机器是适配的,之前没有出过问题。驱动安装参考这篇文章

Ubuntu20.04 11.1安装深度学习环境 (drivers + cuda)_WMSmile的博客-CSDN博客_ubuntu20.04安装cuda11.1

安装之后,失望地发现,并没有解决远程连接 ToDesk 等软件黑屏问题。但是,至少我排除了因为驱动版本导致的错误。

3.3  安装 vnc

经过上面失败的方法,我挫败感很强,过了一天,我又在想是不是 ToDesk 软件有问题,导致远程连接不上。因为这个时候明明图形界面是好的,虽然是远程的机器,我看不到,但是这些 ToDesk软件这类图形软件可以使用,说明图形界面是好的。问题出在哪里呢?我想换一个软件试试,向日葵试过了,不行,于是决定安装 vnc。这个决定起了关键作用,虽然没有解决问题,但是帮我了解了 xorg,提供了新的思路。

安装 vnc 的教程很多,眼花缭乱,我最终找到一个,亲身试验安装成功的教程,如下,在 B 站还有视频演示,这个教程非常详细。

打造基于 VNC 的 Ubuntu 20.04 的远程桌面_东方鹗的博客-CSDN博客

最后,vnc 是安装成功了,但是依旧不能使用,打开是灰色的,依旧失败了。但是我在这个过程中了解到虚拟显示器这个东西,这个成为解决问题的关键。

4 成功的解决办法之一(有缺点):


这个办法的缺点:物理显示器不能用!


上面说到,通过 vnc 了解到虚拟显示器这个东西,这个成为解决问题的关键。我判断既然远程的桌面坏掉了,我先修复远程桌面,于是,看到下面这篇文章,

x昨天晚上试到2点的,结果:发现删除xorg.conf就可以进入X了!!!! - Ubuntu中文论坛

我想到把 /etc/X11 文件夹下面的 xorg.conf 这个文件删掉,同时,我还删除掉了 xorg.conf.nvidia-xconfig-original.conf 这个文件。但是,还是没有解决问题。

我想既然修复不了原先的界面,那我直接新建一个虚拟界面。后来发现,正是这个想法,解决了问题。

有了新方向和搜索关键词,我打算新建虚拟显示器,通过搜索,找到一篇文章:

【LINUX】(Ubuntu)无显示器接入,使用虚拟显示器且远程控制 - 灰信网(软件开发博客聚合)

跟着文章做了一遍,不幸的是,打开 ToDesk,还是没有解决问题,依旧黑屏,这个时候,我还没有放弃,想着可能是这篇教程不适用我的机器,于是,又找到下面这篇文章:

Ubuntu 20.04 虚拟显示器 1080P 配置_江南土豆的博客-CSDN博客_ubuntu 虚拟显示器

正是这篇文章,解决了问题,让 ToDesk 软件重新连接上了远程桌面。

这篇文章和《【LINUX】(UBUNTU)无显示器接入,使用虚拟显示器且远程控制》这篇文章不同的地方,在 /usr/share/X11/xorg.conf.d/ 下面的 xorg.conf 文件内容当中。

下面,我把参考文献的步骤重复一次,并加入自己的经验

4.1 安装软件

通过终端安装虚拟显示器软件。

$ sudo apt-get install  xserver-xorg-core-hwe-18.04
$ sudo apt-get install  xserver-xorg-video-dummy

注意,这里 xserver-xorg-core-hwe-18.04 是18.04的,但是证实 ubuntu20.04 也是适用的。

4.2 添加配置文件

在 /usr/share/X11/xorg.conf.d/ 中添加 xorg.conf 文件。

sudo vim /usr/share/X11/xorg.conf.d/xorg.conf

因为 vim 不常用,经常忘记命令,这里补上需要用的 vim 命令

第一、打开vim后,要输入文本

需要进入插入模式,按 i 键,
就可以像在常见文本编辑器一样插入和删除文件的内容与文本。

第二、在文件中编辑完成后,要保存文件并退出vim

需要返回到命令模式,先按 Esc 键(如果按一次Esc键还没有返回到命令模式,那尝试按Esc键多次)。

接着再按 :wq 这三个键加上 enter

即可保存文件并退出VIM编辑器

在 vim 中输入下面内容,保存并退出。

Section "Monitor"
  Identifier "Monitor0"
  HorizSync 28.0-80.0
  VertRefresh 48.0-75.0
  # https://arachnoid.com/modelines/
  # 1920x1080 @ 60.00 Hz (GTF) hsync: 67.08 kHz; pclk: 172.80 MHz
  Modeline "1920x1080_60.00" 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -HSync +Vsync
EndSection
Section "Device"
  Identifier "Card0"
  Driver "dummy"
  VideoRam 256000
EndSection
Section "Screen"
  DefaultDepth 24
  Identifier "Screen0"
  Device "Card0"
  Monitor "Monitor0"
  SubSection "Display"
    Depth 24
    Modes "1920x1080_60.00"
  EndSubSection
EndSection

4.3 重启

重启计算

sudo reboot

之后,默认使用虚拟显示器。

问题就解决了,ToDesk 就可以直接远程连接桌面了。

这个办法的缺点就是物理显示器不能用了!这是在文章发出后,一些网友反馈的。

如果需要恢复物理显示器,通过 SSH 或者 远程软件把原来备份的 xorg.conf 文件恢复回来;更简单有效的恢复办法,参考网友 猫巷鱼港_lai 在评论里回复的方法,直接删除掉刚刚修改的 xorg.conf 文件,也可以恢复成物理显示器

这里再重新思考一下 ToDesk 显示的提示:当前系统并无桌面环境,或无显示器,无法显示远程桌面,您需要自行安装 X11 桌面环境,或使用终端文件功能。

很明显,我们排除了图形界面的桌面环境的问题,就剩下无显示器的问题了,通过添加虚拟显示器,我们成功的解决了 ToDesk 黑屏问题。同样,我还试验了向日葵远程软件,一样解决了向日葵的黑屏问题,可以重新正确显示桌面了。

5 特别注意事项:


成功的解决办法之二(物理屏和虚拟屏同时工作):


上述方案只针对远程连接的机器,因为虚拟显示器会和真实物理显示器冲突。

重启之后即使接入了真实显示器,也不会输出信号到真实显示器上。所以,针对真实物理显示器,应该需要再做一些调整。

目前,因为疫情,暂时无法接触到真实物理机器,这部分没有办法介绍,本文只是暂时解决了远程连接会黑屏的问题。

============================== 更 新 1====================================

一定要提前下载配置好 SSH ,并且让 SSH 开机自动启动,远程控制软件也要设置开机自动启动,因为重启之后,很多网友反馈说物理显示器不能用了,这样只能通过 SSH 和远程软件来拯救机器,如果 SSH 和远程软件没开,这个时候物理显示器不能用了,这个机器就没办法看到显示了。

还有非常重要的一点,在修改 xorg.conf 文件之前,一定要把 xorg.conf 文件备份,这样物理显示器不能使用的时候,通过 SSH 或者 远程软件把原来备份的 xorg.conf 文件恢复回来,恢复成能使用物理显示器的状态。

另外,参考网友 猫巷鱼港_lai 在评论里回复的方法,直接删除掉刚刚修改的 xorg.conf 文件,也可以恢复成物理显示器

注意,这种方法只能虚拟显示器和物理显示器二选一,不能同时工作。

=============================== 更 新 2 ====================================

很多网友问,怎么才能让虚拟显示器和物理显示器同时工作?

目前,因为疫情,我暂时无法接触到真实物理机器,也没机会尝试,这部分没有办法介绍。但是有个思路可供参考,主要是修改 xorg.conf 里面的配置文件。

思路如下:
如果能接触物理显示器,可以参考这篇文章:
Ubuntu 20.04 VNC 安装与设置 | 蓝鲸ROS机器人论坛
直接在xorg.conf文件里添加两块显示屏 Monitor0 和 Monitor1,这样既有虚拟显示器,又有物理显示器。

当然,xorg.conf 里面的配置文件怎么修改,可以参考原先备份的文件和虚拟显示器的文件,大家自己看参考文章,动手摸索一下。

更多的参数,可以参考 https://wiki.gentoo.org/wiki/Xorg/Guide/zh-cn 文档。

因为我目前没办法接触到物理显示器,没机会尝试,如果有网友摸索成功,可以在下面评论一下,介绍一下经验,帮助更多的人。

=============================== 更 新 3 ====================================

根据上面的思路和参考文章

Ubuntu 20.04 VNC 安装与设置 | 蓝鲸ROS机器人论坛

为了让虚拟显示器和物理显示器同时工作,我把开始备份 xorg.conf 文件的原始设置和上面虚拟显示器的设置合并到一个 xorg.conf 文件。

物理显示器是最开始备份 xorg.conf 文件的原始设置(所以大家一定要把最开始 xorg.conf 文件拷贝到别的地方备份一下),我的显卡是 nvidia,显示器是27英寸的,虚拟现实器是上面虚拟现实器的设置,为了让虚拟的显示器和真实显示器都能工作,我们需要把 xorg.conf 文件的 ServerLayout 进行更改,加上 Screen1,如下:

Section "ServerLayout"
        Identifier     "X.org Configured"
        Screen      0  "Screen0" 0 0
		Screen      1  "Screen1" 0 0
		InputDevice    "Mouse0" "CorePointer"
	    InputDevice    "Keyboard0" "CoreKeyboard"
EndSection

Screen0、Monitor0、Device0 是指物理显示器;
Screen1、Monitor1、Card1是指虚拟显示器,上面文章提到的虚拟现实器设置的都是0(例如Monitor0),但是这里加入了物理显示器,所以这里都变成了1。

综上所述,改完合并之后 ,xorg.conf 文件如最下面所示,因为我目前没办法接触到物理显示器,没机会尝试,我也不知道改完之后的效果

大家有兴趣可以参考一下,把我的物理显示器的原始设置替换为自己的物理显示器的原始设置,再加上虚拟显示器的设置,尝试一下是否能够让虚拟显示器和物理显示器同时工作。


============================ 2022年07月21日更新 ============================


非常感谢网友 猫巷鱼港_lai 在评论里提供了特别有价值的回复!!!

合并物理屏和虚拟屏的xorg.conf 文件可以让虚拟显示器和物理显示器同时工作!!

这个问题总算有个比较完善的解决办法。

谨慎起见,大家最好把我的物理屏的原始设置替换为自己的物理屏对应的的 xorg.conf 文件,然后再加上虚拟屏的xorg.conf 文件。下面是我合并后的 xorg.conf 文件,大家可以对照着修改成自己的。

# nvidia-xconfig: X configuration file generated by nvidia-xconfig
# nvidia-xconfig:  version 470.103

Section "ServerLayout"
        Identifier     "X.org Configured"
        Screen      0  "Screen0" 0 0
		Screen      1  "Screen1" 0 0
		InputDevice    "Mouse0" "CorePointer"
	    InputDevice    "Keyboard0" "CoreKeyboard"
EndSection


Section "Files"
EndSection

Section "InputDevice"
    # generated from default
    Identifier     "Mouse0"
    Driver         "mouse"
    Option         "Protocol" "auto"
    Option         "Device" "/dev/psaux"
    Option         "Emulate3Buttons" "no"
    Option         "ZAxisMapping" "4 5"
EndSection

Section "InputDevice"
    # generated from default
    Identifier     "Keyboard0"
    Driver         "kbd"
EndSection

Section "Monitor"
    Identifier     "Monitor0"
    VendorName     "Unknown"
    ModelName      "Unknown"
    Option         "DPMS"
EndSection

Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
EndSection

Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    DefaultDepth    24
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection




Section "Monitor"
  Identifier "Monitor1"
  HorizSync 28.0-80.0
  VertRefresh 48.0-75.0
  # https://arachnoid.com/modelines/
  # 1920x1080 @ 60.00 Hz (GTF) hsync: 67.08 kHz; pclk: 172.80 MHz
  Modeline "1920x1080_60.00" 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -HSync +Vsync
EndSection

Section "Device"
  Identifier "Card1"
  Driver "dummy"
  VideoRam 256000
EndSection

Section "Screen"
  DefaultDepth 24
  Identifier "Screen1"
  Device "Card1"
  Monitor "Monitor1"
  SubSection "Display"
    Depth 24
    Modes "1920x1080_60.00"
  EndSubSection
EndSection


============================ 2023年02月19日更新 ============================


终于接触到实体机了,要使用物理显示器,我进ssh, 打开xorg.conf 文件

sudo vim /usr/share/X11/xorg.conf.d/xorg.conf

把原先的虚拟显示屏的设置

        Screen      0  "Screen1" 0 0
		Screen      1  "Screen0" 0 0

改成物理显示屏的设置,其他部分没有改动。

        Screen      0  "Screen0" 0 0
		Screen      1  "Screen1" 0 0

sudo reboot 重启了下系统,重启后就停在开机主板的界面,出现了一个问题,提示:

Ctrl + c可以取消正在进行的所有文件系统检查

按了Ctrl + c也没反应,这个时候通过 ToDesk 还可以远程连接,这说明系统没有问题,就是进不去图形界面了,有点慌!

这个时候,按照网友“猫巷鱼港_lai”的方法,删除xorg.conf文件

采用ssh连接,cd /usr/share/X11/xorg.conf.d/ 然后 sudo rm -f xorg.conf ,重启

就可以进去物理显示屏了。

回到之前的问题,怎么才能让虚拟显示器和物理显示器同时工作?

之前的回答不正确,不能让它们同时工作,两者只能二选一。

参考文献:

Ubuntu 20.04 虚拟显示器 1080P 配置_江南土豆的博客-CSDN博客_ubuntu 虚拟显示器

Ubuntu 20.04 VNC 安装与设置 | 蓝鲸ROS机器人论坛

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐