前言:最近刚换一台新的电脑,在准备安装 Win10 / Linux 双系统时,了解到 Win10 推出了 WSL 功能,于是决定体验一下。

1. WSL 简介

1.1 什么是 WSL ?

要想使用 Linux 系统,以前通常有两种方式:(1)使用虚拟机,(2)直接使用 Linux 系统。使用虚拟机时开销较大;直接使用 Linux 系统虽然可以带来最流畅的体验,但是与 Windows 系统之间进行切换时比较麻烦,一次只能使用一个系统。

为此,微软开发了适用于 Linux 的 Windows 子系统,称为 WSL,可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具、实用工具和应用程序 - 且不会产生传统虚拟机或双启动设置开销。简单点来说,有了 WSL,就可以在 Windows 系统中像运行软件一样运行 Linux 系统。

1.2 WSL1 与 WSL2

在这里插入图片描述
将适用于 Linux 的 Windows 子系统从 WSL 1 升级到 WSL 2 的主要区别和优势是:

  • 提高文件系统性能,
  • 支持完全的系统调用兼容性。

WSL 2 使用最新、最强大的虚拟化技术在轻量级实用工具虚拟机 (VM) 中运行 Linux 内核。 但是,WSL 2 不是传统的 VM 体验。

2. 安装 WSL

2.1 安装 WSL1

(1)启用“适用于 Linux 的 Windows 子系统”可选功能

需要先启用“适用于 Linux 的 Windows 子系统”可选功能,然后才能在 Windows 上安装 Linux 分发。可以使用命令行的方式,也可以使用图形界面的方式。

图形界面方式

在【设置 -> 更新与安全->开发者选项】中开启【开发人员模式】
在这里插入图片描述
在【程序和功能 -> 启用或关闭 Windows 功能】中勾选【适用于 Linux 的 Windows 子系统】
在这里插入图片描述

命令行方式

以管理员身份打开 PowerShell 并运行:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

(2)重启电脑

(3)安装 Linux 发行版,如 Ubuntu

在 Microsoft Store 中下载并安装需要的 Linux 发行版
在这里插入图片描述

(4)启动 Linux 子系统

至此,Linux 子系统就相当于 Windows 系统上安装的一个软件,可以在开始菜单子启动。

首次启动新安装的 Linux 分发版时,将打开一个控制台窗口,系统会要求你等待一分钟或两分钟,以便文件解压缩并存储到电脑上。 未来的所有启动时间应不到一秒。

然后,需要为新的 Linux 分发版创建用户帐户和密码。
在这里插入图片描述
至此,已成功安装并设置了与 Windows 操作系统完全集成的 Linux 分发!

可打开 PowerShell 命令行并输入以下命令(仅在 Windows 内部版本 18362 或更高版本中可用),检查分配给每个已安装的 Linux 分发版的 WSL 版本:wsl -l -v

PS C:\Users\user-name> wsl --list --verbose
  NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         1

2.2 升级到 WSL2

(1)开启“虚拟机平台”可选功能

同样地,可以采用图形界面的操作方式,也可以采用命令行的方式。

图形界面方式
在之前的基础上,勾选【虚拟机平台】。
在这里插入图片描述
命令行方式

以管理员身份打开 PowerShell 并运行:

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

(2)重启电脑

(3)下载 Linux 内核更新包

下载最新包:适用于 x64 计算机的 WSL Linux 内核更新包

然后双击运行,安装
在这里插入图片描述

(4)设置 WSL 版本

PS C:\Users\user-name> wsl --set-version Ubuntu-20.04 2
正在进行转换,这可能需要几分钟时间...
有关与 WSL 2 的主要区别的信息,请访问 https://aka.ms/wsl2
转换完成。

说明:

  • 若要将分发版设置为受某一 WSL 版本支持,请运行:
wsl --set-version <distribution name> <versionNumber>

请确保将 <distribution name> 替换为你的分发版的实际名称,并将 <versionNumber> 替换为数字“1”或“2”。 可以随时更改回 WSL 1,方法是运行与上面相同的命令,但将“2”替换为“1”。

  • 如果要使 WSL 2 成为你的默认体系结构,可以通过此命令执行该操作:
wsl --set-default-version 2

从 WSL 1 更新到 WSL 2 可能需要几分钟才能完成,具体取决于目标分发版的大小。如果--set-default-version 未列出,则表示你的 OS 不支持它,你需要更新到版本 1903(内部版本 18362)或更高版本。

3. 使用 WSL

3.1 启动和退出 Linux 子系统

进入 Linux 子系统有以下几种方式:
(1)和正常软件一样启动,如在开始菜单中点击其图标、双击桌面快捷方式
(2)在 Windows 中打开一个终端,如 PowerShell,输入命令wsl
(3)在终端中输入命令Linux 发行版名称.exe,如ubuntu20.04.exe

退出 Linux 子系统的方式:
(1)直接关闭终端
(2)在终端中输入命令exit,此时退出了 WSL,然后输入命令 wsl -t Ubuntu-20.04,关闭 ubuntu 子系统。

  1. 使用 wsl命令进入 Linux 子系统时,进入的目录是当前打开终端的位置,使用 PowerShell 终端时,所在位置为/mnt/c/Users/windows-login-name。使用 ubuntu2004.exe命令进入 Linux 子系统时,进入的目录是所在位置为/home/linux-login-name

  2. 常用的 wsl 命令:

# 列出所有分发的名称、运行状态、对应的 WSL 版本
wsl -l -v
# 终止指定的 Linux 分发
wsl -t <distro>
# 注销分发
wsl --unregister <distro>
# 终止所有正在运行的分发和 WSL2 轻型工具虚拟机
wsl --shutdown

3.2 文件系统

如何在 Linux 应用中使用 Windows 文件?

WSL 的优势之一是可以通过 Windows 和 Linux 应用或工具访问文件。

WSL 将计算机的固定驱动器装载到 Linux 分发版中的 /mnt/<drive> 文件夹下。 例如,你的 C: 驱动器装载在/mnt/c/

例如,使用装载的驱动器,可以使用 Visual Studio 或 VS Code 编辑 C:\dev\myproj\ 中的代码,并通过 /mnt/c/dev/myproj 访问相同的文件,在 Linux 中生成/测试该代码。

重要说明: 使用 WSL 的主要限制之一是不支持使用 Windows 应用或工具直接访问/更改 Linux 发行版文件系统中的文件。

不要使用 Windows 应用和工具更改 Linux 文件!

C:\Users\windows-login-name\AppData\Local\Packages\目录下有一个以CanonicalGroupLimited开头的文件夹,Linux 子系统相关的文件都存储在该文件夹里面。需要特别注意的是:任何情况下都不要使用 Windows 应用和工具更改该目录里面的 Linux 文件!
在这里插入图片描述
正确的做法:
将工作文件存放在 Windows 文件系统中,这样不仅能够在 Windows 中直接进行访问,还能在 Linux 中通过 /mnt/<drive>/<path> (例如 /mnt/c/dev/project/...) 进行访问,从而避免了在 Windows 和 Linux 系统中来回拷贝文件。

总之,为了避免丢失文件或污染文件数据,需要遵循下面三条准则:

  • 如果想要使用 Windows 和 Linux 工具访问、创建、修改文件,请将文件存储在Windows 文件系统中。
  • 通过 Windows 应用、工具、脚本、终端来访问、创建、修改 Linux 子系统中的文件时,请使用 \\wsl$\<DistroName>\
  • 千万不要使用寻找 AppData目录中的文件的方式,通过 Windows 应用、工具、脚本、终端来访问、创建、修改 Linux 子系统中的文件。

计算机的存储设备上存储了与每个文件、目录相关的文件元数据(例如:权限、拥有者、时间戳等),Windows 和 Linux 中文件元数据的表示方式是不同的。因此,通过 Windows 应用、工具、脚本、终端来访问、创建、修改位于AppData目录中的 Linux 子系统中的文件时,会造成数据污染或损坏 Linux 环境,导致需要卸载和重新安装 Linux 子系统。

3.3 换源

使用 Linux 子系统时,为了提高软件的安装速度,需要将软件源换成国内的镜像源。

(1)备份原来的数据源配置文件

sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup

(2)修改数据源配置文件

sudo vi /etc/apt/sources.list

这里使用中科大的源 (此处是 20.04 版本的源,对应版本名称为focal,如果是其他版本则替换为对应的版本名即可)。

# 默认注释了源码仓库,如有需要可自行取消注释
deb https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse

deb https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse

deb https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse

deb https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse

i键进入编辑模式,修改后,按 ESC 键退出编辑模式,输入:wq保存并退出。

(3)更新源,升级软件(可选):

sudo apt-get update
sudo apt-get upgrade

4. 安装图形界面

WSL 工具的目的是使用户能够视需要在 Windows 上运行 Bash 和核心 Linux 命令行工具。WSL 尚不支持 GUI 桌面或应用程序 (例如 Gnome、KDE 等) 。

对于 Linux 技术使用得还不太熟练的可以自行安装图形界面,以方便使用。

安装图形界面有多种方案可供选择,下面介绍其中使用最多的两种。

取决于使用的是 WSL1 还是 WSL2、Ubuntu 18.04 及以下版本还是 Ubuntu 20.04 版本,图形界面的安装方法有所不同。

4.1 Xfce4 + VcXsrv

安装 xfce4 桌面,然后设置 xrdp 远程连接,再使用 VcXsrv 进行显示(也可以用 VNC 软件进行显示)。

(1)安装 VcXsrv

X-Windows 显示服务器程序有多种:VcXsrv Windows X Server、Xming、Cygwin X Server。这里选择 VcXsrv,免费开源,在 SourceForget 上评价不错,下载地址为 https://sourceforge.net/projects/vcxsrv/

下载后安装,打开XLaunch,选择:“one large window”,Display number 设置成0,
在这里插入图片描述
选择【start no client】
在这里插入图片描述
勾选 【Disable access control】
在这里插入图片描述

可以点击 【save configuration】,将配置保存为文件,下次直接打开配置文件就可以了。
在这里插入图片描述
点击完成后,将会弹出一个黑色窗口,开始监听 Linux 的显示服务请求。

(2)安装 Xfce4 桌面

Xfce 是一种轻量级的桌面,基于GTK2.0,和旧版 Gnome 界面类似,可以运行在很多 Linux 发行版上,包括 Ubuntu 。

sudo apt-get install xfce4

(3)设置与启动桌面

设置显示器的地址。

sudo vim ~/.bashrc
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0
source ~/.bashrc

实际上,上面的做法等价于:
在 Windows 中打开 PowerShell,输入 ipconfig 命令,可以查看到 Windows 与 Ubuntu 虚拟机进行通信的网络地址。
在这里插入图片描述
然后,通过 export DISPLAY=192.168.104.97:0命令告诉桌面程序应该去哪里寻找在本地运行的 X 服务器。

然后启动桌面

startxfce4

此时,在 XLaunch 中就可以看到 Ubuntu 系统的 xfce4 桌面。
在这里插入图片描述

该方法适用于 WSL2 的各种 Ubuntu 版本。

4.2 Gnome + VcXsrv

给 WLS2 的 Ubuntu 20.04 系统安装 Gnome 桌面的麻烦之处在于:Ubuntu 20.04 默认安装的 gnome 版本是高于 3.34 的,gnome 从这一版本开始就完全依赖 systemd 了,而 WSL 2 默认不是以 systemd 作为初始化进程,因此无法直接运行 gnome 桌面。

(1)安装 VcXsrv

同 4.1 节。

(2)安装 Gnome 图形界面

安装 gnome 桌面:

sudo apt install ubuntu-desktop

(3)设置 systemd

WSL2 默认不是以 systemd作为初始化进程,所以无法使用systemctl,使用systemctl时会出现以下提示:

System has not been booted with systemd as init system (PID 1). Can't operate.

为了使 WSL2 支持 systemd ,有人写了一个脚本 ubuntu-wsl2-systemd-script 。从 github 上下载该脚本并运行,

git clone https://github.com/DamionGans/ubuntu-wsl2-systemd-script.git
cd ubuntu-wsl2-systemd-script/
bash ubuntu-wsl2-systemd-script.sh

然后重启 Ubuntu 系统。此时再次运行systemctl命令,发现能正常运行。

user-name:~$ systemctl 
  UNIT                                                                         >
  sys-devices-LNXSYSTM:00-LNXSYBUS:00-ACPI0004:00-VMBUS:00-fc785225\x2d9131\x2d>
  sys-devices-LNXSYSTM:00-LNXSYBUS:00-ACPI0004:00-VMBUS:00-fd1d2cbd\x2dce7c\x2d>
  sys-devices-LNXSYSTM:00-LNXSYBUS:00-ACPI0004:00-VMBUS:00-fd1d2cbd\x2dce7c\x2d>
  sys-devices-platform-serial8250-tty-ttyS0.device                             >
  sys-devices-platform-serial8250-tty-ttyS1.device                             >
  sys-devices-platform-serial8250-tty-ttyS2.device                             >
  sys-devices-platform-serial8250-tty-ttyS3.device                             >
  sys-devices-virtual-block-ram0.device                                        >
  sys-devices-virtual-block-ram1.device                                        >
  sys-devices-virtual-block-ram10.device                                       >
  sys-devices-virtual-block-ram11.device                                       >
  sys-devices-virtual-block-ram12.device                                       >
  sys-devices-virtual-block-ram13.device                                       >
  sys-devices-virtual-block-ram14.device                                       >
  sys-devices-virtual-block-ram15.device                                       >
  sys-devices-virtual-block-ram2.device                                        >
  sys-devices-virtual-block-ram3.device                                        >
  sys-devices-virtual-block-ram4.device                                        >
  sys-devices-virtual-block-ram5.device                                        >
  sys-devices-virtual-block-ram6.device                                        >
  sys-devices-virtual-block-ram7.device                                        >
  sys-devices-virtual-block-ram8.device                                        >
lines 1-23

Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置。Systemd 并不是一个命令,而是一组命令,涉及到系统管理的方方面面。systemctl是 Systemd 的主命令,用于管理系统。

(4)设置与启动桌面

输入sudo vi ~/.bashrc,在文件末尾添加:

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

保存后退出,并使用source ~/.bashrc使修改生效。

然后启动桌面,

gnome-session

此时,在 XLaunch 中就可以看到 Ubuntu 系统的 gnome 桌面。
在这里插入图片描述

  1. Ubuntu 18.04 默认安装的 gnome 版本是 3.28.1,不依赖于systemd,因此不需要设置systemd就可以运行 gnome 桌面。
  2. 对于Ubuntu 20.04,也可以选择 Cinnamon 桌面,因为 Cinnamon 是基于 gnome 的老版本改的,不依赖于 systemd 。
sudo apt install cinnamon-desktop-environment lightdm
export DISPLAY=$(grep -m 1 nameserver /etc/resolv.conf | awk '{print $2}'):0.0
cinnamon-session &

参考链接

  1. Microsoft 官方文档
  2. Win10安装Ubuntu子系统及图形化界面详细教程
  3. wsl2(win10 Linux子系统)图形界面的安装,wsl同理
  4. win10创建Ubuntu16.04子系统,安装常用软件以及图形界面(包括win10远程桌面连接Ubuntu)
  5. WSL2 Ubuntu图形界面使用指南
  6. wsl2 ubuntu Gnome 桌面
  7. WSL2中的Ubuntu上运行GNOME的问题
  8. WSL启用systemd
  9. Systemd 入门教程:命令篇
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