WSL使用技巧 / 虚拟机对比

本文对比了VMware和WSL的特点,指出VMware灵活有图形界面,WSL 1用Windows内核模拟,WSL 2基于Hyper - V。还给出VMware使用技巧,如管理员权限等。同时详细介绍WSL使用技巧,涵盖安装、命令、磁盘管理等方面。

前言

本文介绍了VMware和WSL的区别,并详细介绍了WSL的使用方法和技巧。

虚拟机比较

VMware
比较灵活,拥有图形化界面,另外也可以访问USB设备,大部分VM软件的图形界面性能比Hyper-V好。

WSL 1
WSL 1用的是Windows内核模拟的各种系统接口。虽然可以运行大部分Linux应用,但还是有不少依赖于内核的应用是无法正常运行的——例如Docker。另外WSL 1和Windows共用文件系统、网络,有些时候会比较头疼。

WSL 2
WSL 2/Docker本质上都是Hyper-V。WSL 2是一个轻量级的Hyper-V VM;Docker for Windows如果要跑Linux镜像,会安装运行一台运行Linux的Hyper-V虚拟机。

总结
若不嫌安装软件和配置操作系统麻烦,则可以使用VMware;
若只想熟悉Linux命令,不使用Docker,可以使用WSL 1;
若想使用Docker,且不想安装VMware,可以使用WSL 2。
WSL占用内存很高,且无法自动回收,需要使用wsl --shutdown命令彻底关闭WSL才能释放内存。

VMware使用技巧

管理员权限
以管理员权限运行软件,右键VM快捷方式,在兼容性页面勾选以管理员身份运行
解决问题:Win11上VM默认运行在小核上导致速度很慢。
以管理员权限运行的VM默认运行在大核上。

隐藏托盘图标
若不想在托盘显示虚拟机状态,可隐藏托盘图标。
编辑 - 首选项 - 工作区,显示托盘图标,选择从不

设置工作区
编辑 - 首选项 - 工作区,可选择虚拟机的默认位置。

CPU设置
CPU数量尽量与物理机一致,一般设置为1个。
核心数不超过物理机上限,可自行设置,数量越多性能越好,一般设置4-16个。

内存设置
可根据需求设置,推荐设置4096M,即4G。

CD设置
选择使用物理驱动器 - 自动检测

网络设置
勾选启动时连接,选择NAT模式

高级设置
勾选禁用内存页面修整
勾选禁用侧通道缓解

WSL使用技巧

官方文档

文档目录:https://learn.microsoft.com/zh-cn/windows/wsl/
安装步骤:https://learn.microsoft.com/zh-cn/windows/wsl/install
基本命令:https://learn.microsoft.com/zh-cn/windows/wsl/basic-commands

工具

Windows Terminal
在Microsoft Store中安装Windows Terminal,如下图:
在这里插入图片描述

此终端软件可以打开多个选项卡,对Windows支持较好。可以使用此终端的PowerShell运行以下WSL命令。

安装WSL

# 获取发行版有效名称的列表
wsl --list --online

# 安装默认发行版
wsl --install
 
# 安装指定发行版
wsl --install [Distribution Name]
# or
wsl --install -d/--distribution [Distribution Name]

# 仅安装WSL,不安装发行版
wsl --install --no-distribution

# 示例:安装Ubuntu 20.04版本的WLS
wsl --install Ubuntu-20.04
# or
wsl --install -d Ubuntu-20.04

未安装 WSL 时,选项包括:
--inbox:使用 Windows 组件(而不是 Microsoft Store)安装 WSL。 (WSL 更新将通过 Windows 更新接收,而不是通过 Microsoft Store 中推送的可用更新来接收)。
--enable-wsl1:在安装 Microsoft Store 版本的 WSL 的过程中也启用“适用于 Linux 的 Windows 子系统”可选组件,从而启用 WSL 1。
--no-distribution:安装 WSL 时不安装发行版。

安装后选项包括:
--distribution:指定要安装的 Linux 发行版。 可以通过运行 wsl --list --online 来查找可用的发行版。
--no-launch:安装 Linux 发行版,但不自动启动它。
--web-download:通过联机渠道安装,而不是使用 Microsoft Store 安装。

基本命令

列出可用的 Linux 发行版

wsl --list --online
# or
wsl -l -o

可通过在线商店获得的 Linux 发行版列表,输出结果如下:

以下是可安装的有效分发的列表。
使用 'wsl.exe --install <Distro>' 安装。
NAME                                   FRIENDLY NAME
Ubuntu                                 Ubuntu
Debian                                 Debian GNU/Linux
kali-linux                             Kali Linux Rolling
Ubuntu-18.04                           Ubuntu 18.04 LTS
Ubuntu-20.04                           Ubuntu 20.04 LTS
Ubuntu-22.04                           Ubuntu 22.04 LTS
OracleLinux_7_9                        Oracle Linux 7.9
OracleLinux_8_7                        Oracle Linux 8.7
OracleLinux_9_1                        Oracle Linux 9.1
openSUSE-Leap-15.5                     openSUSE Leap 15.5
SUSE-Linux-Enterprise-Server-15-SP4    SUSE Linux Enterprise Server 15 SP4
SUSE-Linux-Enterprise-15-SP5           SUSE Linux Enterprise 15 SP5
openSUSE-Tumbleweed                    openSUSE Tumbleweed

其中,左侧的 NAME 即为发行版名称 [Distribution Name]


列出已安装的 Linux 发行版

wsl --list --verbose
# or
wsl -l -v

查看安装在 Windows 计算机上的 Linux 发行版列表,其中包括状态(发行版是正在运行还是已停止)和运行发行版的 WSL 版本(WSL 1 或 WSL 2)。可与 list 命令一起使用的其他选项包括:--all(列出所有发行版)、--running(仅列出当前正在运行的发行版)或 --quiet(仅显示发行版名称)。


将 WSL 版本设置为 1 或 2

wsl --set-version <distribution name> <versionNumber>

若要指定运行 Linux 发行版的 WSL 版本(1 或 2),请将 替换为发行版的名称,并将 替换为 1 或 2。WSL 2 仅在 Windows 11 或 Windows 10 版本 1903、内部版本 18362 或更高版本中可用。


设置默认 WSL 版本

wsl --set-default-version <Version>

若要将默认版本设置为 WSL 1 或 WSL 2,请将 替换为数字 1 或 2,表示对于安装新的 Linux 发行版,你希望默认使用哪个版本的 WSL。 例如,wsl --set-default-version 2。 WSL 2 仅在 Windows 11 或 Windows 10 版本 1903、内部版本 18362 或更高版本中可用。


设置默认 Linux 发行版

wsl --set-default <Distribution Name>
# or
wsl -s <Distribution Name>

若要设置 WSL 命令将用于运行的默认 Linux 发行版,请将 替换为你首选的 Linux 发行版的名称。


更新 WSL

wsl --update

将 WSL 版本更新到最新版本。 选项包括:
--web-download:从 GitHub 而不是 Microsoft Store 下载最新更新。


检查 WSL 状态

wsl --status

查看有关 WSL 配置的常规信息,例如默认发行版类型、默认发行版和内核版本。


查看 WSL 版本

wsl --version

检查有关 WSL 及其组件的版本信息。


Help 命令

wsl --help

查看 WSL 中可用的选项和命令列表。

运行退出

运行默认的Linux发行版

# 启动默认Linux发行版,并进入当前目录,即wsl的mnt文件夹
wsl
 
# 启动默认Linux发行版,并进入用户主目录
wsl ~
 
# 在wsl中进入用户主目录
cd ~

运行指定的Linux发行版

运行指定的Linux发行版,并以指定用户登录
wsl --distribution <Distribution Name> --user <User Name>
# 简写
wsl -d <Distribution Name> -u <User Name>
 
# 进入Linux发行版后,若不知道当前用户名,可使用以下命令输出当前用户名
whoami

其中, 为 Linux 发行版的名称, 为用户名称。 若 Linux 发行版中不存在该用户,则会报错。


退出Linux发行版

exit

终端会提示 logout

关闭卸载

关闭WSL,关闭所有发行版,清空内存

wsl --shutdown

立即终止所有正在运行的发行版和 WSL 2 轻量级实用工具虚拟机。 在需要重启 WSL 2 虚拟机环境的情形下,例如更改内存使用限制或更改 .wslconfig 文件,可能必须使用此命令。


关闭指定发行版

wsl --terminate <Distribution Name>
# or
wsl -t <Distribution Name>

若要终止指定的发行版或阻止其运行,请将 替换为目标发行版的名称。


注销并卸载 WSL 发行版

wsl --unregister <DistributionName>

如果将 替换为目标 Linux 发行版的名称,则将从 WSL卸载该发行版,与该发行版关联的所有数据、设置和软件将永久丢失。 从 Store 重新安装会安装发行版的干净副本。

例如:wsl --unregister Ubuntu 将从可用于 WSL 的发行版中删除 Ubuntu。 运行 wsl --list 将会显示它不再列出。

还可以像卸载任何其他应用商店应用程序一样卸载 Windows 计算机上的 Linux 发行版应用。 若要重新安装,请在 Microsoft Store 中找到该发行版,然后选择“启动”。

磁盘管理

装载磁盘或设备

wsl --mount <DiskPath>

通过将 替换为物理磁盘所在的目录\文件路径,在所有 WSL2 发行版中附加和装载该磁盘。 请参阅在 WSL 2 中装载 Linux 磁盘。 选项包括:

--vhd:指定 引用虚拟硬盘。
--name:使用装入点的自定义名称装载磁盘
--bare:将磁盘附加到 WSL2,但不进行装载。
--type <Filesystem>:装载磁盘时使用的文件系统类型默认为 ext4(如果未指定)。 此命令也可输入为:wsl --mount -t <Filesystem>。可以使用 blkid <BlockDevice> 命令检测文件系统类型,例如:blkid <dev/sdb1>
--partition <Partition Number>:要装载的分区的索引号默认为整个磁盘(如果未指定)。
--options <MountOptions>:装载磁盘时,可以包括一些特定于文件系统的选项。 例如,wsl --mount -o "data-ordered"wsl --mount -o "data=writeback" 之类的 ext4 装载选项。 但是,目前仅支持特定于文件系统的选项。 不支持通用选项,例如 ro、rw 或 noatime。


卸载磁盘

wsl --unmount <DiskPath>

卸载磁盘路径中给定的磁盘,如果未提供磁盘路径,则此命令将卸载并分离所有已装载的磁盘。

导入导出

导入和导出发行版:

# 导入
wsl --import <Distribution Name> <InstallLocation> <FileName>
# 导出
wsl --export <Distribution Name> <FileName>

将指定 tar 文件导入和导出为新的发行版。 在标准输入中,文件名可以是 -。 选项包括:

--vhd:指定导入/导出发行版应为 .vhdx 文件,而不是 tar 文件
--version:(仅导入)指定将发行版导入为 WSL 1 还是 WSL 2 发行版

指定安装路径

可通过导出再导入的方式指定WSL的安装路径,步骤如下:

查看运行子系统:通过wsl -l --running查看正在运行的子系统
终止运行:若有正在运行的子系统,则通过wsl -t <DistributionName>来终止其运行
备份系统:利用wsl --export <DistributionName> <FileName>来备份子系统,结果会得到一个tar归档文件。
假设有名为Ubuntu-20.04的子系统, 想要将结果文件保存为Ubuntu2004.tar
(同时指定其路径即为D:\wsl\Ubuntu2004.tar),则调用的命令为
wsl --export Ubuntu-20.04 D:\wsl\Ubuntu2004.tar
恢复系统:然后利用wsl --import <DistributionName> <InstallLocation> <FileName>来恢复子系统。
例如wsl --import Ubuntu D:\wsl\Ubuntu2004\ D:\wsl\Ubuntu2004.tar(将新恢复的子系统命名为Ubuntu)
修改默认登录用户:Ubuntu config --default-user <UserName>,若使用Ubuntu 20.04,则将Ubuntu替换为ubuntu2004。
注销原系统(可选):使用wsl --unregister Ubuntu-20.04注销原始子系统。

<think>嗯,用户想了解在Ubuntu虚拟机中编译C++程序在Visual Studio 2022中编译的区别。这个问题很专业,涉及到开发环境选择的核心考量。 用户可能是个C++开发者,正在为项目选择开发环境。从问题表述看,ta应该有一定开发经验,但可能刚接触跨平台开发。用户特别提到"Ubuntu虚拟机"这个具体场景,说明ta可能正在考虑本地虚拟机开发方案。 我需要从几个维度对比: 首先是编译工具链差异。Ubuntu虚拟机里用的是原生GCC工具链,包括g++编译器、GDB调试器、Makefile构建系统等。而VS2022在Windows上主要用MSVC编译器,虽然现在也支持Clang。这里有个关键点:即使VS2022配置了WSL或远程Linux编译,底层仍是GCC。 其次是开发体验。VS2022的图形化界面确实强大,特别是IntelliSense代码补全可视化调试器。但虚拟机里通常用VSCode或命令行,更接近生产环境。用户如果做Linux开发,在虚拟机里编译能更早发现平台相关问题。 性能方面也值得提。虚拟机会有资源开销,特别是内存分配。而VS2022直接调用本地编译器速度更快。但如果是远程编译场景,网络延迟可能成为新瓶颈。 配置复杂度差异明显。虚拟机需要完整搭建开发环境,包括安装GCC、配置共享文件夹等。VS2022通过"Linux开发工作负载"可以一键配置远程编译,但首次设置可能遇到证书问题。 调试能力对比很有意思。VS2022的图形化调试器对新手友好,支持内存视图、多线程调试等高级功能。虚拟机里用GDB更灵活,但需要命令行技巧。如果用户做内核开发,虚拟机显然更合适。 最后是目标平台匹配度。如果最终部署环境是Linux,在Ubuntu虚拟机里编译能保证ABI兼容性。VS2022虽然支持生成Linux二进制,但涉及库版本时可能仍有差异。 用户可能没意识到的是:这两种方式可以结合使用。比如在VS2022里写代码,通过WSL调用虚拟机里的GCC编译,这样既能用IDE优势,又能保证编译环境纯净。这个方案在引用[3][4]里都有提到。 考虑到用户技术背景,回复里可以适当深入,比如提到ABI兼容性这种专业概念。但要用具体例子说明,比如std::string在不同编译器实现差异导致的内存问题。 对了,安全问题也值得提。虚拟机有完整隔离,适合处理敏感代码。而VS2022远程连接需要开放端口,可能带来风险。不过引用[4]提到的Docker方案能缓解这点。</think>以下是Ubuntu虚拟机编译C++程序与Visual Studio 2022编译的核心区别对比: --- ### **1. 编译工具链** - **Ubuntu虚拟机** 使用原生GCC/G++工具链(如 `g++ -o main main.cpp`),完全遵循Linux环境标准。需手动安装构建工具: ```bash sudo apt update && sudo apt install build-essential gdb ``` - **VS 2022** 默认使用MSVC编译器(Windows原生),但通过**Linux开发工作负载**可配置两种模式: - **远程编译**:代码在Ubuntu虚拟机/物理机中编译(实际调用G++)[^3][^4] - **本地编译**:使用MSVC生成Windows二进制文件 --- ### **2. 开发体验** | **维度** | **Ubuntu虚拟机** | **VS 2022** | |------------------|--------------------------------|--------------------------------| | **编辑器** | Vim/VSCode/命令行 | 图形化IDE(智能补全、重构工具) | | **调试器** | GDB命令行 | 可视化调试器(断点/内存监视) | | **项目管理** | 手动编写Makefile/CMake | 自动生成解决方案文件(.sln) | | **头文件管理** | 手动配置路径 | 自动同步远程Linux头文件[^3] | --- ### **3. 平台兼容性** - **Ubuntu虚拟机** 编译产物为**原生Linux二进制文件**,与生产环境一致,避免ABI兼容性问题(如GLIBC版本)。 - **VS 2022本地编译** 生成Windows可执行文件(.exe),若需Linux版本需交叉编译(复杂且易出错)。 --- ### **4. 性能与资源占用** | **场景** | Ubuntu虚拟机 | VS 2022 | |------------------|----------------------------|----------------------------| | **编译速度** | 依赖虚拟机资源分配 | 本地SSD加速更快 | | **资源隔离** | 完整Linux内核,隔离性好 | 共享主机资源 | | **多平台开发** | 需重启切换系统 | 可同时开发Windows/Linux项目 | --- ### **5. 典型工作流对比** **在Ubuntu虚拟机中开发** ```mermaid graph LR A[编写代码] --> B[终端执行 g++ 编译] B --> C[运行 ./a.out] C --> D[GDB调试] ``` **在VS 2022中远程开发** ```mermaid graph LR E[VS中编辑代码] --> F[点击“生成”] F --> G[代码同步到Linux] G --> H[远程调用G++编译] H --> I[二进制回传调试] ``` --- ### **6. 选择建议** - **优先选Ubuntu虚拟机**: - 需严格匹配Linux生产环境(如内核模块开发) - 避免Windows路径/换行符等差异导致问题 - **优先选VS 2022**: - 需要高效调试图形界面或复杂项目 - 团队已使用Windows开发基础设施 - 混合开发(部分组件为Windows专属) > 💡 **混合方案**:通过VS 2022的 **WSL2集成** 或 **远程Linux开发** 功能,可直接在Windows下编辑代码,后台调用Ubuntu中的G++编译[^3][^4],兼顾开发效率环境一致性。 --- ### **相关问题** 1. 如何配置VS 2022实现远程Linux编译? 2. 在Ubuntu虚拟机中调试C++程序有哪些高效工具? 3. 跨平台C++项目如何统一Windows/Linux的编译流程? 4. WSL2与虚拟机方案在C++开发中的性能差异有多大?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NSJim

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值