Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unable to accessing Windows applications from WSL #4793

Closed
kid1412621 opened this issue Jan 2, 2020 · 28 comments
Closed

Unable to accessing Windows applications from WSL #4793

kid1412621 opened this issue Jan 2, 2020 · 28 comments

Comments

@kid1412621
Copy link

Please fill out the below information:

  • Your Windows build number: Microsoft Windows [Version 10.0.19041.1]

  • What you're doing and what's happening:

  1. follow this document start a node app on Windows (Powershell 7.0.0-rc.1);
    image

  2. request the app from WSL;

  NAME      STATE           VERSION
* Ubuntu    Running         2

image

  • What's wrong / what should be happening instead:
    Unable access Windows applications from WSL.
@craigloewen-msft
Copy link
Member

Seems likely that this is related to this issue: #4139

@therealkenc
Copy link
Collaborator

therealkenc commented Jan 2, 2020

Seems likely that this is related to this issue: #4139

Related #4619 (it can be both, too).

On the Windows side, listen on 172.17.48.1 (or a subnet) instead of 127.0.0.1. Or ever-popular 0.0.0.0.

@numeric-lee
Copy link

numeric-lee commented Jan 20, 2020

I was able to use graphic applications in WSL using XMING and Export DISPLAY=:0.0

However, once I upgraded to WSL2 and switching to Export DISPLAY = 172.28.801:0 (my host#) it failed to connect

Things tried:

downloading VcXsrv
switching to another graphics application
running vcxsrv -ac from bash (command not recognized)
running vcxsrv -ac from powershell (command not recognized)
turning firewall off
My Windows 10 build: 19041.1

Here is a typical error message

QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-lw' qt.qpa.screen: QXcbConnection:
Authorization required, but no authorization protocol specified
Could not connect to any X display.

In #4106 you advise to run "vcxsrv -ac" from the bash command line and at least one user accepted that as a solution. I downloaded vcxsrv.exe from sourceforge as an .exe outside of bash, and I see no way to execute it from bash

Many thanks

@fredericseiler
Copy link

Hi,

A quick & dirty workaround

  • Install VcXsrv, then run XLaunch:
    image

  • Specify your display port:
    image

  • Select "Start no client":
    image

  • Don't forget to check "Disable access control" (the "-ac" switch, listen on all interfaces):
    image

  • Finish the configuration and verify that VcXsrv is actually listening on all interfaces (hostname:0.0):
    image

  • Find your host LAN IP address (your real Ethernet/Wifi IP, ex. 192.168.1.3)

  • On your wsl distro shell, modify the $DISPLAY env:

    export DISPLAY=192.168.1.3:0.0
    export LIBGL_ALWAYS_INDIRECT=1
  • Then, you can start any GUI app:
    image

At the time of writing, for any wsl > host connection, you have to listen on the host side for all interfaces (eg. 0.0.0.0) and specify the host LAN IP address on the wsl distro side:

image

If you really want to use the /etc/resolv.conf host IP address (the one from the Hyper-V virtual ethernet adapter), you have to play with the public profile of Windows Defender Firewall. At your own risk. Dealing with private profile rules makes me much more comfortable.

@numeric-lee
Copy link

numeric-lee commented Jan 29, 2020

@fredericseiler @therealkenc
Thanks for the clear response and the additional details
I followed your instructions, still experiencing the same issues
I am running with the windows firewall turned off
the IP address has been dummified

(base) yy@ZZ:$ export DISPLAY=999.88.77.1:0.0
(base) yy@ZZ:
$ export LIBGL_ALWAYS_INDIRECT=1

example 1

(base) yy@ZZ:$ spyder &
[1] 18558
(base) yy@ZZ:
$ QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-yy'
qt.qpa.screen: QXcbConnection: Could not connect to display 999.88.77.1:0.0
Could not connect to any X display.

example 2

(base) yy@ZZ:$ glxgears &
[1] 19820
(base) yy@ZZ:
$ Error: couldn't open display 999.88.77.1:0.0

Any additional suggestions? any workarounds where I fallback on the methods which worked successfully in WSL1?

@fredericseiler
Copy link

It's one of a kind IP address you got there.

@numeric-lee
Copy link

The iP address has been dummified :)

@fredericseiler
Copy link

Didn't see that part, my bad. You don't need to obfuscate the IP, as only devices in your own private network can reach it. Or maybe are your trying to use your WAN IP ?

What is the result of a ping host_lan_ip_address from your WSL distro ?

@numeric-lee
Copy link

@fredericseiler @therealkenc
I just solved it with that last hint. Your instructions were accurate, superior to the official documentation, and much appreciated. However, there were two different IPv4 Addresses, one for the Ethernet adapter and one for the WiFI. Once I substituted the second IPV4 address, it worked. Thanks so much.

@fredericseiler
Copy link

I'm glad if that helped you ;)

Alternatively, you can mess around with the Windows Firewall and disable the WSL interface protection (while letting the Firewall turned on for the other interfaces) every time you start your computer (for example, via a powershell script in a scheduled task). This way, you can use the host Hyper-V IP (the one from /etc/resolv.conf). And as a bonus, you can add linux-side services automatic startup in your script.

# hide errors
$ErrorActionPreference = 'silentlycontinue'

# start VcXsrv with a custom profile
Start-Process -FilePath "$Env:ProgramFiles\VcXsrv\xlaunch.exe" -ArgumentList "-run `"$Env:USERPROFILE\config.xlaunch`""

# disable the WSL interface in the Windows Firewall
Set-NetFirewallProfile -DisabledInterfaceAliases "vEthernet (WSL)"

# start some services (nginx, cron, dbus...)
# don't forget to allow sudo without password for commands that need it
wsl /home/frederic/.local/bin/services.sh

Other options:

  • Wait for the public 20H1 release, hoping that the clever guys of MS figured out something to fix this issue (and others)
  • Linux in a VM (awfully slow and unsuitable for coding and keyboard shortcuts)
  • The full Linux desktop experience (my laptop is unfortunately not a ThinkPad, so it was just shitty for me; Nvidia Optimus issues, no battery charging limit, and so on)
  • Buy an overexpensive Mac like every other dev who just ship things instead of bothering with this like us...

@winest
Copy link
Member

winest commented Feb 19, 2020

I come up with an script after checking discussions, which makes things easier without adding Firewall rules and not exposing public IP.

[Updated Feb.21]
For enterprise firewall, try also adding this
powershell -Command "Set-NetFirewallProfile -DisabledInterfaceAliases \"vEthernet (WSL)\""

To make it works:

  1. On Windows, save the following code as xxx.bat, and you can make it run when boot if you like:
@ECHO OFF

REM Start WSL once to create WSL netowrk interface
wsl exit

REM Find IP for WSL network interface
SET WSL_IF_IP=
CALL :GetIp "vEthernet (WSL)" WSL_IF_IP
ECHO WSL_IF_IP=%WSL_IF_IP%
setx "WSL_IF_IP" "%WSL_IF_IP%"
setx "WSLENV" "WSL_IF_IP/u"

REM Change E:\VcXsrv to your VcXsrv installation folder
START /D "E:\VcXsrv" /B vcxsrv.exe -multiwindow -clipboard -nowgl -ac -displayfd 720
GOTO :EOF



:GetIp ( aInterface , aIp )
(
    SETLOCAL EnableExtensions EnableDelayedExpansion
    FOR /f "tokens=3 delims=: " %%i IN ('netsh interface ip show address "%~1" ^| findstr IP') DO (
        SET RET=%%i
    )
)
(
    ENDLOCAL
    SET "%~2=%RET%"
    EXIT /B
)
  1. In WSL, edit ~/.bashrc file to add following lines:
export DISPLAY=$WSL_IF_IP:0
unset LIBGL_ALWAYS_INDIRECT

That's all to make WSL2 works automatically. The idea is to get the private LAN IP of WSL interface on Windows, and use Environment variable to pass to WSL. WSL then update this LAN IP to DISPLAY for X-Server connection.

@gx761
Copy link

gx761 commented Feb 27, 2020

This issue should not be closed, the solution provided by @fredericseiler only works when the service on host machine is listening on 0.0.0.0. But in my case, there is a proxy service listening on localhost, and the service is initiated by another software which is not configurable. To access any internal resources from my company, I have to visit through this proxy. Before, in wsl1, the proxy is usable by setting --proxy=http://127.0.0.1:12639. However, since wsl2 does not have built-in support for this and the solution mentioned above cannot deal with this either, I really hope the microsoft team can put some serious effort on this and give us a clean solution. Just try to be consistent with the wsl1.

@KindDragon
Copy link

This worked for me:
#4106 (comment)

@code-SL
Copy link

code-SL commented Mar 22, 2020

I have two different devices with win 10 pro, one where wsl2 can connect to a 127.0.0.1 app (thinkpad t480), but the other laptop (an older Celeron Acer) is unable to do so with the same configuration. Both are win 10 pro, "slow" insider build (# 19041).

Getting "connection refused" errors on wsl2 Debian using curl to test, after having set up nodejs on the windows side and running node on the test app app.js. This app is listening on http://127.0.0.1:3000. cmd.exe on the windows side connects successfully using curl to 127.0.0.1:3000, so can confirm it's up.

Firewall settings allow node.exe allowed on private and public networks. Racking my head and can't figure it out, esp since the other laptop has the same config and just works!

The fact I don't have to explicitly specify IP address of the windows host on the thinkpad suggests you don't have to in all cases?

@gwd999
Copy link

gwd999 commented Mar 29, 2020

same problem - none of the above work on WSL2 neither with Xming nor with VcxSrvr. Tried all of them EXPORT DISPLAY=localhost:0.0 (or 127.0.0.1) or DISPLAY=Some.WSL.IP.Address:0 -> NOPE nothing can be done to make WSL2 (in my case Ubuntu 18.04) run some xeyes or xclock X-Windows, not to mention any Firefox or similar app. The only solution for me was to set up a fully fledged X-Windows env on Ubuntu and log into it via Remote Desktop; NOT really what was intended with WSL2 in the first place, was it?

@fquinner
Copy link

fquinner commented Apr 1, 2020

For what it's worth, I put some documentation together on how to get the firewall playing nicely with X11 here:

https://github.com/cascadium/wsl-windows-toolbar-launcher#firewall-rules

My main problem was I didn't realize that that security prompt actually adds a Block rule when you uncheck that box as opposed to simply deciding not to add an Allow rule. So I needed to both disable that rule, and add my own to allow the path through.

The IP i use in my .bashrc is from:

export DISPLAY=$(grep -m 1 nameserver /etc/resolv.conf | awk '{print $2}'):0.0

@famelis
Copy link

famelis commented Apr 5, 2020

(2nd update)
I created some scripts, which can be run either when boot or from WSL or from Powershell.

They launch, in a transparent manner. a windowed KDE, using VcXsrv and the accompanying Xlaunch. It works very well and has no problems with reboots or shutting it down and back again

A 2nd working version has been uploaded at:
https://github.com/famelis/wsl2-x11

@luochen1990
Copy link

image

@fredericseiler I'm trying your powershell solution, and it works well (tips: we need set-ExecutionPolicy RemoteSigned and set up this task as admin authority). But there is a little issue: the windows defender still display the unsafe wranning, I believe this is a false positive, but it disturbing... hoping that the clever guys of MS fix it...

@medmin
Copy link

medmin commented Dec 29, 2020

For what it's worth, I put some documentation together on how to get the firewall playing nicely with X11 here:

https://github.com/cascadium/wsl-windows-toolbar-launcher#firewall-rules

My main problem was I didn't realize that that security prompt actually adds a Block rule when you uncheck that box as opposed to simply deciding not to add an Allow rule. So I needed to both disable that rule, and add my own to allow the path through.

The IP i use in my .bashrc is from:

export DISPLAY=$(grep -m 1 nameserver /etc/resolv.conf | awk '{print $2}'):0.0

This works for me.

But I had to execute wsl --shutdown in PowerShell to restart wsl2

@OlivierMiriel
Copy link

Hi,
I might be not so skilled as you guys because I think I tried what I have red here but without any success:

I am on Ubuntu 20.04.2 LTS on WSL2.
my Ethernet vEthernet (WSL) IPv4 is 192.168.xx.y.
VcXsrv is launched
then I tried:
$ export DISPLAY=192.168.xx.y:0.0
$ export LIBGL_ALWAYS_INDIRECT=1
but whatever I try to launch it doesn't open anything...

something is wrong, but where should I look first ?

thanks

@lackovic
Copy link

lackovic commented May 7, 2021

$ export DISPLAY=192.168.xx.y:0.0

Use the following command instead:

export DISPLAY=${DISPLAY:-$(grep -Po '(?<=nameserver ).*' /etc/resolv.conf):0}

@OlivierMiriel
Copy link

thanks lackovic,
I've tried your suggestion, with -oP or -Po, but unfortunately it's still not working...

one question: should I keep the following line in the bashrc ?

export LIBGL_ALWAYS_INDIRECT=1

at the moment my bashrc looks like as below, and includes several lines I have tested with no success:

# export DISPLAY=localhost:0.0
# export DISPLAY=$(grep -oP "(?<=nameserver ).+" /etc/resolv.conf):0
# export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0
export DISPLAY=$(DISPLAY:-$(grep -oP '(?<=nameserver ).*' /etc/resolv.conf):0)
export LIBGL_ALWAYS_INDIRECT=1
# export DISPLAY=$(ipconfig.exe | awk '/IPv4/ {sub("\r",":0"); print $NF;exit}')

I am still hoping it will be possible to fix this issue..

@lackovic
Copy link

one question: should I keep the following line in the bashrc ?

export LIBGL_ALWAYS_INDIRECT=1

Yes.

at the moment my bashrc looks like as below, and includes several lines I have tested with no success:

Try following these instructions.

@therealkenc
Copy link
Collaborator

therealkenc commented May 10, 2021

export LIBGL_ALWAYS_INDIRECT=1

Yes.

No. This guidance (tragically) made it into several widely distributed guides for X11 on WSL, and is incorrect.

lackovic added a commit to lackovic/notes that referenced this issue May 13, 2021
@lackovic
Copy link

lackovic commented May 25, 2021

No. This guidance (tragically) made it into several widely distributed guides for X11 on WSL, and is incorrect.

After I removed it I got the following errors every time I ran a Windows application through XLauch (VcXsrv):

libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast

Setting Wgl="False" in my XLaunch configuration has fixed the issue.

@lengocthuong15
Copy link

lengocthuong15 commented Aug 28, 2021

In my case, I am using MobaXterm and it built-in X11 server, so I need to enable all process like this in firewall in order to access WSL GUI
(Besides all the setting likes export DISPLAY variable, enable firewall rule for port 6000)

Goto : Control Panel\All Control Panel Items\Windows Defender Firewall\Allowed apps

image

@ghylander
Copy link

ghylander commented Feb 24, 2022

Hi all, I've been following the suggestions and many fixes in this thread, to no avail
I've been having trouble setting up gui support for wsl2, and honestly the docs are laughable

After following the many comments here, I managed to get gimp to start (the app I've been using to debug this)
However, I'm now getting an error with a x server resource being unavailable, after which the program crashes. The GIMP start up window and toolbars will show up for a second before it crashes. Here the error:

image

What could be the cause of this? I already added a firewall rule to accept TCP traffic in port 6000, and made sure VcXsrv is allowed to communicate through the firewall.
I tried the batch file and /.bashrc "trick" but I get the exact same result

@Shatila02
Copy link

In my case I had to checked the "Disable access control" box while lauching the display to avoid the following error "Authorization required, but no authorization protocol specified
Error: Can't open display: 10.0.0.99:0.0".

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests