当未连接显示器时,添加虚拟显示

我有一台没有连接外部显示器的Ubuntu 14.04服务器。我使用NoMachine远程控制这台机器。当我这样做时,Unity/Gnome界面无法检测到任何连接的显示器,所以我只能在使用NoMachine连接时使用800x600的分辨率。如果我插入一个显示器,我可以将分辨率设置为远程计算机上NoMachine窗口的大小。

有没有办法在Ubuntu上创建一个"虚拟"显示器设备,以便我可以在Unity/Gnome中设置桌面分辨率?


对于那些使用无头虚拟机的用户,我通常使用这个链接:http://realtechtalk.com/using_Xvfb_on_virtual_remote_ssh_server_to_have_X_graphical_programs_work-2287-articles - Areeb Soo Yasir
9个回答

发现一种无需使用虚拟插头即可实现的方法:Ubuntu Headless VNC VESA 800x600 分辨率修复 ~ Andy Hawkins @ 2011年6月12日
基本上安装一个虚拟驱动程序:
sudo apt-get install xserver-xorg-video-dummy

然后将其写入/usr/share/X11/xorg.conf.d/xorg.conf(或可能是/etc/X11/xorg.conf)文件中(如果不存在,则创建一个):
Section "Device"
    Identifier  "Configured Video Device"
    Driver      "dummy"
    # Default is 4MiB, this sets it to 16MiB
    VideoRam    16384
EndSection

Section "Monitor"
    Identifier  "Configured Monitor"
    HorizSync 31.5-48.5
    VertRefresh 50-70
EndSection

Section "Screen"
    Identifier  "Default Screen"
    Monitor     "Configured Monitor"
    Device      "Configured Video Device"
    DefaultDepth 24
    SubSection "Display"
    Depth 24
    Modes "1024x800"
    EndSubSection
EndSection

然后通过注销来重新启动您的X会话。

对于那些使用NoMachine并且想要更改屏幕分辨率,但在远程站点上连接了一个具有不同比例的显示器的人来说,这些相关信息非常重要。因此,他们真正需要虚拟驱动程序。请参考以下链接:http://ubuntuforums.org/showthread.php?t=1832456 和 https://www.xpra.org/xorg.conf。当NoMachine表示没有会话时,请在此处进行调试:`/var/log/Xorg.0.log`。刷新更改: sudo service lightdm restart sudo su sudo /etc/NX/nxserver --restart exit - Alexander Taylor
3请编辑答案,软件包正在更新中。尝试使用sudo apt-cache search video-dummy命令。 - cctan
2创建文件/usr/share/X11/xorg.conf.d/xorg.conf并使用此内容,或者从http://xpra.org/xorg.conf获取内容后,我的Ubuntu无法启动(在登录屏幕之前卡在Ubuntu标志屏幕上)。可能是什么问题? - David Portabella
你的补丁真是太棒了。那么,如果屏幕不是始终连接的呢?因为现在,有了这个补丁和一个屏幕,电脑会卡住,因为“X服务器”无法加载。 - brcebn
3我现在遇到的问题是,当我连接真正的显示器时,它无法工作。只有在卸载所有软件包并重新启动后才能正常运行。我们不能优先处理一下吗? - Arthur Kovacs
这个问题让我的Kubuntu 17.10无法正常启动,直到我通过USB安装的方式删除了该文件。请小心操作,以防出现问题时有备用方案。(诚实地说,我是个外行。) - Neinstein
22还把我的操作系统搞坏了,无法启动了。现在只能亲自开车一小时去修复了,有点冒险呢 :-) - Derek
1@Derek 是哪一个原因呢?(1)放置xorg.conf文件真的破坏了您的ssh服务器(怎么会?)。 (2)您没有设置ssh服务器,VNC到X会话是您唯一的访问模式。 (3)随机无关的硬件故障。//因为我将尝试对远程计算机执行相同操作。即使X会话无法启动,我也无法想象ssh服务器会受到影响。 - Ludwig Schulze
1这对我来说没问题!然而,有一个问题是,如果我连接一个真正的显示器,它总是黑屏。 - soulmachine
1我该如何以这种方式添加两个虚拟屏幕? - iBug
1对于Ubuntu 18.04,软件包名称是xserver-xorg-video-dummy-hwe-18.04 同样可以解决Teamviewer 14的问题。 - frommelmak
对我来说,在编辑/etc/X11/xorg.conf而不是/usr/share/X11/xorg.conf.d/xorg.conf中起作用。 - sangorys
同意@frommelmak的建议,我安装了server-xorg-video-dummy-hwe-18.04和配置文件,然后一切正常运行。 - Sam-Graham
@Sam-Graham,你到底是怎么解决的?我安装了虚拟包install server-xorg-video-dummy-hwe-18.04,在没有连接显示器的情况下一切都很好。但是当我插入显示器时,屏幕会变成黑色并出现闪烁的光标。 - Vik
@Vik 我和frommelmak处于同样的境地,并且正在使用Teamviewer进行连接。如果你插入了一个真实的显示器,我遇到了与你相同的问题,即显示器变成空白。在我的情况下,我不得不设置自动登录,这可能会解决你的问题,因为我的显示器似乎卡在登录界面上。希望这能帮到你。 - Sam-Graham
10这个解决方案不应再被接受了。它对很多人的操作系统造成了严重问题,包括我的:) - Darius
我终于有足够的积分来发表评论了。我对以下答案很幸运:https://askubuntu.com/questions/1085161/how-can-i-start-a-qt-gui-application-on-boot-without-a-display-connected/1085165#1085165 - petrosmm
我不确定这是否真的会造成其他问题,除非连接显示器。我遇到过同样的问题,只需将机器关机,就能远程访问。我有远程关机的能力,所以可能这就是为什么我没有被困住的原因。但最重要的是,我不认为这会破坏远程访问,即使连接了显示器。它可能在重新启动期间尝试关闭而导致挂起。 - nospam2k
2这种方法会破坏一些显示,导致屏幕变成空白或卡在某个标志上。我解决了这个问题,通过关闭电脑,然后按F1键直到看到菜单,选择“Ubuntu的高级选项”,然后选择“Ubuntu,带有Linux ***(恢复模式)”,然后选择“root”,这样你就可以在底部看到小型终端,然后你可以进入“cd /usr/share/X11/xorg.conf.d”或“cd /etc/X11/”,然后“rm -rf xorg.conf”,最后“重新启动”。嘭!欢迎回到您可爱的显示器!XD - Heng Sengthai
我刚刚安装了虚拟驱动程序,并创建了一个空的xorg.conf文件,路径为/usr/share/X11/xorg.conf.d/xorg.conf。这个解决方案非常有效。当我连接显示器时,它可以在显示器上显示,但是当我没有连接显示器时,我可以从另一台机器上通过SSH进行操作。我在我的Intel NUC上运行的Ubuntu 19.04上实施了这个方法,效果非常好。 - Sanket Sonavane
之前我用上述细节编辑了xorg.conf文件,然后我能看到Ubuntu进度条加载,但之后什么都没有发生,不过我还是能够通过SSH登录我的机器。所以我当时又编辑了xorg.conf文件,删除了所有内容并保存。很高兴它起作用了。 - Sanket Sonavane
这在Linux Mint 19.04上运行得非常好!谢谢! - Rohit Parte
1我认为在这里包含如何撤销的信息是很重要的。 - steoiatsl
22021-08-11 - 这个方法在我的树莓派4上完美运行。我现在可以无需连接显示器就可以启动GUI界面(或者无头启动)。我认为这是很重要的,因为其他人似乎都在尝试使用树莓派实现这一点。我直接把文件放在了 /etc/X11/xorg.conf(需要创建这个文件)。对于新手程序员或对这个生态系统不熟悉的人来说,你必须使用sudo在那里创建和操作文件(sudo nano xorg.conf)。祝好运! - Montag
12022年。Ubuntu 20.04。NVIDIA专有驱动程序。运行无缺。这使我能够轻松地通过VNC从我的笔记本连接到我的台式机! - McSuperbX1

在未连接显示器的Ubuntu 14.04桌面上指定分辨率:
从xrandr手册中获得的信息:
--fb widthxheight
   Reconfigures the screen to the specified size. All configured 
   monitors must fit within this size. When this option is not 
   provided, xrandr computes the smallest screen size that will 
   hold the set of configured outputs; this option provides a 
   way to override that behaviour.

因此,在连接后使用该命令:
xrandr --fb 1280x1024

太酷了,它起作用了! - burtsevyg
8对我来说,它显示为:"无法打开显示器"。 - ar2015
7@ar2015 在终端中运行以下命令:xrandr --fb 1280x1024 -display :0 - Terrance
1@Terrance 我收到了“没有指定协议,无法打开显示:0”的错误信息。 - Rufus
这个在Ubuntu 20.04上能用吗?在我的情况下不行,但我可能漏掉了什么。 - grrigore
@Terrance 我也遇到了错误 No protocol specified Can't open display :0。我没有使用Wayland,但是当然我是通过SSH连接的。有解决办法吗? - Mark
@Terrance,我已经使用-X-Y进行连接,并且已经启用了X11Forwarding选项。我猜显示器是:0,因为它是唯一返回No protocol specified的,:1只返回Can't open display。无论如何,我正在使用gdm3X11模式下(没有Wayland)。 - Mark
顺便说一句,我不确定在这里使用X转发是否有用。我不想在我的本地机器上转发X输出,只是想"强制"X11产生一个输出,即使没有显示器,这样VNC连接就可以渲染桌面而不仅仅是一个空白屏幕。 - Mark
@Mark,我删除了上一条评论,因为我对自己写的内容有些困惑。无论如何,命令之所以给你这个提示,是因为它试图在SSH会话中运行,而不是针对系统本身。将该命令添加到你尝试使用VNC连接的服务器的启动项中,这样它就可以在启动过程中设置虚拟显示器。 - Terrance
2对于所有来到这个答案的人,请不要在SSH会话中运行此命令,因为它尝试在SSH中运行而不是在系统本身上运行。如果您通过VNC连接到系统,则可以在VNC的终端窗口中运行它。最好将此命令添加到您正在使用VNC连接的系统的启动项中。 - Terrance
这是一个很好的解决方案,可以与AnyDesk配合使用(当我不在时,我会关闭显示器以节省电源)。不过,我确实需要重新启动我的窗口管理器(plasmashell),因为任务栏没有正确调整大小。 - Josh

考虑一下Xvfb,当你真正插入一个真实的显示器时,它可能是最不容易搞乱显示的。
以下命令将在ID为1、分辨率为1024x76的虚拟显示上启动lightdm。
export DISPLAY=:1
Xvfb :1 -screen 0 1024x768x16 &
sleep 1

#exec gnome-session & use gnome-session instead of lightdm
exec lightdm-session &

2谢谢,这帮助我在Debian上无需显示器运行Chrome。 - DedaDev
谢谢,有了这个,我能够在启动时打开xfreerdp客户端并开始一个rpd会话,而无需用户交互(为了在启动时启动一个X程序)。 - Jako
你刚刚在我头疼了好几个小时之后救了我一命。 - Jeremy Morren

硬件解决方案

这是一个硬件解决方案/变通方法,对于某些图形硬件/驱动程序可能有效。如果您需要频繁插拔物理显示器,这个方法可能更好,因为您不必像使用虚拟/vesa/fb驱动程序(静态配置)那样重新启动X服务器。

  • 要么购买一个虚拟VGA(或DVI模拟)插头,或者有些人称之为虚拟转接头

  • 要么自己制作,使用大约75欧姆(标准值)的3个电阻连接到VGA输出端口:1→6, 2→7, 3→8

    +/- 10欧姆的电阻也可能没有问题。有些显卡只需要一个电阻就能正常工作(比如我的英特尔显卡,2→7或3→8,会被识别为一台显示器)。顺便说一下,这是VGA显示器中实现的标准阻抗。

参考资料:如何为您的显卡创建虚拟插头

对于那些对显示器及其分辨率检测感兴趣的用户,我建议阅读有关VESA DDC和EDID的相关内容。

1听起来是个有趣的主意。我会试一试的。 - John Chapman
3老实说,这是最简单的方法。有很多针对解决办法的教程,但这个方法简单直接,可以省下很多时间。自己动手的选择看起来靠谱,但亚马逊上的虚拟插头要价20美元。只需确保选购一个好的插头来支持您的分辨率就行了。 - Jason Capriotti
1@JasonCapriotti 你说的“但是*要20美元”是什么意思?对于这种小东西来说,那可太贵了。你可以买到3个75欧姆的电阻器,不到1美元(几分钱而已)。 - jave.web
1谢谢你的推荐。虽然被接受的答案对我来说有效,我可以成功通过TeamViewer连接到我的设备,但是我还是在亚马逊上购买了一个5欧元的虚拟适配器。然而,这个解决方案会导致物理显示器无法工作,我担心有一天我的网络可能出问题,无法访问设备。因此,你的解决方案对我来说是一个很好的选择。 - Thijmen

对我来说,以上的解决方案都不起作用。要添加一个新的设备/屏幕VIRTUAL1,对我有效的方法是:
  • 安装xserver-xorg-video-dummy软件包
  • 更新xorg.conf文件

所有详细信息在这里:在没有连接显示器时添加虚拟显示

提示:对我来说,在编辑/etc/X11/xorg.conf而不是/usr/share/X11/xorg.conf.d/xorg.conf文件中起作用。


在Ubuntu 20.04LTS和TeamViewer上进行了测试,一切正常!/etc/X11/xorg.conf路径对我也有效。 - BirdOfPrey
2这对我来说非常有效,但是当我连接显示器时,如何恢复常规屏幕? - Jeff Barnett
8你在这个页面中链接了这个页面吗?还是我错了? - ahmadkarimi12

我使用的是Ubuntu 18.04,这是我解决问题的方法:
我按照这个问题的答案创建了虚拟显示器:https://unix.stackexchange.com/questions/378373/add-virtual-output-to-xorg

Create a 20-intel.conf file:

sudo vi /usr/share/X11/xorg.conf.d/20-intel.conf

Add the following configuration information into the file:

Section "Device"
    Identifier "intelgpu0"
    Driver "intel"
    Option "VirtualHeads" "2"
EndSection

This tells the Intel GPU to create 2 virtual displays. You can change the number of VirtualHeads to your needs.

然后我编写了一个shell脚本(别忘了设置为可执行),并将其放在启动应用程序中。
#! /bin/bash

/usr/bin/xrandr -d :0 --output VIRTUAL1 --primary --auto
/usr/bin/xrandr --newmode "1600x900_60.00" 118.25 1600 1696 1856 2112 900$
/usr/bin/xrandr --addmode VIRTUAL1 "1600x900_60.00"
/usr/bin/xrandr

那样,VIRTUAL1被设置为输出并连接。在启动时,使用“cvt 1600 900”找到一个新的模式,并指定给VIRTUAL1。
唯一的问题是:重新启动后,码头消失了... 这个问题还没有解决。

虽然对我来说没有起作用,因为无法解析“1600x900_60.00”消息,但也许会起作用,但会导致屏幕上出现图形故障/闪烁,不得不将其移除。一些应用程序崩溃或变得透明。请参考此链接:https://askubuntu.com/questions/1231824/fuzzy-graphics-after-upgrading-to-ubuntu-20-04 - FantomX1
使用cvt命令生成一个xrandr行。例如,cvt 1920 1080给我返回了Modeline "1920x1080_60.00" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync。同时要注意末尾的美元符号$。 - Ramon Poca
很不幸,这在我的Ubuntu 20.04上没有起作用。我遇到了奇怪的故障,并且扩展显示尺寸不正确。 - Merve Sahin

这个可以作为一个额外的显示器/屏幕,只要已经有一个存在。
# I think I may have spoken too soon. I was able to create a "virtual" display by adding a new mode to one of the disconnected displays listed in xrandr using

xrandr --addmode VIRTUAL1 1024x768
# I then simply enabled the display like you would normally:

xrandr --output VIRTUAL1 --mode 1024x768 --left-of HDMI3
# Furthermore, combined with x11vnc -clip, I am able to use this to convert my android tablet to a second monitor.  The perfomrance is pretty crappy at the moment, unfortunately, but that's whole other area to be explored.

https://bbs.archlinux.org/viewtopic.php?pid=1410831#p1410831


John Chapman的回答对我没用。我可以建议使用这个链接来进行固定的虚拟显示,分辨率为1024x768,色深为24位。我可以成功连接到没有任何显示器连接的电脑上。我的系统是Ubuntu 16.04。你应该安装VESA视频驱动程序。
sudo apt-get install xserver-xorg-video-vesa

代码位于您的/usr/share/X11/xorg.conf.d/xorg.conf文件或/etc/X11/xorg.conf文件中。
Section "Device"
Identifier    "Configured Video Device"
Driver        "vesa"
EndSection

Section "Monitor"
    Identifier    "Configured Monitor"
    HorizSync 42.0 - 52.0 
    VertRefresh 55.0 - 65.0 
    Modeline "1024x768" 60.80  1024 1056 1128 1272   768  768  770  796
    Modeline "800x600" 38.21 800 832 976 1008 600 612 618 631
    Modeline "640x480" 24.11 640 672 760 792 480 490 495 50
EndSection

Section "Screen"
    Identifier    "Default Screen"
    Monitor        "Configured Monitor"
    Device        "Configured Video Device"
    DefaultDepth    24
    Subsection "Display"
        Depth       24
        Modes       "1024x768" "800x600" "640x480"
       EndSubsection
EndSection

搞定了
只需安装虚拟驱动程序即可
sudo apt-get install xserver-xorg-video-dummy

不要编辑xorg.conf文件,我刚刚在这里创建了一个空文件。
/usr/share/X11/xorg.conf.d/xorg.conf

现在,当您连接了显示器时,它将像以前一样工作。但是,如果您没有连接显示器启动它,也应该可以正常工作,并且您应该能够通过SSH访问您的计算机。
希望对您也有效。
在Ubuntu 19.04和Intel NUC上进行了测试。

无法在我的Ubuntu 21.04上运行。 - Dimetry
无法在我的Ubuntu 20.04上运行。 - PatrickReagan
不适用于我的Ubuntu 22.04。 - Vladimir Hidalgo
不要说“对我的XXXX无效”,我更愿意问一下2022年在Ubuntu上模拟显示器的方法是什么。我正在Docker中运行Ubuntu,肯定有办法做到这一点! - fullStackChris