143

I searched around, and currently there are two methods suggested; installing an enhancement for Windows Subsystem for Linux and installing an XServer.

I want to know which method is the most hassle-free (easy to install AND to use), and which one is less memory-heavy.

I just want Synaptic and CMake. Why couldn't that be a builtin feature?

3
  • It is important which version of Windows you are using 10 or 11. Windows 11 comes with WSLg which is explained in the answers below. At Windows 10, IMO, the most easiest way is to install GWSL which is an XServer that lets you easily run graphical Linux apps on Windows 10 . . . AND it lets you run graphical applications located on remote Linux machines on Window 10 . . . AND it lets you manage these apps graphically, create Windows shortcuts for them, customize these shortcuts, and even manage/configure WSL distros.
    – pa4080
    Feb 23, 2022 at 13:59
  • For Windows 11, WSL2 users GUI apps now just work: learn.microsoft.com/en-us/windows/wsl/tutorials/gui-apps Sep 17, 2022 at 3:01
  • WSLg is now available for Windows 10 users as well. I'm pleasantly shocked and surprised. Nov 21, 2022 at 12:55

10 Answers 10

102

VcXsrv

I chose to use VcXsrv in WSL (Windows 10 Subsystem for Linux). I recommend everyone do their research between xming (the accepted answer) and VcXsrv before selecting one or the other for Graphical User Interface (GUI) support in Windows 10 Ubuntu 16.04.

Installation

Installation is straight forward. As of March 17, 2019 you can simply accept the defaults. If you want to call gedit from within your Bash Shell / Terminal you need to edit ~/.bashrc and insert this line:

export DISPLAY=localhost:0.0

What can you do after VcXsrv is installed?

I was able to run:

sudo apt install ubuntu-desktop
sudo apt install yad
sudo apt install gedit

... to install GUI desktop software. This then allowed me to run gedit and nautilus. Also I was then able to install specific GUI applications through the CLI (Command Line Interface) using apt or apt-get commands.

When I want to try many of my Ubuntu bash scripts within WSL VcXsrv must be installed so zenity and yad x-windows dialog boxes are displayed for user input.

As others have noted GUI within WSL is not perfect and you can expect to spend time problem-solving some issues. Also some GUI software simply won't work in WSL.

Setup notes

I modified /etc/environment to tweak GUI drop down menus:

PATH="/mnt/e/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
export LIBGL_ALWAYS_INDIRECT=Yes
export DISPLAY=localhost:0.0
  • /mnt/e/bin is unusual path because it is where I store scripts used in both Windows 10 dual boot WSL and Ubuntu 16.04 dual boot. Most users would not include this on their machine.
12
  • 11
    This was painless: On Windows, downloaded VcXsrv using the link provided. Installed and launched it. Then I opened an Ubuntu shell and entered export DISPLAY=:0. Now I could run xhost, xeyes and gnuplot in Ubuntu (provided these programs are already installed in the Ubuntu WSL).
    – Daniel K.
    Mar 20, 2018 at 8:00
  • 3
    @dessert +1 to your comment. It's double hilarious considering my user name means "Limited by Windows User switched over to Unix". Thanks to WSL I use Windows 10 occasionally now because I can run Ubuntu inside it. Call me WinEunuuchs2Unix2WinSub4Linux? :p Feb 20, 2019 at 23:45
  • 2
    @ErelSegal-Halevi See github.com/QMonkey/wsl-tutorial for complete instructions. Feb 27, 2019 at 10:47
  • 4
    also export LIBGL_ALWAYS_INDIRECT=1 and you get some hardware acceleration in GL apps over X using VcXsrv
    – Jippers
    May 29, 2019 at 14:10
  • 2
    I had to use the WSL network interface IP. On .bashrc I added \n export DISPLAY_NUMBER="0.0" and another line: export DISPLAY=$(grep -m 1 nameserver /etc/resolv.conf | awk '{print $2}'):$DISPLAY_NUMBER Oct 8, 2020 at 7:30
41

The short answer is you can not as WSL does not yet support this function. WSL is not a full Linux installation with a Linux kernel, it allows you to run some native linux commands / binaries on a Windows (Microsoft) kernel and has limitations.

See https://github.com/Microsoft/WSL/issues/2356

You can, however, install a 3rd party X server, such as xming, and ssh into your WSL.

https://virtualizationreview.com/articles/2017/02/08/graphical-programs-on-windows-subsystem-on-linux.aspx

I did not copy that tutorial here as it is fairly ubiquitous (X over ssh) and I would expect some apps simply will not work even with this technique.

14
  • 1
    So, hassle-free is not an option, then? Maybe somebody will make Synaptic for Windows to work with WSL in the future.... Jan 7, 2018 at 15:09
  • 2
    Graphical programs on WSL does not mean you can use Steam on WSL. You would need Valve to create support for WSL.
    – Rinzwind
    Jan 7, 2018 at 15:25
  • 12
    Keep in mind that you don't have to use SSH at all. Just set DISPLAY and you're good to go (for xming and VcXsrv anyways).
    – dma1324
    Apr 18, 2018 at 22:36
  • 6
    I would downvote this answer as it is 1: not fully accurate, and 2: not in the spirit of the question - yes, you can run gui apps in wsl with an xserver. The op didn't ask about supported apps. (install vcxserve or something similar, sudo apt-get install synaptic after setting DISPLAY, no need for ssh)...
    – decuser
    Nov 13, 2018 at 17:42
  • 4
    @decuser Upvote better answers instead: If there isn't one, write one. Feb 4, 2019 at 9:43
27

I've had a very positive experience with VcXsrv on Win 10 Bash on Ubuntu on Windows (Ubuntu 16.04 Xenial x86_64 Linux 4.4.0-17074-Microsoft). I did not focus on running Unity desktop as it is useless and resource consuming. I just simply ran apps from bash in GUI mode from Windows10 desktop using XServer.

  1. Install VcXsrv from here on Sourceforge

  2. Run the VcXsrv app directly, do not launch XLaunch. You should see localhost:0.0 - 0 clients when you hover over the icon on Win10 Taskbar

  3. Open Ubuntu Bash:

     cd /mnt
    

(results in localhost@localhost:/mnt$)

    cd .. 

(localhost@localhost:/$ meaning this commands brings you to the beginning of the hard-drive as far as WSL can see...)

    sudo apt-get install dbus synaptic nautilus --install-suggests --show-progress

(this will install "dbus" to create virtual connector for GUI, "Synaptic Package Manager" and "Nautilus" file explorer for unity-desktop

    cd /usr/share/dbus-1 && sudo vi session.conf

(When session.conf opens in vi editor)

Press i to enter insert mode and add

    <!-- <listen>unix:tmpdir=/tmp</listen> || Original Command --> to preserve original rules

than add:

    <listen>tcp:host=localhost,bind=0.0.0.0,port=0</listen>
    <auth>EXTERNAL</auth>
    <auth>DBUS_COOKIE_SHA1</auth>
    <auth>allow_anonymous</auth> 

Press ESC when you are done editing file and :wq to save the file.

Run these commands and check their output:

    $ export DISPLAY=localhost:0
    $ sudo service dbus start
    * Starting system message bus dbus                 [OK]
    $ echo $DISPLAY
    localhost:0
  1. You are done! Now just run synaptic, nautilus or firefox from Bash and they should load on Win10 desktop. GUI options like this are buggy but operational. You can install ubuntu-desktop, unity, ccsm, compiz and try to run Unity Desktop for Ubuntu. I did not try to set the "Steam" because I am still suffering rrying to run "Unreal", Good luck :)

If someone knows how to run gnome-terminal on XServer instead of XTerm please share...

P.S
You can add VcXsrv as a Win10 bootable

To max your sources with "Steam" as specified in original post, tune your Windows a little for network package management (to lower latency) and CPU/GPU prioritization to make a Win10XBox… :)

Although you will run "Steam" under "Unix" the shell is still "Windows" which allows you to launch "Steam" on "Unix" …

Tcp Prep:;

In regedit:

 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Interfaces

Here you need to go through the list of sub-keys to locate the network adapter entry that is used to connect to the Internet. If you are using DHCP, you need to look for DhcpIPAdddress entry (with system data values NOT :0.0.0.0) to find the correct adapter.

Once you have located the correct key right-click it and select New > Dword (32-bit) Value.

Name it TcpFrequency and click ok.

Double-click the value afterwards and set its Decimal value to 1. (To restore the default setting, change the value to 2 or delete the key) Now navigate to the following key: HKEY_LOCAL_MACHINE\Software\Microsoft\MSMQ

Right-click on the key again and select New > Dword (32-bit) Value.

Name the new parameter TcpDelay

Double-click it afterwards and change its Decimal value to 1. (To restore the key at a later point in time change it to 0 or delete the key)

Nagle’s Algorithm

Nagle’s algorithm combines several small packets into a single, larger packet for more efficient transmissions. This is designed to improve throughput efficiency of data transmission. Disabling “nagling” can help reduce latency/ping in some games. Nagle’s algorithm is enabled in Windows by default. To implement this tweak, modify the following registry keys.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{NIC-id}

For the {NIC-id}, look for the one with your IP address listed; under this {NIC-id} key create following DWORD value:

  • TcpFrequency and set it to 1 to disable “nagling” for gaming.
  • TCPDelay and set it also to 1 to disable “nagling”
  • TcpTicks and set it to 0

Note:

Some reports say that the tweaks did reduce latency when playing Dota 2 and League of Legends but it doesn’t work for some. I have tried it and my latency improved from 110 to 90ms (SEA Server) when playing Dota 2.

Network Throttling Index

Windows implements a network throttling mechanism, the idea behind such throttling is that processing of network packets can be a resource-intensive task. It is beneficial to turn off such throttling for achieving maximum throughput.

To implement this tweak, run regedit and modify the registry

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile. 

Under SystemProfile, create a DWORD value and name it to NetworkThrottlingIndex then set its Hexadecimal value to ffffffff for gaming and max throughput: ffffffff completely disables throttling.


System Gaming Responsiveness (Not so sure about this one :)

Multimedia streaming and some games that uses “Multimedia Class Scheduler” service (MMCSS) can only utilize up to 80% of the CPU. The “Multimedia Class Scheduler” service (MMCSS) ensures prioritized access to CPU resources, without denying CPU resources to lower-priority background applications.

To implement this tweak, run regedit and modify the registry key

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile. 

From there, create a new DWORD and name it to SystemResponsiveness set its decimal value to 00000000 for pure gaming/streaming.

In the same Registry hive as the above tweak, you can also change the priority of Games. To implement this tweak, go to

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile\Tasks\Games

and change the following registry values:

  • “GPU Priority” change its values to 8 for gaming.
  • “Priority” set to 1 for gaming.

All cheers for "unknown" (pardon me was a while since I copied your directions) author of this Windows=Xbox tweak...

