什么是WSL?
Windows Subsystem for Linux,适用于 Linux 的 Windows 子系统可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具、实用工具和应用程序 - 且不会产生虚拟机开销。什么是WSL2?
WSL 2 是 WSL 中体系结构的新版本,它更改 Linux 发行版与 Windows 交互的方式。
WSL 2 的主要目标是提高文件系统性能并增加系统调用的完全兼容性。
每个 Linux 发行版都可以作为 WSL 1 或 WSL 2 发行版运行,并可随时进行切换。
WSL 2 是底层体系结构的主要功能,它使用虚拟化技术和 Linux 内核来实现其新功能。
具体步骤是:
在程序与功能中,开启 linux子系统 和 虚拟机平台,无需开启hyperV。 参考Windows 10安装WSL 2
到windows应用商店中下载并安装ubuntu 20.04 LTS。
更新WSL内核组件为WSL2,并将ubuntu切换到WSL2模式。参考WSL2更新内核组件, wsl1与wsl2切换
wsl --set-version Ubuntu 2
安装window terminal,方便同时打开多个控制台窗口。
迁移C盘的ubuntu系统到D盘中,并在D盘中运行ubuntu2004,注意卸载掉原来的ubuntu20.04LTS(点击左下角windows图标,找到ubuntu20.04卸载即可)。参考 【WSL2】迁移Windows虚拟子系统(Ubuntu) , win10 wsl2修改默认安装目录到其他盘
注意先进入迁移文件夹下,再使用ubuntu2004 config --default-user USERNAME
安装ubuntu系统到到迁移文件夹
运行如下命令查看迁移盘的ubuntu子系统,并切换到WSL2模式
wsl -l -v
NAME STATE VERSION
* Ubuntu Running 1
wsl --set-version Ubuntu 2
windows控制台切换到ubuntu控制台
wsl ~ -d Ubuntu
Note:
如果切换到WSL2后,ubuntu启动不起来,报4294967295 (0xffffffff)错误,参考https://github.com/microsoft/WSL/issues/5092,即使用如下命令(如果还不能解决,就切换到WSL1吧)
netsh winsock reset
测试一下网络能否ping通,但是报错了
ping: www.baidu.com: Temporary failure in name resolution
解决方法参考https://github.com/microsoft/WSL/issues/5256,如果解决不了就切换到WSL1吧,等到需要用到GPU资源,再切换到WSL2吧
Note:
使用WSL有以下两点建议:
- WSL ubuntu20.04版本和原生的ubuntu20.04版本是不同的,所以在使用时难免会出现在同样操作下,WSL ubuntu20.04和原生ubuntu20.04出错信息不同的问题。建议不要在WSL ubuntu子系统中直接安装anaconda,后面可能会出现pip无法使用的问题。
- 建议先在Windows中安装docker desktop,再安装anaconda,即建议使用WSL + docker解决方案,不要直接在WSL中直接安装anaconda
安装anaconda:清华anaconda镜像
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2021.11-Linux-x86_64.sh
进入指定文件夹后,
bash Anaconda3-2021.11-Linux-x86_64.sh
配置conda文件路径
echo 'export PATH="/home/wangxiaoxi/anaconda3/bin"' >> ~/.bashrc
source ~/.bashrc
#上面命令可能会把WSL文件弄坏,导致ls,cd基本命令无法使用,使用如下命令修复
export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin
查看conda是否配置成功
conda -V
存在问题1:WSL ubuntu中无法使用pip
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPSConnection object at 0x7f6e6eea04c0>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/numpy/
解决方法参考https://github.com/microsoft/WSL/issues/4020,https://github.com/MicrosoftDocs/windows-uwp/issues/2679,发现还是无法解决。
Note:
安装Docker Desktop,利用docker安装anaconda镜像(镜像中包含ubuntu文件系统,建议不要在anaconda中创建虚拟环境,直接在base下安装,之后在将anaconda运行时容器打包成镜像时,pycharm才能识别镜像中的base环境,此方案建议使用)
使用如下命令在WSL ubuntu中安装docker时,提示先安装Docker Desktop
Docker Desktop安装步骤参考:Docker Desktop for Windows 安装步骤(这里需要开启HyperV)
Docker Desktop默认安装在C盘,如果要更改安装路径,可参考: docker desktop 更改安装目录,这里就不修改了。
Docker Desktop安装成功后,先将ubuntu切换到WSL2:
NAME STATE VERSION
* Ubuntu Stopped 2
docker-desktop Running 2
docker-desktop-data Running 2
接着设置Docker Desktop,将docker集成到ubuntu中,这时ubuntu就可以直接使用docker命令了,无需安装sudo apt install docker
。
参考 Docker Desktop更改镜像存储位置
Note:
Docker Desktop修改镜像存储位置的方法 和 ubuntu修改存储位置相同,都要使用wsl命令。
Docker Desktop 通过WSL2启动,会自动创建2个子系统,分别对应2个 vhdx 硬盘映像文件:
NAME STATE VERSION
* Ubuntu Stopped 2
docker-desktop Running 2
docker-desktop-data Running 2
在Docker Desktop图标上,右键选择[Quit Docker Desktop],退出Docker。
命令行执行 wsl --list -v
查看状态STATE,是否已停止Stopped。
命令行执行 wsl --shutdown
,关闭WSL。
从 wsl 把镜像 \data\ext4.vhdx 导出到压缩文件 docker-desktop-data.tar,导出路径应提前创建好,否则导出到不存在的路径会报错。命令行执行:
wsl --export docker-desktop-data D:\programSoftware\docker\docker_desktop_data\docker-desktop-data.tar
同理,导出把程序 \distro\ext4.vhdx 导出到压缩文件 docker-desktop.tar,命令行执行
wsl --export docker-desktop D:\programSoftware\docker\docker_desktop\docker-desktop.tar
命令行执行 wsl --unregister docker-desktop-data
,注销原来的 Docker 镜像。同理,执行 wsl --unregister docker-desktop
。
从tar文件,将导出的 Docker 镜像再导入回wsl,并设置挂载目录,命令行导入格式:
wsl --import <Distribution Name> <InstallLocation> <FileName>
如:
wsl --import docker-desktop-data D:\programSoftware\docker\wsl\data\ D:\programSoftware\docker\docker_desktop_data\docker-desktop-data.tar
wsl --import docker-desktop D:\programSoftware\docker\wsl\distro\ D:\programSoftware\docker\docker_desktop\docker-desktop.tar
将docker-desktop-data,docker-desktop设置为WSL2
wsl --set-version docker-desktop 2
wsl --set-version docker-desktop-data 2
重启windows系统,重新启动 Docker Desktop 完成。
{
"debug": true,
"experimental": false,
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com"
]
}
在完成好WSL和Docker Desktop安装之后,基于深度学习的anaconda环境配置步骤如下:
实例化anaconda容器
docker run -it --name="anaconda" -p 8888:8888 continuumio/anaconda3 /bin/bash
如果退出了,可以重启anaconda容器
#重启
docker start anaconda
docker exec -it anaconda /bin/bash
在base环境下配置wenet环境(不要创建虚拟环境,方便之后打包成镜像,供pycharm使用)
将WSL中的wenet项目拷贝到docker容器中(假设在WSL的/home/usr
下有wenet项目)
docker cp /home/usr/wenet/requirements.txt 9cf7b3c196f3:/home/ #9cf7b3c196f3为anaconda容器id
进入anaconda容器内,在/home/
使用pip安装所有包(conda源修改参考 ubuntu更换conda源 )
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
conda install pytorch=1.10.0 torchvision torchaudio=0.10.0 cudatoolkit=11.1 -c pytorch -c conda-forge