基于WSL2打造Linux环境
提示
它来了!它来了!它带着WSL 2走来了!
期待已久的WSL 2终于随着2004版本的登场正式发布了,本文将简要记录安装WSL 2和配置Docker进行开发的过程。
# 前置条件
- 确保Windows 10版本已更新至v2004 (20H1 / Build 19041)
- 启用虚拟机平台(开启子系统功能)
- 下载最新版Docker
# 启用并配置WSL 2
# Windows版本要求
WSL 2
仅在Windwos 10 19041或更高版本中可用,我们可以在cmd
中键入ver
来检查当前Windwos
的版本。
# 启用虚拟机平台可选组件
在 PowerShell
中以管理员身份运行下面命令:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
2
运行完成之后,请重启电脑完成安装。
# 更新 WSL 2 Linux 内核
下载适用于 x64 计算机的最新 WSL2 Linux 内核 (opens new window)的更新包。
# 设置WSL发行版
如果想要将默认的WSL发行版设置成 WSL 2,在 PowervShell
中使用下面命令:
wsl --set-default-version 2
如果想要设置某一个发行版为WSL2,在 PowerShell 中使用下面命令,将 <Distro>
换成你想要设置的发行版即可,例如 Ubuntu-18.04
wsl --set-version <Distro> 2
验证使用的WSL版本
wsl -l -v
# 下载安装 Ubuntu
在 Windows应用商店
里搜索 Ubuntu
,然后下载,下载完成之后打开 Ubuntu
,这时会先进行一些初始化安装的设置,然后就会让你设置新的 UNIX用户名和密码,设置完成之后,就进入了 linux 子系统。验证是否是 WSL 2 我们只需要在 powerShell 下输入 wsl -l -v
,输出内容如下,这里 VERSION
为2代表启用了WSL 2
NAME STATE VERSION
* Ubuntu-18.04 Running 2
2
# Ubuntu更换国内源
首先备份一下默认的源
sudo cp /etc/apt/sources.list /etc/apt/sourses.list.bak
更换默认源为阿里源,使用 sudo vim /etc/apt/sources.list
命令编辑,删除原来的内容,添加下面的阿里源信息:
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted
deb http://mirrors.aliyun.com/ubuntu/ focal universe
deb http://mirrors.aliyun.com/ubuntu/ focal-updates universe
deb http://mirrors.aliyun.com/ubuntu/ focal multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted
deb http://mirrors.aliyun.com/ubuntu/ focal-security universe
deb http://mirrors.aliyun.com/ubuntu/ focal-security multiverse
2
3
4
5
6
7
8
9
10
注意
请注意你的Ubuntu版本。
更换源之后,使用下面的命令更新一下
sudo apt-get update
sudo apt-get upgrade
2
# 内存占用异常
解决方法:在C:\Users\用户名
下创建一个名为.wslconfig
的配置文件
[wsl2]
memory=3GB # Limits VM memory in WSL 2 to 3 GB
swap=0
localhostForwarding=true
2
3
4
# 安装并配置Docker环境
从Docker官网下载最新桌面版 (opens new window)
# 修改 Docker daemon 配置
在系统右下角托盘图标内右键菜单选择 Settings
,打开配置窗口后左侧导航菜单选择 Docker Daemon
。编辑窗口内的JSON
串,填写加速器地址,如下所示。编辑完成,点击 Apply 保存按钮,等待Docker重启并应用配置的镜像加速器。
{
"registry-mirrors" : [
"https://mirror.ccs.tencentyun.com",
"http://registry.docker-cn.com",
"http://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com"
],
"insecure-registries" : [
"registry.docker-cn.com",
"docker.mirrors.ustc.edu.cn"
],
"debug" : true,
"experimental" : true
}
2
3
4
5
6
7
8
9
10
11
12
13
14
# 拉取镜像、运行容器
镜像:Causal Discovery Toolbox (opens new window)
拉取:
docker pull divkal/cdt-py3.6
运行:
docker run -d -i -t divkal/cdt-py3.6 /bin/bash
# 设置通过VSCode远程连接Docker
- 在VSCode的settings.json中添加
"docker.host": "tcp://localhost:23750"
注意
若需要通过VSCode连接本地Docker,将其注释掉即可。
- 在
cmd
中通过SSH保持远程连接
ssh -NL localhost:23750:/var/run/docker.sock user@hostname
注意
将user
和hostname
替换成自己的服务器信息。
# VSCode无法连接Remote SSH
当VSCode无法连接SSH到Remote时,可以尝试:
pgrep -f "vscode" | xargs kill
# 常见问题
# 1. 文件系统权限问题
这只是让文件在 WSL 中的权限看起来正常(目录 755
,文件 644
),实际并不会作用到 Windows 文件系统下的文件本身。
在 /etc/wsl.conf
中添加以下配置:
[automount]
enabled = true
root = /mnt/
options = "metadata,umask=22,fmask=111"
mountFsTab = true
2
3
4
5
由于 enabled
、root
、mountFsTab
均为默认值,可以对其进行精简:
[automount]
options = "metadata,umask=22,fmask=111"
2
上面的方法对所有盘符都有效,如果你想在 WSL 中调用 Windows 下的应用程序(比如 explorer.exe
. 调用资源管理器打开当前路径)就需要对 C 盘进行单独设置,否则会提示没有权限。首先确认 wsl.conf
中的 mountFsTab
设置为 true
,然后编辑 /etc/fstab
,添加如下内容:
C:\ /mnt/c drvfs rw,noatime,uid=1000,gid=1000,metadata,umask=22,fmask=11 0 0
此时以为所有问题都解决了,但用 mkdir
命令新建一个目录,会发现新建的目录权限依然是 777
。
目前民间解决方案是在.profile
、.bashrc
、.zshrc
或者其他 shell 配置文件中添加如下命令,重新设置 umask
# Fixing Bad Default Permissions
if [ "$(umask)" = "000" ]; then
umask 022
fi
2
3
4
未来官方解决方案 (opens new window)是在 /etc/wsl.conf
添加以下配置:
[filesystem]
umask = 022
2
在未来某个版本的系统更新后生效,与上面的方案理论上不会冲突,所以添加无副作用。