nullpo-head / wsl-distrod

Distrod is a meta-distro for WSL 2 which installs Ubuntu, Arch, Debian, Gentoo, etc. with systemd in a minute for you. Distrod also has built-in auto-start feature on Windows startup and port forwarding ability.
MIT License
1.9k stars 90 forks source link

[Bug]: Distrod causes X11 to not work under wslg. #56

Closed dyharlan closed 2 years ago

dyharlan commented 2 years ago

Describe the bug

XWayland under WSLg doesn't work anymore when installing Distrod. It seems like systemd is ignoring the x11.conf that allows the distro to bind-mount /mnt/wslg/.X11-unix to /tmp/.X11-unix

Otherwise, wayland apps run fine.

I am using systemd 251.2-1 Also, I'm using the Windows Store version of WSL.

Steps to reproduce

  1. Install distrod
  2. Run a X11 application under WSLg.
  3. The application complains that it cannot find :0.

Expected behavior

For .X11-unix to be properly bind-mounted in /tmp and run XWayland apps.

Windows version

Microsoft Windows 11 21H2 [Version 10.0.22000.708]

Linux kernel version

5.10.102.1-microsoft-standard-WSL2

Distro

ArchWSL 22.3.18.0

How did you install that distro?

Enabled distrod in an existing WSL2 distro

Logs

[Distrod][DEBUG] distrod-exec: exec_command_in_distro [Distrod][DEBUG] starting /init from distrod-exec [Distrod][DEBUG] WSL envs: "WSL_INTEROP" = "/run/WSL/8_interop" [Distrod][DEBUG] WSL envs: "WSL_DISTRO_NAME" = "ArchLinux" [Distrod][DEBUG] WSL envs: "WSLENV" = "WT_SESSION::WT_PROFILE_ID" [Distrod][DEBUG] Container::with_mount source: Some(HostPath("/run/distrod/cmdline")), target: ContainerPath("/proc/cmdline"), fstype: None, flags: MS_BIND, is_file: true [Distrod][TRACE] mount_distrod_run_files: path: "/opt/distrod/run/systemd" [Distrod][TRACE] mount_distrod_run_files: path: "/opt/distrod/run/systemd/system" [Distrod][TRACE] mount_distrod_run_files: path: "/opt/distrod/run/systemd/system/portproxy.service" [Distrod][DEBUG] Container::with_mount source: Some(HostPath("/opt/distrod/run/systemd/system/portproxy.service")), target: ContainerPath("/run/systemd/system/portproxy.service"), fstype: None, flags: MS_BIND, is_file: true [Distrod][TRACE] mount_distrod_run_files: path: "/opt/distrod/run/tmpfiles.d" [Distrod][TRACE] mount_distrod_run_files: path: "/opt/distrod/run/tmpfiles.d/x11.conf" [Distrod][DEBUG] Container::with_mount source: Some(HostPath("/opt/distrod/run/tmpfiles.d/x11.conf")), target: ContainerPath("/run/tmpfiles.d/x11.conf"), fstype: None, flags: MS_BIND, is_file: true [Distrod][DEBUG] DistroLauncher::launch [Distrod][DEBUG] Container::with_mount source: Some(HostPath("/run/distrod/distrod_wsl_env-uid1000")), target: ContainerPath("/run/distrod/distrod_wsl_env-uid1000"), fstype: None, flags: MS_BIND, is_file: true [Distrod][DEBUG] Spawning the command or the waiter. [Distrod][DEBUG] Executing a command in the distro. [Distrod][DEBUG] Failed to ignore signal Sys(EINVAL) [Distrod][DEBUG] Failed to ignore signal Sys(EINVAL) [Distrod][DEBUG] Distro::exec_command. [Distrod][DEBUG] Container::exec_command. [Distrod][TRACE] mounting source: Some( ContainerPath( "/run/distrod/cmdline", ), ), mount: ContainerMount { source: Some(HostPath("/run/distrod/cmdline")), target: ContainerPath("/proc/cmdline"), fstype: None, flags: MS_BIND, data: None, is_file: true } [Distrod][TRACE] mounting source: Some( ContainerPath( "/opt/distrod/run/systemd/system/portproxy.service", ), ), mount: ContainerMount { source: Some(HostPath("/opt/distrod/run/systemd/system/portproxy.service")), target: ContainerPath("/run/systemd/system/portproxy.service"), fstype: None, flags: MS_BIND, data: None, is_file: true } [Distrod][TRACE] mounting source: Some( ContainerPath( "/opt/distrod/run/tmpfiles.d/x11.conf", ), ), mount: ContainerMount { source: Some(HostPath("/opt/distrod/run/tmpfiles.d/x11.conf")), target: ContainerPath("/run/tmpfiles.d/x11.conf"), fstype: None, flags: MS_BIND, data: None, is_file: true } [Distrod][TRACE] skipping an identical mount: Some( ContainerPath( "/run/distrod/distrod_wsl_env-uid1000", ), ), ContainerMount { source: Some( HostPath( "/run/distrod/distrod_wsl_env-uid1000", ), ), target: ContainerPath( "/run/distrod/distrod_wsl_env-uid1000", ), fstype: None, flags: MS_BIND, data: None, is_file: true, } [Distrod][DEBUG] Triple fork done. [Distrod][DEBUG] dropping privilege. kmsg logging in the child ends here. [Distrod][DEBUG] The parent of the second of three forks exits. [Distrod][DEBUG] Spawning the command or the waiter. [Distrod][DEBUG] Spawning the waiter. [Distrod][DEBUG] Failed to ignore signal Sys(EINVAL) [Distrod][DEBUG] Failed to ignore signal Sys(EINVAL)

additional comment

No response

Locietta commented 2 years ago

I also run into the same error here.

This issue seems specific to the latest version of WSL on MS Store (0.60.0), where it uses a bind mount to handle /etc/.X11-unix instead of symlink previously. (See WSL 0.60.0 release page)

For now, a workaround is to downgrade WSL to previous version, versions before 0.60.0 works with distrod without this issue.