PPS: If XServer fails on what you would like to do try to find the workaround with Docker.

  • [WSL_Apache_Roolez][1]
  • [Throttling_a_'mm'_:0][2]
  • [You've Got Mail!!!][3]

Microsoft announced the green light for WSL 2 GUI: https://devblogs.microsoft.com/commandline/the-windows-subsystem-for-linux-build-2020-summary/#wsl-gui

6
  • 6-5-7; :5-6-7...
    – tenedas
    Feb 27, 2018 at 1:05
  • Thanks for a very detailed answer. Otherwise, thanks to whoever suggested the edit, I can't believe, people are actually suggesting solutions for running Steam. On the other hand, people still keep suggesting desktops, which I still have no idea what would be the use of that, I personally don't even need a file manager, let alone a full flex desktop. Jun 6, 2018 at 19:26
  • I installed Xming on Windows, then used all the steps from section 3. here (above) - install dbus (no actual need for synaptic or nautilus, but nautilus is a good check), make the session.conf edit, and start the dbus service. Nautilus then starts successfully with a few error messages.
    – MikeW
    Dec 14, 2018 at 10:07
  • 2
    What do you mean by "Run the VcXsrv app directly" - how exactly to do this? Feb 25, 2019 at 17:45
  • Change <auth>allow_anonymous</auth> to <auth>ANONYMOUS</auth>, then service dbus restart and gnome-terminal should work
    – ZAB
    Jun 2, 2019 at 16:49
12

Even though a full GUI desktop environment is not ‘officially’ supported by Microsoft, it can work.

Turn Windows features on or off
Enable Windows Subsystem for Linux
Restart Computer
Launch Microsoft Store
Search for Ubuntu
Select Ubuntu 18.04 under Apps
Click Get
Launch Ubuntu and wait for install
Set username and password

Run the following Commands:

sudo apt-get update -y
sudo apt-get install ubuntu-desktop -y
sudo apt-get install xfce4 xorg xrdp -y
sudo sed -i 's/port=3389/port=3390/g' /etc/xrdp/xrdp.ini

Create and modify .xsession

cd /home/user/
sudo vim .xsession

Add text:

gnome-session --session=ubuntu-2d

Save and exit vi

sudo chmod 755 .xsession
sudo systemctl enable xrdp

You will need a second account on Ubuntu

sudo adduser remote
sudo usermod -aG sudo remote

Modify startwm.sh

cd /etc/xrdp
sudo chmod 777 startwm.sh
vim startwm.sh

Comment out the bottom two lines

#test -x /etc/X11/Xsession && exec /etc/X11/Xsession
#exec /bin/sh /etc/X11/Xsession

Add text:

startxfce4

Save and exit vi

exit

In Windows, restart Ubuntu and run:

sudo /etc/init.d/xrdp start

In Windows run mstsc.exe
Computer: 127.0.0.1:3390
Leave username blank
Connect

Session: Xorg
username: remote
password: password

Enjoy xfce!

When done, close the remote desktop connection
Return to the Ubuntu command line

sudo /etc/init.d/xrdp stop
exit
2
  • 1
    This is working. I used ubuntu 16. I didn't had ubuntu native GUI appearance. Xorg is not available in xrdp list Sep 16, 2018 at 5:16
  • I keep getting the following error message - "login failed for display 0". Thoughts? Why will xrdp not allow me to login?
    – J-Dizzle
    Nov 23, 2018 at 16:59
10
+100

tl;dr

WSLg is now available on both Windows 10 and Windows 11, making it the preferred mechanism for most users. See below for updated installation/update instructions.


(Much) more detail:

So the question asks for three "scoring" criteria for techniques for running Linux GUI apps in WSL:

  • Ease of Installation
  • Ease of Use
  • Memory Consumption

I'm going to add to that:

  • Flexibility
  • Performance

"Easiest" is a matter of opinion, to some degree, but I'm happy to provide mine. In general, I think it's more important to understand all the available options and decide which one works for your needs.

At this point in time, there are at least three techniques for running Linux GUI apps under WSL:

  • WSLg
  • Install a third-party X server in Windows
  • Install xrdp and a desktop manager in Ubuntu/WSL and connect via the Windows Remote Desktop Connection

I'll cover each below.


WSLg

While not an option when this question was originally asked, Linux GUI apps are now supported out-of-the-box on WSL2 using WSLg.

And when my answer was originally written, WSLg was only an option on Windows 11, making it unavailable to a large number of Windows 10 users who couldn't upgrade for various reasons. This has now changed with the release of the WSL application package, making installation much easier for most all users.

Windows 10 users currently require KB5020030 or later, meaning your Windows build number will end in .2311 or higher.

Windows 11 and Windows 10 xxxxx.2311 users should then be able to install or update with:

wsl --install
# or, if already installed
wsl --update
# to confirm:
wsl --version

GPU acceleration is also supported in WSLg using updated drivers. Pulse Audio is also preconfigured.

The WSLg architecture utilizes a read-only "system distribution" based on the CBL-Mariner distribution that Microsoft also uses for its Azure Cloud Services. This distribution is preconfigured to run Wayland/XWayland, with the sockets shared via the internal WSL network and symlinked to the appropriate files (e.g. /tmp/.X11-unix) for each WSL2 distribution you install (e.g. Ubuntu).

The DISPLAY and WAYLAND_DISPLAY variables are preconfigured by the WSL /init (PID 1) process on initial startup.

Note that WSLg only works for WSL2, not WSL1 instances.

WSLg Summary and Scoring:

  • Ease of install: Now that Windows 10 users can also install, this is almost certainly the easiest of the three techniques for most use-cases.

  • Ease of use: Excellent

  • Flexibility: Most flexible in some ways -- Runs Wayland/Weston/Xwayland. Can run a Weston-on-Weston implementation to run a full screen desktop if desired.

  • Memory Consumption: Short answer -- Around 213MB to run xterm. We can assume the majority of that is from the WSLg infrastructure. Regardless, I also tested the other two scenarios below with xterm, so it's memory usage is the rough constant in these measurements.

    See footnote at end of this post for more information on the memory usage of WSLg. Note that this includes Wayland, Xwayland, and Pulse Audio support with this memory footprint. The other two options listed below do not include Wayland or Pulse Audio.

  • Performance: Highest once it is loaded - GPU accelerated. glmark2 of 666 on my system (nVidia 2070 Super), which sounds low, but remember that this is being composited onto the Windows desktop. It's almost double that of VcXsrv and around 4 times that of xrdp.

    However, note that there is an initial delay while the system distribution is copied and started the first time you launch any GUI application in a WSL2 session. On my, high-midrange performance system, this delay is about 5 seconds. Additional GUI application launches after that are sub-second.


xrdp

For those who cannot upgrade to Windows 11, or for those who still need WSL1 support, there are still two good options. The first, and my preferred method, is to run xrdp in Ubuntu and simply use Microsoft's Remote Desktop Connection with something lightweight such as Xfce4.

sudo apt install xrdp xfce4
sudo cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.bak
sudo sed -i 's/3389/3390/g' /etc/xrdp/xrdp.ini 
# So it doesn't interfere with Windows RDP on 3389

In /etc/xrdp/startwm.sh, comment out the last two lines (that mention Xsession) and add:

#test -x /etc/X11/Xsession && exec /etc/X11/Xsession
#exec /bin/sh /etc/X11/Xsession
exec startxfce4

Start xrdp with:

sudo service xrdp start

And that's it -- You should be able to connect to your WSL Desktop using the built-in Remote Desktop Connection app. The computer to connect to will be localhost:3390. Make sure Xorg is selected as the Session type.

With this method (as with WSLg) there is no need to configure any firewall rules, since you really are using WSL's built-in localhost forwarding, which routes localhost traffic to WSL when there isn't a listening socket on that port in Windows.

I personally find this far easier than the other answers here regarding third-party X servers. It is probably not, however, the most memory efficient since it requires running a desktop environment.

xrdp Summary and Scoring:

  • Ease of installation: Excellent as long as the desktop manager does not require Systemd (e.g. Gnome). Getting Systemd to run in WSL is currently a major challenge. Third-party helpers are available, but the system and usage of WSL change drastically under Systemd.

  • Ease of use: Pretty good - Isn't automatically configured to startup when needed, so it's not quite as seamless as WSLg. Some people have reported that it is not as performant as VcXsrv, but I've also experienced excellent performance.

  • Flexibility: Least flexible for windowing options. You must run a window manager, at least, and configure it for xrdp. It cannot run single-applications on the Windows desktop. Both WSLg and third-party X Servers can run either full-screen or windowed.

    This method does run under Windows 10 and should run under WSL1 as well, although I can't remember if I've actually tested xrdp with WSL1.

  • Memory Consumption: As I expected, this technique has by far the highest memory consumption. Starting the Xfce4 desktop under xrdp consumed an additional 687MB under Vmmem.

  • Performance: My personal use of xrdp has been limited to simple UI apps, and performance has been pretty responsive. However, deeper inspection shows that this is certainly the worst option for performance. H.264 video playback using VLC stutters heavily, and the glmark2 score of 167 is about half that of VcXsrv.


Third-party X Server in Windows such as VcXsrv

Finally, the "normal" recommended method (as mostly mentioned in the other answers here) for Windows 10 and/or WSL1 is to install a third-party X server in Windows and configure Ubuntu in WSL (version 1 or 2) to use it.

I will add that the older methods of setting the DISPLAY variable for WSl2 are probably a bit out of date. I recommend using:

export DISPLAY="$(hostname).local:0"

This utilizes mDNS (the .local domain) which has been available in Windows 10 and WSL for a few years now. Since your hostname in WSL Ubuntu is the same as your Windows "computer name", this automatically connects to the correct IP address of the Windows host.

For WSL2, a firewall rule will need to be in place for this option, since you are connecting "across network" (albeit a virtual network). In my experience, Windows will detect the attempt to connect the first time and request user action to automatically create a firewall rule. However, if this message is missed or dismissed, the rule will have to be configured manually.

For WSL1, no firewall rule is necessary, and the "normal" DISPLAY=:0 should work, since it shares the same network interface as Windows (where the X Server is running).

Getting a third-party X Server set up is certainly not the "easiest", so I recommend reading through the other answers here (and elsewhere), if you run into trouble with that technique.

One additional note regarding the firewall rules -- The WSL2 network under Windows is classified as a "Public" network interface, and there doesn't seem to be an easy way to change this in recent Windows releases. It used to be possible, but now that interface is hidden and can't be changed. This means that you have to set up your firewall rules to allow VcXsrv (or any third-party X server) on public networks. This can be a problem if you connect to other untrusted, Public networks.

Remember to either:

  • Shut down VcXsrv when connecting to untrusted networks
  • And/or enforce access control in the X Server.

Third-party X Server - Summary and Scoring:

  • Ease of Installation: Most trouble-prone of the three options, IMHO. Your results may vary, but as you can see from the number of answers (and questions posted across the Stack sites), people do tend to run into various issues with this technique. Cross-network communication (from the Windows host to the WSL2 virtual network) complicates matters.

  • Ease of Use: Moderate to Easy once installed and configured properly. While WSLg will start "on demand" when the first GUI app is executed in WSL, you do need to start the third-party X server yourself when you need it. Or you could leave it up and running at all times, but this will mean longer-term memory use.

  • Flexibility: High - Can run either windowed or full-screen. No Wayland option currently.

    Runs on Windows 10/11 and WSL1/WSL2.

  • Memory Consumption: The best case of these three options. Consumed only 48MB total -- 10MB increase in Vmmem and another 38.6MB for VcXsrv itself.

  • Performance: While I've tended to prefer xrdp, my benchmarking today will have me taking a closer look at VcXsrv in the future (and perhaps other X servers, such as MobaXterm). VcXsrv does some OpenGL acceleration, apparently, and its glmark2 score of 322 was just about double that of xrdp's. VLC playback of H.264 was smooth, even at 3440x1440 (sorry, no 4k with which to test).


Footnote: Measuring memory

To determine the rough memory usage of each technique, I looked at the Vmmem process memory consumption in Windows. This is the virtual machine process that handles WSL2. I rebooted Windows between most of these tests as well, but did a wsl --shutdown between tests of the same technique.

Note that it is possible to enable PulseAudio with each of these options, but only WSLg includes it pre-configured out-of-the-box. I did not enable PulseAudio support on either xrdp or VcXsrv options, so whatever memory is needed there (if you need audio support) is not taken into account.

Footnote: WSLg memory consumption

There are apparently two "bumps" in memory consumption with WSLg. The first occurs when you start WSL2 with WSLg simply "enabled" (the default). I didn't notice this increase at first, because I've never disabled WSLg. It is entirely possible to turn the feature off entirely by editing the .wslconfig file (see this doc) and setting guiApplications=false in the [wsl2] section.

After disabling that feature and restarting my Ubuntu WSL2 instance, my base memory usage dropped 108MB. Turning it back on and restarting showed an increase in "steady state" WSL2 memory consumption. So there's a small penalty to having this enabled all the time.

Then when starting up the initial x client (xterm in this case), there's another 105MB bump in Vmmem.

Footnote: Optimizations

In general, I ran each of these methods using the out-of-the-box, default configuration. I did enable OpenGL acceleration in VcXsrv, and my Windows nVidia drivers are the latest and confirmed to be used for OpenGL Mesa in Ubuntu.

There may be additional optimizations possible for each technique that would improve performance.

2
  • 👍WSLg is better than all others now (2023)
    – Dan D.
    May 25, 2023 at 20:48
  • Excellent comparison, I've been wondering myself what approach to take and maybe some 3-rd party solutions like X410 were better in terms of performance and picture quality but it looks like WSLg beat them all
    – ruslaniv
    Jul 17, 2023 at 16:10
7
+50

According to the official documentation:

You can now preview Windows Subsystem for Linux (WSL) support for running Linux GUI applications (X11 and Wayland) on Windows in a fully integrated desktop experience.

WSL 2 enables Linux GUI applications to feel native and natural to use on Windows.

  • Launch Linux apps from the Windows Start menu
  • Pin Linux apps to the Windows task bar
  • Use alt-tab to switch between Linux and Windows apps
  • Cut + Paste across Windows and Linux apps

You can now integrate both Windows and Linux applications into your workflow for a seamless desktop experience.

Prerequisites

Installing GUI applications on WSL.

Assuming, you've satisfied all the prerequisites and have already installed WSL, you've to now update WSL.

  1. Open a PowerShell window, by clicking Start → typing "Power Shell" → right-clicking Windows PowerShell → Run as administrator.

  2. Update WSL:

    wsl --update
    
  3. You will need to restart WSL for the update to take effect:

    wsl --shutdown
    

You're now ready to begin using GUI apps on WSL.

NOTE: Support for GUI apps on WSL does not provide a full desktop experience. It relies on Windows desktop, so installing desktop-focused tools or apps may not be supported.

Install any GUI application, for example, for installing gedit, run:

sudo apt update
sudo apt install gedit

For launching gedit, run:

gedit /path/to/any/file/you/want/to/edit

GUI apps in WSL

References: Official Documentiation

1
  • Do I need to install some special WSLg version of NVidia driver either in Windows or Ubuntu or both? Or can I just install a regular Windows NVidia driver and that should be enough to provide HW acceleration?
    – ruslaniv
    Jul 17, 2023 at 16:14
5

Based on my research, wsl was originally not designed for GUI users. However, we can install an X-server from the third party to display GUI. I have tested that VcXsrv with some proper setup can be used to display Debian Linux-desktop.

I think my approach works smoothly to display mate-desktop (GUI) on windows subsystem Linux Debian. I have made a video on how to install and display mate-desktop (GUI) on wsl Debian from scratch. Link: https://youtu.be/QjogEWudpaM

The installation of the mate-desktop on Ubuntu is slightly different.

Step 1: install wsl

  • Open PowerShell as an administrator and type Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
  • Install "Debian" or "Ubuntu" from the Microsoft store.

Step 2: install a Graphic user interface, such as mate desktop.

For Debian User:

  • Open Linux console in windows 10 and install mate-desktop by typing: sudo apt-get update, hit enter.
  • After update finish, type sudo apt install task-mate-desktop, hit enter.

OR for Ubuntu User:

  • open ubuntu console from windows 10
  • type sudo apt install tasksel, hit enter
  • type sudo apt update, hit enter
  • type sudo tasksel install ubuntu-mate-desktop, hit enter

Step3: Install the X server in windows 10. I used an open-source server called VcXsrv. It can be downloaded from https://sourceforge.net/projects/vcxsrv/.
Once the installation is completed:

  • open XLauch in windows 10

  • perform the following setup:

    • select: "One large window"
    • select Display number: 0
    • click next
    • select Start no client
    • click next
    • click finish

Step 4: setup in Linux console:

  • type export DISPLAY=:0

  • type export LIBGL_ALWAYS_INDIRECT=1 (maybe this commend is not required)

Step 5: Display mate-desktop GUI:

  • type mate-session for Debian user

  • type mate-session or lightdm-session for Ubuntu user

If you get confused about my description, you can check my youtube videos Install GUI (mate desktop) to Microsoft Windows Subsystem Linux.

2
  • These steps look promising, but I got stuck at the very last one: mate-session results into Unable to init server: Could not connect: Connection refused ** (mate-session:4087): WARNING **: 10:11:55.427: Cannot open display:
    – phi
    Nov 11, 2020 at 9:13
  • 2
    This site gave me the missing infos: github.com/microsoft/WSL/issues/4106 For WSL2 you have to find the actual IP address, because its a separate VM: export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0 Furthermore, the VcXsrv was blocked by my Windows firewall (private/public).
    – phi
    Nov 11, 2020 at 9:40
4

If you want an effortless off the shelf solution, use MobaXTerm. It's a great, multitabbed terminal emulator with direct support for WSL, and has a built-in optimized X server. I use synaptic all the time on Moba. Even RStudio.

3

Since you want it easy... There is an app in the Microsoft Store called x410. It's basically a Cygwin X11 server without the use of Cygwin itself. After installment - that is zero config - you can run WSL X11 Apps! (or even whole desktops). You might want to insert the following lines into your .bashrc (from your WSL user account) so you can run the apps from your bash terminal.

### Setup a D-Bus instance that will be shared by all X-Window apps
pidof dbus-launch 1> /dev/null || dbus-launch --exit-with-x11 1> /dev/null 2> 
/dev/null

## Export
export DISPLAY=127.0.0.1:0.0

I bought x410 on salve for about 5euro's.. So if it's too much, perhaps wait for an sale!

2

I chose Panther's answer not only because it's the only, but also because it's the correct answer; there is no hassle-free (straightforward) way to get gui apps running.

Also, I used this tutorial, with a few changes:

  1. I didn't install xfce, because I don't know why I would need a desktop.
  2. Chose Multiple Windows in XLaunch (No DE, hence no need for one giant window)
  3. No need for mkdir fix and no need for a separate terminal.

What gui apps did I install? Only Synaptic and CMake, since I really can't think of anything else I would need on wsl.

I don't do VM/Dual Boot, for the very same reason Panther pointed out; I need a convenient (to me) dev environment, not a full flex OS.

2
  • vagrantup.com/docs/other/wsl.html - vagrant is an excellent tool to quickly spin up dev environments. Looks like it supports wsl. Though I have not tried it yet. Sep 6, 2018 at 22:26
  • Thanks for the link to the tutorial. That helped solved my problem :). Sep 27, 2020 at 19:01

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .