在 WSL2 上打开 Ubuntu 20.04 桌面

在 WSL2 上打开 Ubuntu 20.04 桌面

我从 Windows 10 应用商店安装了 Ubuntu 20.04(服务器/终端)。通过 WSL2(适用于 Linux 的 Windows 子系统)启动 Ubuntu 终端后,我安装了 Ubuntu 桌面,并执行了几个步骤尝试启动 Ubuntu 20.04 的桌面实例。

简而言之,步骤包括编辑.bashrc文件、安装 Xming,然后尝试使用命令在 Xming 中打开 Ubuntu 桌面startxfce4。但是,startxfce4它并没有为我打开桌面。不过,我可以使用程序grun和文件资源管理器打开gopen,所以它部分工作正常。

有人对我如何让终端打开完整的 Ubuntu 桌面有其他建议吗?显然,这不是 Windows 在 WSL2 中想要的效果,所以这有点牵强,但任何意见都会有帮助。我可以从文件资源管理器或可以从grun或打开的程序中以某种方式执行此操作gopen吗?

答案1

我首选的在 WSL 下获取“完整桌面”的方法是使用xrdp,然后简单地运行 Windows 远程桌面连接以进入桌面管理器。这避免了 Ubuntu 和 Windows 之间的热键冲突。缺点是,它比使用原生 WSLg 慢一点。

最初的问题提到了“Ubuntu 桌面”(假设是 Gnome)以及 Xfce,所以我将提供两者的步骤。Xfce 是两者中比较容易的一个,因为它没有要求系統。

请注意,此更新的答案已经在 Ubuntu 22.10 和 WSL2 版本 1.0.3 上进行了测试。

Xfce

sudo apt install xrdp xfce4
# If asked, select lightdm, although it probably doesn't matter

# Optionally, back up the default config
sudo cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.bak

# Windows Pro and higher are often already running RDP on 3389
# Prevent conflicts:
sudo sed -i 's/3389/3390/g' /etc/xrdp/xrdp.ini

# Prevent Wayland from being used in Xrdp
echo "export WAYLAND_DISPLAY=" > ~/.xsessionrc

# Optional, if you only have one desktop environment installed
echo startxfce4 > ~/.xsession 

sudo service xrdp start
# Or, if running Systemd
sudo systemctl restart xrdp

就这样——你应该能够使用内置的远程桌面连接应用程序。要连接的计算机将是localhost:3390。确保选择 Xorg 作为会话类型。


Gnome 桌面

随着 WSL 最近能够使用 Systemd,这已成为很多更可行的“开箱即用”。我不确定我是否会“推荐它”,但它肯定是可行的。

第一的,启用 Systemd重启 Ubuntu 后,确保 Systemd 正在运行sudo systemctl status

接下来的几个步骤与 Xfce 类似:

# Block ACPI features, which cause issues in WSL2, from being installed with Gnome
sudo apt-mark hold acpid acpi-support

sudo apt install ubuntu-desktop xrdp

# Optionally, back up the default config
sudo cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.bak

# Windows Pro and higher are often already running RDP on 3389
# Prevent conflicts:
sudo sed -i 's/3389/3390/g' /etc/xrdp/xrdp.ini

# Optional if you only have one desktop environment installed
echo gnome-session > ~/.xsession 

~/.xsessionrc使用以下内容创建:

export GNOME_SHELL_SESSION_MODE=ubuntu
export XDG_CURRENT_DESKTOP=ubuntu:GNOME
export XDG_DATA_DIRS=/usr/share/ubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktop
export WAYLAND_DISPLAY=
export XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg

然后:

sudo systemctl restart xrdp

与 Xfce4 一样,你应该能够使用内置的远程桌面连接应用程序。要连接的计算机将是localhost:3390。确保选择 Xorg 作为会话类型。

答案2

我设法使用以下方法运行了完整的 Ubuntu 20.04 Unity 桌面 GUI 虚拟主机通过安装GNOME 桌面ubuntu-wsl2-systemd-脚本然后将脚本附加到我的~/.bashrc文件中。

最初,Ubuntu 只有 root 访问权限,因此请创建一个具有sudo权限的普通账户:

sudo adduser username
sudo usermod -aG sudo username
exit

从现在开始,使用该帐户启动 WSL:

wsl.exe -d distroname -u username

笔记:
ubuntu-wsl2-systemd-scriptsystemd使用调用--system-unit=basic.target ,因此不会启动gdm或服务,因此在安装之前lightdm编辑enter-systemd-namespacestart-systemd-namespace文件并更改为--system-unit=basic.target--system-unit=default.target

# runs only if 1st level shell
if [ $SHLVL = 1 ] &&
   [ -d "${srv_path="/mnt/c/Program Files/VcXsrv"}" ] &&
   [ -f "${srv_exec="$srv_path"/"${srv_name=vcxsrv.exe}"}" ] &&
   [ -d "${sys_path="/mnt/c/Windows/System32"}" ] &&
   [ -f "${tasklist="$sys_path"/tasklist.exe}" ] &&
   [ -f "${taskkill="$sys_path"/taskkill.exe}" ]; then
   # find a Windows Process ID
   function find_wpid {
     echo $("$tasklist" | grep "$1" | awk '{print $2; exit}')
     }
   # kill a Windows Process ID
   function kill_wpid {
     "$taskkill" /PID $1 /F /T >/dev/null
     }
   # export the Windows %UserProfile% path in Linux Format
   export WIN_HOME="$(wslpath "$($sys_path"/cmd.exe" /c "<nul set /p=%UserProfile%" 2>/dev/null)")"
   # Find the current WSL2 local IP address
   srv_addr="$(ip route | awk '{print $3; exit}')";
   # shutdown old instance of VcXsrv if running
   if [ "${gfx_wpid=$(find_wpid $srv_name)}" ]; then
     kill_wpid $gfx_wpid
     unset gfx_wpid
   fi
   # start a new instance of VcXsrv
   "$srv_exec" :0 -ac -wgl -fullscreen -notrayicon -dpms &
   # wait for startup success
   while [ -z $gfx_wpid ]; do gfx_wpid=$(find_wpid $srv_name); done
   # Start Windows Pulse Audio if installed
   unset srv_exec srv_name 
   if [ -f "${srv_exec="$srv_path"/pulse/bin/"${srv_name="pulseaudio.exe"}"}" ]; then
      # shutdown old instance of Pulse if running
      if [ ${snd_wpid=$(find_wpid $srv_name)} ]; then
        kill_wpid $snd_wpid
        unset snd_wpid
      fi
      # delete the expired Pulse config
      if [ -d "${snd_conf=$WIN_HOME"/.config/pulse"}" ]; then
        rm -r "$snd_conf"
      unset snd_conf
      fi
      # Start a new instance of Pulse
      "$srv_exec" --use-pid-file=false --disable-shm=true --exit-idle-time=-1 &
      while [ -z $snd_wpid ]; do snd_wpid=$(find_wpid $srv_name); done
      export PULSE_SERVER=tcp:"$srv_addr";
   fi
   # setup Ubuntu Desktop
   export DISPLAY="$srv_addr":0; 
   # setting below: 0 = llvmpipe (faster), 1 = software rasterizer
   export LIBGL_ALWAYS_INDIRECT=0
   export XDG_CONFIG_HOME=$HOME/.config
   export XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
   export XDG_SESSION_DESKTOP=ubuntu
   export XDG_SESSION_TYPE=x11
   export XDG_CURRENT_DESKTOP=ubuntu:GNOME
   export XDG_SESSION_CLASS=user
   export XDG_DATA_DIRS=/usr/share/ubuntu:/usr/local/share/:/usr/share/:/var/lib/snapd/desktop
   # cleanup expired vars
   unset tasklist sys_path srv_path srv_exec srv_name srv_addr
   # script stays here until gnome-session logout or failure
   gnome-session
   # shutdown VcXsrv
   if [ $gfx_wpid ]; then
     kill_wpid $gfx_wpid
     unset gfx_wpid 
   fi
   # shutdown Pulse
   if [ $snd_wpid ]; then
     kill_wpid $snd_wpid
     unset snd_wpid
   fi
   unset taskkill
   # shutdown the shell
   exit 0
fi

笔记:
当一切正常后,转到 Ubuntu 的设置->隐私->屏幕锁并关闭屏幕锁定选项。出于某种原因,尝试在屏幕锁定后重新登录会导致在要求输入密码时出现无限循环。如果发生这种情况,只需关闭 WSL 发行版,下次启动时一切又会恢复正常。

可选音频支持

下载并解压mingw64-pulseaudio-13.0.7z. 编辑\mingw\etc\pulse\default.pa文件并将第 38 行替换load-module module-waveout sink_name=output source_name=input为:

load-module module-waveout sink_name=output source_name=input record=0
load-module module-native-protocol-tcp listen=0.0.0.0 auth-anonymous=1

保存更改,将mingw文件夹重命名为pulse并将其移动到您的C:\Program Files\VcXsrv文件夹中。
我不确定是否需要此步骤,但是我也通过以下方式安装了这些应用程序...

sudo apt-get install alsa-tools-gui pavumeter pavucontrol

除非您退出 WSL2 Ubuntu 桌面并重新登录,否则无法立即访问互联网。这对我来说很方便,因为我有时间将更新从我的真实 Ubuntu 复制到 WSL2 Ubuntu,而无需重新下载它们。

答案3

这是 2023 年底,WSL2、Ubuntu 和 GNOME 已经足够成熟,可以basic.target在启动时自动启动显示管理器systemd。因此,无需修改ubuntu-wsl2-systemd-脚本。以下是通过 X 转发连接 WSL2 + Ubuntu GNOME 的完整独立解决方案。请注意,此答案适用于 X 转发。如果您希望使用 Windows 远程桌面连接 GNOME,请按照工作说明进行操作这里

环境:

  • 主机:戴尔台式机,CPU:i5-4690,内存:16GB DDR3
  • Windows:Windows 10 22H2,教育版 64 位,[版本 10.0.19045.3693]
  • WSL2:2.0.9.0
  • 客户操作系统:Ubuntu 22.04.3 LTS
  • GUI 桌面:GNOME 42.9
  • X 服务器:VcXsrv 1.20.14.0

解决方案:

  1. 在 1903 或更高版本的 Windows 机器上安装 WSL + Ubuntu(我使用的是 22H2)。
    • 以管理员身份打开 Windows 命令行。运行
      dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
      dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
      
      启用 Windows Subsystem for Linux 和虚拟机功能。
    • 重新启动 Windows 以应用上述步骤。此步骤不能跳过。
    • 从以下位置下载 WSL2 更新包这里并安装它。如果您没有在上述步骤中重新启动,您将收到错误“此更新仅适用于具有 Windows Subsystem for Linux 的计算机”和“Windows Subsystem for Linux 更新安装向导过早结束”。
    • 打开 Windows 命令行(这次不需要管理员身份)并运行 wsl --install -d ubuntu
    • 在提示符中输入 UNIX 用户名(即 Ubuntu 用户名)和密码。
  2. WSL2 + Ubuntu 安装完成后,在 Ubuntu 命令行中运行
sudo apt update
sudo apt-mark hold acpid acpi-support
sudo apt upgrade
  1. 安装 GNOME:sudo apt install ubuntu-desktop gnome
  2. 安装ubuntu-wsl2-systemd-脚本
cd ~
git clone https://github.com/DamionGans/ubuntu-wsl2-systemd-script.git
cd ubuntu-wsl2-systemd-script/
./ubuntu-wsl2-systemd-script.sh
  1. 输入 退出 WSL 和 Ubuntu exit。在 Windows 命令行中,运行
wsl --shutdown
wsl --update
wsl
  1. 当您回到 WSL 中的 Ubuntu 命令行时,导出以下环境变量:
export DISPLAY="$(ip route | awk '{print $3; exit}')":0;
export XDG_CONFIG_HOME=$HOME/.config
export XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
export XDG_SESSION_DESKTOP=ubuntu
export XDG_SESSION_TYPE=x11
export XDG_CURRENT_DESKTOP=ubuntu:GNOME
export XDG_SESSION_CLASS=user
export XDG_DATA_DIRS=/usr/share/ubuntu:/usr/local/share/:/usr/share/:/var/lib/snapd/desktop
export GNOME_SHELL_SESSION_MODE=ubuntu
export XDG_RUNTIME_DIR="/run/user/1000"
sudo mkdir -p /run/user/1000
sudo chmod 700 /run/user/1000
sudo chown $(whoami): /run/user/1000

  1. https://sourceforge.net/projects/vcxsrv/下载 VcXsrv Windows X Server。我使用的版本是 1.20.14.0。在 Windows 中安装它。
  2. 在 Windows 中运行 XLaunch 启动 VcXsrv(如果之前有 VcXsrv 正在运行,请退出。VcXsrv 的设置很重要)。在第一页中选择“全屏”。在第三页的“VcXsrv 的其他参数”字段中填写-ac -wgl -dpms

当 VcXsrv 启动时,您可能会看到整个黑屏。这是全屏但没有任何内容的效果。按 Alt-Tab 可切换到 WSL 中的 Ubuntu 命令行。

  1. 跑步dbus-launch --exit-with-session gnome-session
  2. 转到全屏 VcXsrv 窗口。Ubuntu GNOME 桌面现在应该会出现。尽情享受吧!
  3. 不使用 GNOME 时,您可以将其保留。但如果您真的想退出 GNOME,请关闭 VcXsrv 窗口或在 WSL 中的 Ubuntu 命令行上按 Ctrl-C。

相关内容