WSL初探
1 简介
WSL( Windows Subsystem for Linux )是微软开发的兼容层,允许在 Windows 10 及更高版本上运行原生Linux二进制文件(如 Ubuntu 、 Debian 等发行版),无需传统虚拟机或双系统。
核心功能
原生兼容:直接运行Linux命令行工具(如Bash),无需修改或额外安装X服务器。
性能优化:WSL 2 支持窗口化运行Linux桌面应用,并优化内存管理。
开发便捷:适用于Linux的Windows子系统可简化跨平台开发环境配置。
1.1 WSL1与WSL2
WSL1与WSL2的核心区别如下:
内核与系统调用支持
WSL1:基于动态翻译层,将Linux系统调用转换为Windows NT调用,没有真正的Linux内核。因此不支持需要完整系统调用兼容性的应用(如Docker),且部分系统功能(如systemd)不可用。
WSL2:运行在Hyper-V虚拟机中,包含完整的Linux内核(如Ubuntu内核),支持完整的系统调用兼容性(如systemd、Docker等),性能更接近原生Linux环境。
性能表现
文件系统集成:WSL2在跨操作系统文件操作时性能显著提升,而WSL1可能存在延迟和性能瓶颈(例如读写NTFS文件系统的额外开销)。
资源占用:两者启动时间和资源占用相近(WSL2因虚拟化技术可能略高),但WSL2在处理大规模文件操作时更优。
适用场景
WSL1:适合仅需轻量级命令行工具或无需完整Linux内核功能的场景(如脚本开发)。
WSL2:推荐用于容器化应用(如Docker)、图形界面应用或需要完整Linux生态支持的复杂开发环境。
注意事项:WSL2仅支持Windows 10版本1903版本18362或更高版本中可用(通过选择 Windows 徽标键 + R 来检查 Windows 版本,键入 winver,选择“确定”),WSL1支持范围更广但功能受限。对于低于 14393 的版本,WSL 根本不支持。下表列出了两种版本的主要特性对比。

在Windows 10上如果默认版本是WSL1,可以手动下载更新包对其升级,如下图所示:

升级完成后可通过“wsl --set-default-version 2”命令,将wsl2设置为默认版本,更详细内容请查阅Windows学习文档。
1.2 常见命令
wsl --help:显示帮助信息。
wsl --list:列出当前安装的虚拟机,如果在命令后面增加--verbose选项,还可以显示安装虚拟机wsl版本信息。
wsl --list --online:列出可用的Linux分发版。

wsl --install:安装WSL和Linux的默认Ubuntu分发版,还可以使用此命令通过运行wsl --install <Distribution Name>来安装其他 Linux 分发版(如果在 Windows 10 或更早版本上运行 WSL,则可能需要将-d标志包含在命令中--install以指定分发版: wsl --install -d <distribution name>)。
wsl --set-version:后面跟参数<Distribution Name> <Version Number>,表示设置相应Linux 发行版安装的WSL版本。
wsl --set-default:后面跟参数<Distribution Name>来设置默认版本。
wsl --update:更新wsl。
wsl --status:检查wsl状态。
wsl --export:后面跟参数<Distribution Name> <FileName>将指定分发的快照导出为新的分发文件, 默认为tar格式。
wsl --import:后面跟参数<Distribution Name> <InstallLocation> <FileName>将指定的tar文件导入为新的分发版。
wsl --unregister:后面跟参数<DistributionName>注销或卸载Linux分发版。
wsl --mount:后面跟参数<DiskPath>装载磁盘或设备。
wsl --unmount:后面跟参数<DiskPath>卸载磁盘。
wsl hostname -I:返回通过 WSL 2 安装的 Linux 分发版的 IP 地址(WSL 2 VM 地址)。
ip route show | grep -i default | awk '{ print $3}':返回从WSL 2(WSL 2 VM)中看到的Windows计算机的IP地址(该命令在虚拟机中运行)。
2 安装Linux发行版本
2.1 启用Hyper-V及相关项
打开【控制面板】→【程序】→【启用或关闭 Windows 功能】。
勾选Hyper-V、虚拟机平台、适用于 Linux 的 Windows 子系统。
点击确定后,重启计算机。

Hyper-V 预安装在 Windows 11专业版、企业版和教育版中,只需启用即可。但是,在其他版本(如 Windows 11 家庭版)中,缺少启用 Hyper-V 的选项,下面介绍一种方法可以在 Windows 11 家庭版上安装和启用 Hyper-V。
复制以下代码存为hyper-v.bat:
pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL
右键该文件以管理员运行该程序,并且按照提示输入Y,重启电脑,这个时候,就会发现有了Hyper-V。
2.2 安装Linux发行版
2.2.1 命令行安装
运行“wsl --install”即可安装默认版本,如下图所示:

没用使用最新的版本,又使用“wsl --install Ubuntu-22.04”命令安装早期版本Ubuntu22。
2.2.2 离线安装
1 前往https://aka.ms/wslubuntu2204,下载Ubuntu2204-221101.AppxBundle,将下载的文件保存到本地路径,如C:\wsl。
2 以管理员权限打开PowerShell,cd到C:\wsl目录,直接运行“Add-AppxPackage .\Ubuntu2204-221101.AppxBundle”进行安装。
2.2.3 安装路径
Ubuntu 默认安装的位置是:C:\Users\<你的用户名>\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonXXX_<随机字符串>\

LocalState\ext4.vhdx是Ubuntu根文件系统的虚拟磁盘。
LocalState\目录下还包含元数据等配置。
你无法从Windows 文件系统中直接编辑Ubuntu的Linux 路径(如 /home/),但是可以通过在资源管理器打开\\wsl$路径来访问Linux文件系统:

2.2.4 更改安装位置
默认的wsl --install命令不会让你选择目录,需要使用导出+导入的方法来自定义安装路径。
首先,使用如下命令导出安装实例镜像
wsl --export Ubuntu D:\WSL\ubuntu_backup.tar
其次,注销原来的 Ubuntu(可选,如果你想完全搬家并删除原始安装,会永久删除原来的实例,包括你安装的软件、数据等,导出后请确保备份)。
wsl --unregister Ubuntu
之后,导入到新目录(你指定的位置)
wsl --import Ubuntu_Custom D:\WSL\UbuntuCustom D:\WSL\ubuntu_backup.tar --version 2
最后,你可以用如下方式运行你的自定义实例:
wsl -d Ubuntu_Custom
也可以设置默认 WSL:
wsl --set-default Ubuntu_Custom
3 使用windows上的cuda
windows上版本cuda驱动要安装好,在当前笔记本中显卡为NVIDIA GeForce RTX 4060 Laptop GPU,其他详细信息如下所示:

需在在wsl下Ubuntu中安装相版本的cuda-tookit,安装步骤如下:
wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.8.0/local_installers/cuda-repo-wsl-ubuntu-12-8-local_12.8.0-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-12-8-local_12.8.0-1_amd64.deb
sudo cp /var/cuda-repo-wsl-ubuntu-12-8-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-8
需要说明的是由于Nvidia可能会调整具体包的子版本号,导致以上部分链接可能失效,这时要在https://developer.nvidia.com/cuda-toolkit-archive页面自行选择适合自己的版本:

再打开相应的链接,并一步步根据自己的实际情况,产生相应的安装脚本:

根据脚本内容,在wsl Ubuntu下完成安装,之后再在~/.bashrc最后添加加环境变量配置:
export CUDA_HOME="/usr/local/cuda-12.8"
export PATH="/usr/local/cuda-12.8/bin:$PATH"
通过source命令使环境变量生效,然后即可查看nvcc版本信息。

进行完这一步后,网上有些文章说就可以直接nvidia-smi查看windows下的显卡信息了,其实根本不行,最起码nvidia-smi这个文件根本找不到。强大的chatgpt给出原因:

并且它还给出解决方案,执行以下命令(在 Ubuntu 中):
步骤 1:添加 NVIDIA WSL 包源
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) # 会得到 ubuntu22.04
curl -s -L https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | sed 's#deb #deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit.gpg] #' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list > /dev/null
步骤 2:更新并安装驱动组件
sudo apt update
sudo apt install -y nvidia-driver-535 nvidia-utils-535 libnvidia-container-tools libnvidia-container1
上面版本号(如 535)要与你 Windows 中的驱动版本一致或兼容(你当前是 572,可以试安装 nvidia-utils-525 或 535)。
以上步骤执行完以后,才可以在wsl Ubuntu下正常使用nvidia-smi命令,显示信息和windows下一致:

参考:
https://learn.microsoft.com/zh-cn/windows/wsl/basic-commands
WSL初探的更多相关文章
- 初探领域驱动设计(2)Repository在DDD中的应用
概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...
- CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探
CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...
- 从273二手车的M站点初探js模块化编程
前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...
- JavaScript学习(一) —— 环境搭建与JavaScript初探
1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...
- .NET文件并发与RabbitMQ(初探RabbitMQ)
本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址:http://www.cnblogs.com/tdws/p/5860668.html 想必MQ这两个字母对于各位前辈们和老司 ...
- React Native初探
前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. P ...
- 【手把手教你全文检索】Apache Lucene初探
PS: 苦学一周全文检索,由原来的搜索小白,到初次涉猎,感觉每门技术都博大精深,其中精髓亦是不可一日而语.那小博猪就简单介绍一下这一周的学习历程,仅供各位程序猿们参考,这其中不涉及任何私密话题,因此也 ...
- Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用
一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...
- NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器 ...
- Unity3D游戏开发初探—1.跨平台的游戏引擎让.NET程序员新生
一.Unity3D平台简介 Unity是由Unity Technologies开发的一个让轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的 ...
随机推荐
- K8s容器运行时,移除Dockershim后存在哪些疑惑?
K8s容器运行时,移除Dockershim后存在哪些疑惑? 大家好,我是秋意零. K8s版本截止目前(24/09)已经发布到了1.31.x版本.早在K8s版本从1.24.x起(22/05),默认的容器 ...
- where 闭包查询
$map1[] = ["like_article.user_id", 'not in', function ($query) use ($user_id) { $query-> ...
- 【经验】日常|WakeUp、Outlook、Google日历导入飞书日历
以飞书团队账号登录时,设置的日历就能被团队其他成员看到(可选择私密.仅忙碌[默认].完全公开三种模式),以便相互查看空闲时间. Wakeup日历导出到Outlook日历 Wakeup支持从各大学校便利 ...
- 鸿蒙NEXT开发教程:浅谈@ComponentV2装饰器
听说今天的广州车展上有一部分人已经看到华为汽车的最后一"界",尊界超豪华大轿车,应该很快就要正式亮相,可以期待一波. 在api12之后,鸿蒙系统推出一个V2版本的状态管理装饰器,不 ...
- EBC Rev.5中的中间品、消费品,资本品,HS2012,HS2017与EBC Rev.5对照表,各种贸易标准对照表....
最近在做一个国际供应链问题研究,用到了中间品这个概念,在各大论坛逛了好久居然没有找到一个说清楚了的,某些论坛需要什么点数才能下载,论坛用户更是自视甚高,一副这也不懂的姿态审视所有刚入门这个领域的新人, ...
- Flex布局-子项
弹性盒子是一种用于 按行 或 按列的一维布局方法. 元素可以膨胀以填充额外的空间, 也可以 收缩 以适应更小的空间. flex 容器项重点 只是用表格进行排版而已, 横向内容无关联哈, 只是简要回忆一 ...
- 将 Excel 拼接为 SQL 脚本
好像半年前,我就有写过将 Excel 数据, 逐条 或 批量 插入 mysql 数据库, 那时候正在建库嘛, 想着弄个脚本来批量刷新和处理. 工具当时用的 pandas, 这个, 强的一批的工具, 无 ...
- Ubuntu20.04 搭建Kubernetes 1.28版本集群
环境依赖 以下操作,无特殊说明,所有节点都需要执行 安装 ssh 服务 安装 openssh-server sudo apt-get install openssh-server 修改配置文件 vim ...
- 基于CARLA/ROS的多传感器融合感知系统实战教程(附完整代码)
引言:为什么需要多传感器融合? 在自动驾驶系统中,单一传感器存在固有缺陷: 摄像头:易受光照影响,缺乏深度信息: 激光雷达(LiDAR):成本高,纹理信息缺失: 毫米波雷达:分辨率低,角度精度差. 本 ...
- TVM中的Compute操作
定义 TVM从Halide继承了计算与调度分离的思想,并在其内部重用了部分Halide的调度原语,也引入了一些新的调度原语,用于优化GPU和专用加速器性能. 先举个例子吧: import tvm fr ...