我从 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-namespace
和start-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
解决方案:
- 在 1903 或更高版本的 Windows 机器上安装 WSL + Ubuntu(我使用的是 22H2)。
- 以管理员身份打开 Windows 命令行。运行
启用 Windows Subsystem for Linux 和虚拟机功能。dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
- 重新启动 Windows 以应用上述步骤。此步骤不能跳过。
- 从以下位置下载 WSL2 更新包这里并安装它。如果您没有在上述步骤中重新启动,您将收到错误“此更新仅适用于具有 Windows Subsystem for Linux 的计算机”和“Windows Subsystem for Linux 更新安装向导过早结束”。
- 打开 Windows 命令行(这次不需要管理员身份)并运行
wsl --install -d ubuntu
- 在提示符中输入 UNIX 用户名(即 Ubuntu 用户名)和密码。
- 以管理员身份打开 Windows 命令行。运行
- WSL2 + Ubuntu 安装完成后,在 Ubuntu 命令行中运行
sudo apt update
sudo apt-mark hold acpid acpi-support
sudo apt upgrade
- 安装 GNOME:
sudo apt install ubuntu-desktop gnome
。 - 安装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
- 输入 退出 WSL 和 Ubuntu
exit
。在 Windows 命令行中,运行
wsl --shutdown
wsl --update
wsl
- 当您回到 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
- 去https://sourceforge.net/projects/vcxsrv/下载 VcXsrv Windows X Server。我使用的版本是 1.20.14.0。在 Windows 中安装它。
- 在 Windows 中运行 XLaunch 启动 VcXsrv(如果之前有 VcXsrv 正在运行,请退出。VcXsrv 的设置很重要)。在第一页中选择“全屏”。在第三页的“VcXsrv 的其他参数”字段中填写
-ac -wgl -dpms
。
当 VcXsrv 启动时,您可能会看到整个黑屏。这是全屏但没有任何内容的效果。按 Alt-Tab 可切换到 WSL 中的 Ubuntu 命令行。
- 跑步
dbus-launch --exit-with-session gnome-session
- 转到全屏 VcXsrv 窗口。Ubuntu GNOME 桌面现在应该会出现。尽情享受吧!
- 不使用 GNOME 时,您可以将其保留。但如果您真的想退出 GNOME,请关闭 VcXsrv 窗口或在 WSL 中的 Ubuntu 命令行上按 Ctrl-C。