80

I have an Ubuntu 14.04 server that has no external monitor connected. I use NoMachine to remote control the machine. When I do so, the Unity/Gnome interface doesn't see any monitors connected, so I can only use 800x600 when connecting with NoMachine. If I plug in a monitor, I can set the resolution to whatever size the NoMachine window is on the remote computer.

Is there a way to create a "fake" monitor device on Ubuntu so I can set a desktop resolution in Unity/Gnome?

LiveWireBT
  • 28,405
  • 26
  • 107
  • 221
John Chapman
  • 1,883
  • 1
  • 13
  • 9
  • For those using a headless VM I normally use this: http://realtechtalk.com/using_Xvfb_on_virtual_remote_ssh_server_to_have_X_graphical_programs_work-2287-articles – Areeb Soo Yasir Mar 26 '20 at 20:10

9 Answers9

95

Found a way to do it without requiring a dummy plug: Ubuntu Headless VNC VESA 800x600 Resolution Fix ~ Andy Hawkins @ June 12, 2011

Basically install a dummy driver:

sudo apt-get install xserver-xorg-video-dummy

Then write it in the /usr/share/X11/xorg.conf.d/xorg.conf (or possibly /etc/X11/xorg.conf) file (create one, if it does not exist):

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

Then restart your X session by logging out.

Daniel Santos
  • 206
  • 2
  • 5
John Chapman
  • 1,883
  • 1
  • 13
  • 9
  • related info for those using NoMachine who want to change the screen resolution but have a monitor plugged in on the remote site with a different ratio, so really need the dummy driver: http://ubuntuforums.org/showthread.php?t=1832456 and https://www.xpra.org/xorg.conf and when NoMachine says there are no sessions, debug here: `/var/log/Xorg.0.log` refresh changes: `sudo service lightdm restart` `sudo su` `sudo /etc/NX/nxserver --restart` `exit` – Alexander Taylor Nov 28 '14 at 01:23
  • 3
    Please edit the answer, the package is being updated. Try `sudo apt-cache search video-dummy`. – cctan Aug 12 '15 at 09:56
  • 2
    Creating the file `/usr/share/X11/xorg.conf.d/xorg.conf` with this content, or the one from http://xpra.org/xorg.conf, my Ubuntu does not boot anymore (it gets stuck with the Ubuntu logo screen before the login screen). What can be the problem? – David Portabella Aug 23 '16 at 21:40
  • Your patch works like a charme. What about a screen not always connected? Because right now, with this patch and a screen, the computer is stuck because `X server` fails to load. – brcebn Sep 06 '16 at 07:58
  • 3
    The problem I get now is when I connect a real monitor it won't work. Only if I uninstall all the packages and restart. Couldn't we do a priority thing ? – Arthur Kovacs Jan 19 '18 at 12:22
  • This broke my Kubuntu 17.10 in a way it wouldn't boot properly until I removed the file with the help of an usb installation. Be careful, have a plan in case this goes wrong. (Admittedly layman here.) – Neinstein Mar 12 '18 at 21:10
  • 22
    Also broke my os. Did not boot. Its remote and now I need to get in a car and drive 1hr. Risky stuff :-) – Derek Apr 07 '18 at 17:49
  • 1
    @Derek Which of these was it? (1) Placing the xorg.conf file really broke your ssh server (How???). (2) You had no ssh server set up, VNC to the X session was your only access mode. (3) Random unrelated HW Failure. // Cause I'm going to try the same to a remote machine. I can't imagine how the ssh server will be affected even if the X session will fail to start. – Ludwig Schulze Aug 25 '18 at 13:14
  • 1
    This works for me! However there is a problem that if I attach a real monitor it's always black screen – soulmachine Nov 11 '18 at 19:06
  • 1
    How can I add **two** dummy screens in this way? – iBug Jun 22 '19 at 12:46
  • 1
    For ubuntu 18.04 the package name is xserver-xorg-video-dummy-hwe-18.04 Also solves the same problem with Teamviewer 14 – frommelmak Jul 17 '19 at 11:13
  • For me, it works in editing /etc/X11/xorg.conf instead of /usr/share/X11/xorg.conf.d/xorg.conf – sangorys Oct 28 '19 at 11:49
  • Seconding @frommelmak had to install server-xorg-video-dummy-hwe-18.04 and the config, then everything worked. – Sam-Graham Nov 06 '19 at 17:57
  • @Sam-Graham what exactly worked for you? I installed the dummy package install server-xorg-video-dummy-hwe-18.04, things work great when no monitor is attached. However when I plug in a monitor I get a black screen with a blinking cursor. – Vik Dec 15 '19 at 16:20
  • @Vik I was in the same boat as frommelmak and was connecting using Teamviewer. I had the same issue as you with the monitor being blank if you plugged in a real one. I had to set it up to auto login as well in my case, which might fix your issue, as mine seemed to get stuck on the login screen. Hope this helps. – Sam-Graham Dec 18 '19 at 04:48
  • 10
    This should no longer be accepted solution. It's bricking too many OS's for people. including mine :) – Darius Dec 30 '19 at 10:38
  • I finally have enough points to comment. I had luck with the following answer: https://askubuntu.com/questions/1085161/how-can-i-start-a-qt-gui-application-on-boot-without-a-display-connected/1085165#1085165 – petrosmm Mar 20 '20 at 13:49
  • I'm not sure this is actually breaking anything other then when connecting a monitor. I had the same problem and just powered off the machine was accessible remotely. I have the ability to power off the machine remotely so that could be why I was not stuck. But bottom line, I don't think it is a fair assessment that this breaks remote access, even with a monitor connected. It may be hanging trying to shutdown during reboot. – nospam2k Apr 01 '20 at 16:40
  • 2
    This method will break some display and it will be blank or stuck with some logo. I solved this by turn off pc and turn on then pressed F1 until I see some menu, then select "Advanced options for ubuntu" then select "Ubuntu, with Linux *** (recovery mode)", then choose "root ", so you mini terminal exist in the bottom, then you can go to remove the file you create by "cd /usr/share/X11/xorg.conf.d" or "cd /etc/X11/", then "rm -rf xorg.conf", then "reboot". Booom!! Welcome back to your lovely display! XD – Heng Sengthai Nov 17 '20 at 02:19
  • I just installed the dummy driver and created an empty xorg.conf file /usr/share/X11/xorg.conf.d/xorg.conf that works as a solution. when i have a monitor connected it displays on monitor, but when i boot it without a monitor i can ssh from another machine. did this for ubuntu 19.04 running on my intel nuc. works flawless. – Sanket Sonavane Apr 06 '21 at 13:51
  • earlier i had edited the xorg.conf with above details and i could see loading till ubuntu progress bar and post that nothing but i was able to ssh into my machine. so i edited the xorg.conf at that time and deleted all its content and saved it. glad it worked. – Sanket Sonavane Apr 06 '21 at 13:54
  • This worked very well on Linux mint 19.04! Thanks! – Rohit Parte Apr 16 '21 at 07:12
  • 1
    I think it's important to include information on how to undo this. – steoiatsl Jul 06 '21 at 01:58
  • 2
    2021-08-11 - This worked perfectly for my raspberry pi 4. I can now boot gui without a monitor connected (or boot headlessly if we want to). I thought that it would be important to add this since others seem to be trying to find a way to do it with Raspberry Pi's. I put mine straight in /etc/X11/xorg.conf (had to make the file). For new coders, or people new to this ecosystem, you have to use sudo to make and work with files there. (sudo nano xorg.conf). Good Luck! – Montag Aug 11 '21 at 19:55
  • 1
    2022. Ubuntu 20.04. NVIDIA proprietary drivers. Works flawlessly. This allows me to connect to my desktop over VNC from my laptop with ease! – McSuperbX1 Aug 23 '22 at 13:15
27

Specify the resolution on a Ubuntu 14.04 desktop without a monitor connected:

From the xrandr man page:

--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.

Therefore use the command after connecting:

xrandr --fb 1280x1024
Eric Leschinski
  • 2,181
  • 1
  • 20
  • 23
  • Cool, it's work! – burtsevyg Sep 26 '16 at 10:02
  • 8
    For me it say's: `Can't open display` – ar2015 Jun 02 '17 at 07:05
  • 7
    @ar2015 Run the command as `xrandr --fb 1280x1024 -display :0` – Terrance Oct 29 '17 at 23:45
  • 1
    @Terrance I am getting `No protocol specified Can't open display :0` – Rufus Jan 22 '19 at 06:57
  • Does this work on Ubuntu 20.04? In my case it didn' but I might miss something.. – grrigore Oct 08 '20 at 15:35
  • @Terrance I also get the error `No protocol specified Can't open display :0`. I'm not using Wayland, but of course I'm connected via SSH. Is there a solution for this? – Mark Oct 25 '21 at 12:38
  • @Terrance, I'm already connecting using `-X` or `-Y` and I've already enabled the `X11Forwarding` option. I bet the display is `:0` because it's the only that returns `No protocol specified`, `:1` returns only `Can't open display`. Anyway I'm using `gdm3` in `X11` mode (no `Wayland`) – Mark Oct 25 '21 at 13:52
  • By the way, I'm not sure using X forwarding is useful here. I don't want to forward the X output on my local machine, just "force" X11 to produce an output even without a monitor, so a VNC connection can render the desktop and not just a blank screen. – Mark Oct 25 '21 at 13:59
  • @Mark Deleted my last comment as I was having difficulty understanding what I wrote. Anyways, the command is giving you that because it is trying to run in the SSH session and not for the system itself. Add the command somewhere in startup on the server you are trying to VNC to so that it sets the fake display during its bootup. – Terrance Oct 25 '21 at 14:43
  • 2
    To all that come here to this answer, please DO NOT RUN this command from an SSH session as it tries to run it in the SSH and not on the system itself. If you VNC to the system, then you can run it in a terminal window in the VNC. It is best to add this command in the answer to your startup on the system that you are VNCing to. – Terrance Oct 25 '21 at 14:54
  • This is a nice solution that works with AnyDesk (I leave my monitors off to save power when I'm not in). I did have to restart my window manager though (plasmashell) because the task bar didn't correctly resize. – Josh Nov 08 '22 at 21:21
20

Consider Xvfb which is probably least likely to mess up the display when you actually plug in a real monitor.

The following commands will start lightdm on a fake display with ID 1 and resolution 1024x76

export DISPLAY=:1
Xvfb :1 -screen 0 1024x768x16 &
sleep 1

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

Probably relevant

Rufus
  • 812
  • 6
  • 15
17

Hardware Solution

This is a hardware solution/workaround which may work for some graphics hardware/driver. Also could be better, if you need to plug physical monitor frequently, so you don't have to restart X Server like with dummy/vesa/fb driver (static configuration).

  • Either you buy a Dummy VGA (or DVI analog) plug or some calling it Dummy Dongle.

  • Or just build it, use 3 resistors of around 75 Ohm (a standard) at the VGA output: 1→6, 2→7, 3→8.

    +/- 10 Ohm may work without any problem. Some cards work with just one resistor. (Like my Intel, 2→7 or 3→8, will detected as a monitor). By the way, this is standard impedance which implemented in the VGA monitors.

Reference: How to create dummy plugs for your graphics cards.

Users who are curious to read more about monitor & its resolution detection, I would recommend reading about VESA DDC & EDID too.

user.dz
  • 47,137
  • 13
  • 140
  • 258
  • 1
    Sounds like an interesting idea. I'll give it a shot. – John Chapman Apr 27 '14 at 19:10
  • 3
    Honestly, this is the *simplest* way to go. There are plenty of tutorials out there for workarounds, but this just plain works and will save you a lot of time. The DIY option seems solid, but dummy plugs on Amazon are $20. Just make sure you get a good one to support your resolution. – Jason Capriotti Feb 22 '17 at 21:19
  • 1
    @JasonCapriotti what do you mean by "but * are $20"? That's expensive for this type of little thing. You can buy 3 resistors 75Ohm for under a $1 (for cents...) – jave.web Mar 02 '22 at 04:23
  • 1
    Thanks for recommending this. I bought a €5 dummy adapter from Amazon even though the accepted answer works for me and I can successfully connect via TeamViewer to my device. However, this solution prevents physical displays from working, and I'm worried some day my network might get messed up and prevent access to the device. Thus your solution is a great option for me. – Thijmen Oct 24 '22 at 11:47
7

For me no one of the above solution works. To add a new device/screen VIRTUAL1, what has worked for me is :

  • Install the packet xserver-xorg-video-dummy
  • Update xorg.conf

All details are here : Add Fake Display when No Monitor is Plugged In

Info : for me, it works in editing /etc/X11/xorg.conf instead of /usr/share/X11/xorg.conf.d/xorg.conf

sangorys
  • 329
  • 3
  • 11
5

I'm on Ubuntu 18.04, this is how I solved it:

I've created the virtual display using the answer to this question: 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.

Then I made a shell script (don't forget to set executable) and put that in Startup Applications:

#! /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

That way, VIRTUAL1 is set as output and connected. At boot, a new mode (found using "cvt 1600 900") is being created and appointed to VIRTUAL1.

Only issue with this is: dock is missing at reboot... Haven't solved that yet.

Benjamin Loison
  • 190
  • 1
  • 5
Stefan Lemmens
  • 163
  • 2
  • 8
  • Did not work for me though due to could not parse ""1600x900_60.00"" message but maybe works, but causes graphics artifacts/glitches at the screen, had to remove it, https://askubuntu.com/questions/1231824/fuzzy-graphics-after-upgrading-to-ubuntu-20-04 some apps crashed or were transparent also – FantomX1 Feb 22 '21 at 12:12
  • Generate a xrandr line with `cvt`. e.g. `cvt 1920 1080` gave me `Modeline "1920x1080_60.00" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync`. Also beware of the $ at the end. – Ramon Poca Apr 15 '21 at 15:46
  • Unfortunately, this did not work on my Ubuntu 20.04. I get strange glitches and the extended display size is incorrect. – Merve Sahin May 11 '21 at 14:18
1

This works as an additional monitor/display once there is an existing one

# 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

Benjamin Loison
  • 190
  • 1
  • 5
FantomX1
  • 271
  • 3
  • 10
1

John Chapman's answer didn't work for me. I can suggest this link for a fixed dummy display with 1024x768 24bit. I can successfully connect to my pc without any display attached. My system is Ubuntu 16.04. You should install VESA video driver.

sudo apt-get install xserver-xorg-video-vesa

Code is in your /usr/share/X11/xorg.conf.d/xorg.conf file or /etc/X11/xorg.conf file

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
Ermanas
  • 83
  • 1
  • 1
  • 7
0

Got it working

Just install the dummy driver

sudo apt-get install xserver-xorg-video-dummy

dont edit the xorg.conf file I however just created an empty file here

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

now when you have a monitor hooked in it will work as earlier but if you boot it without a monitor that should work too and you should be able to ssh into your machine.

hope it works for you too.

tested on ubuntu 19.04 and intel nuc.