WSL环境配置
序言及需求
序言/动机
实验室最近采购了四台每台包含一张4090显卡的主机。本想采购服务器,但公共机房的总功率饱和了,只能将显卡连同主机一起放在工位了。然而,没有了公共的服务器,我还是既想用Windows系统作为主机玩转office三件套和其他一些仅Windows有的软件又想用ubuntu写写shell,训训网络。这样只能频繁地开关机切换系统,以及拷贝数据。听闻师兄尝试了WSL(Windows Subsystem for Linux),可以在Windows系统上兼顾Ubuntu,自由地深度学习,于是也迫不及待得尝试了WSL。得益于微软的发展,如今的WSL已经非常方便与集成,不再是当年那个吴下阿蒙了。其实一行:
wsl --install
就已经可以满足大半的诉求了,只不过其中还有些细节配置和原理,本文整理总结了一下。
特此声明,我不是知识的生产者,而是知识的搬运工。
需求
- WSL能检测到显卡(训网络)
- WSL能科学上网(最好是,一些代码数据就不用拷贝了)
- WSL能与主机交换数据(一些大数据集还是得物理复制上去)
- WSL能被其它电脑ssh到(在宿舍用笔记本也能赶ddl)
从WSL官方文档开始
英文版文档:https://learn.microsoft.com/en-us/windows/wsl/
中文版文档:https://learn.microsoft.com/zh-cn/windows/wsl/
先进行Install和Tutorials的部分:
第一步:
wsl --install
重启生效,默认安装的是WSL2,ubuntu是22.04(目前最新稳定版)
进入cmd-打开Ubuntu
若发生报错 WslRegisterDistribution failed with error: 0x8004032d
需要进入windows控制面板-启动或关闭Windows功能,勾选适用于Linux的Windows子系统:
重启生效。
再次进入就可以添加ubuntu的用户名和密码了
(localhost报错可以暂时不管,如果主机没有科学上网就没事)
若提示 wsl: 检测到 localhost 代理配置,但未镜像到 WSL。NAT 模式下的 WSL 不支持 localhost 代理
背景:每次连接的时候会多次出现,甚至程序运行的时候也会有乱码。另外也许解决该问题可以让wsl也能科学上网。
参考CSDN: https://blog.csdn.net/weixin_62355896/article/details/134458330
关键问题是无法在【C:/User/%你的用户名】下找到.wslconfig 文件。
查阅官方文档https://learn.microsoft.com/zh-cn/windows/wsl/wsl-config发现:
• 默认情况下,.wslconfig 文件不存在。 它必须创建并存储在%UserProfile%
目录中才能应用这些配置设置。
因此,直接在【C:/User/%你的用户名】下创建一个.wslconfig文件,以记事本打开,如参考CSDN教程中添加配置。
[experimental]
autoMemoryReclaim=gradual
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=true
然后,打开命令行提示符执行
wsl --shutdown
再重新启动wsl即可。
测试WSL也能科学上网
貌似ping某个网站能不能ping通和能不能科学上网是不充分不必要条件。
不妨下个anaconda,顺便测试一下能连网。
git clone一下或者wget一个数据集,确实能科学上网。
主机VScode访问WSL
甚至没看教程,主机打开vscode,左下角connect手误点错了connect to WSL,直接就连上了
太方便啦!
看一下WSL装在了哪里,如何占用磁盘空间
参考教程: https://www.jianshu.com/p/22eb4e2e702f
在文件资源管理器直接输入\wsl$
对应映像文件路径
C:\Users\你的用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx
内部的文件结构可以在文件资源管理器-Linux-Ubuntu下看到
将windows系统文件拷贝到WSL
背景:跨系统读取文件严重影响性能,直接将数据集放到WSL,但不知道如何直接快速的传给WSL。
如文档所述:https://learn.microsoft.com/zh-cn/windows/wsl/setup/environment
原本C盘的位置在WSL中变为/mnt/c
参考CSDN教程:https://blog.csdn.net/hx2024/article/details/132610015
cp /mnt/c/Users/1/Desktop/datapath.csv /home/zht/
拷贝数据直接通过以上命令即可,亲测连接的硬盘在mnt检测不到,有教程专门解决硬盘直接传输WSL的问题,通过在/mnt下挂载移动硬盘较轻松的解决:
参考CSDN教程:https://blog.csdn.net/u010087338/article/details/134573411
虽然看起来可能每次插入和移除都需要挂载一下。
问题:WSL的ip和windows一致吗?其它电脑可以直接ssh到主机的WSL上吗?
WSL的ip和windows的ip一致吗?
从定义来看,WSL还属于一种特殊的虚拟机,与主机的网络状态应该是共享的:
安装 Linux 发行版时,WSL 2 是默认发行版类型。 WSL 2 使用虚拟化技术在轻量级实用工具虚拟机 (VM) 中运行 Linux 内核。 Linux 发行版作为独立的容器在 WSL 2 托管 VM 内运行。 通过 WSL 2 运行的 Linux 发行版将共享同一网络命名空间、设备树(而非 /dev/pts
)、CPU/内核/内存/交换空间、/init
二进制文件,但有自己的 PID 命名空间、装载命名空间、用户命名空间、Cgroup 命名空间和 init
进程。
所以理论上一致,有设置端口的教程,让其它电脑可以ssh到WSL上。
其它电脑可以直接ssh到主机的WSL上吗?
最终还是通过windows自带的远程桌面软件连主机+直接vscode的直连WSL进行操作。
以下绕过远程桌面直接ssh 主机WSL的方式。
有一些关于设置ssh端口转发的教程:https://blog.csdn.net/Jinzhe_01/article/details/131885500
从原理上讲非常合理,且能从一定程度保证windows系统的数据安全。但实践上讲,设置端口和ip对一些新手不太友好,也比较复杂。
以下教程比较简单直接。但亲测无法使用。
https://blog.csdn.net/xiaohan2909/article/details/135286357
该教程序言部分说明的非常清楚:
ssh的原理是直接ssh到windows,但把默认的Powershell替换成WSL的Bash,和直接ssh到某个linux服务器就一致了。
但在另一台笔记本上ssh 用户名@ip时,失败了 报错:系统无法访问此文件 Connection to xxx closed