WSL使用技巧 / 虚拟机对比

2023-10-31

前言

本文介绍了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使用技巧

略。

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 --install
 
# 安装指定发行版
wsl --install <Distribution Name>
 
# 获取发行版名称的有效列表
wsl --list --online

未安装 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 发行版列表。


列出已安装的 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 发行版中不存在该用户,则会报错。

关闭卸载

关闭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注销原始子系统。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WSL使用技巧 / 虚拟机对比 的相关文章

  • 即使 makefile 和源代码存在,为什么“Build Project”在 Eclipse Helios CDT 中显示为灰色?

    我无法构建我的项目 我在 Eclipse Helios 中创建了一个新的 CDT 项目 并告诉它使用现有的源代码和 makefile 这两者都正确显示在 Package 和 Project 视图中 然而 项目 菜单中的 构建全部 和 构建项
  • Nasm 打印到下一行

    我用 nasm Assembly 编写了以下程序 section text global start start Input variables mov edx inLen mov ecx inMsg mov ebx 1 mov eax 4
  • 在64位操作系统上以32位模式和64位模式编译ioctl函数的执行有什么不同?

    我有 64 位 Enterprise SuSE 11 我有一个应用程序 它打开 HIDRAW 设备并在其上操作 ioctl 函数以从该设备获取原始信息 如下所示 struct hidraw devinfo devinfo int fd op
  • 有关 Linux 内存类型的问题

    关于Linux内存我有以下问题 我知道活动内存是最常访问的内存部分 但是有人可以解释一下 linux 如何考虑将内存位置用于活动内存或非活动内存 主动存储器由哪些部分组成 磁盘 文件缓存是否被视为活动内存的一部分 有什么区别Buffers
  • 是否可以找到哪个用户位于 localhost TCP 连接的另一端?

    这是一个编程问题 但它是 Linux Unix 特定的 如果我从本地主机获得 TCP 连接 是否有一种简单的方法可以告诉哪个用户在 C 程序内建立了连接而无需 shell 我知道这对于 Unix 域套接字来说并不太难 我已经知道远程 IP
  • 如何删除树莓派的相机预览

    我在我的 raspberryPi 上安装了 SimpleCv 并安装了用于使用相机板的驱动程序 uv4l 驱动程序 现在我想使用它 当我在 simpleCV shell Camera 0 getImage save foo jpg 上键入时
  • jpackage linux 创建的桌面文件不足

    我刚刚开始使用 jpackage 它是一个非常棒的工具 只要迈出一步 我的肩上的工作就减轻了很多 我对看起来硬编码且无法定制的东西越感到惊讶 JPackage 自动生成启动器 lib
  • 使用 C++ 输出字符串覆盖 Linux 终端上的最后一个字符串

    假设我有一个命令行程序 有没有办法让我说的时候 std cout lt lt stuff 如果我不做std cout lt lt n 在另一个之间std cout lt lt stuff 东西的另一个输出将覆盖同一行上的最后一个东西 清理行
  • 使用netcat将unix套接字传输到tcp套接字

    我正在尝试使用以下命令将 unix 套接字公开为 tcp 套接字 nc lkv 44444 nc Uv var run docker sock 当我尝试访问时localhost 44444 containers json从浏览器中 它不会加
  • 原生 Linux 应用程序可像 ResHacker 一样编辑 Win32 PE

    我想运行自动修改 dll服务 用户提交特定的 dll 我在服务器上修改它 然后用户可以下载 dll的修改版本 是否有任何本机 Linux 应用程序提供常见的 Win32 PE 修改功能 例如图标 字符串 加速器 对话等 至少提供命令行或脚本
  • 在中断时获取 current->pid

    我正在Linux调度程序上写一些东西 我需要知道在我的中断到来之前哪个进程正在运行 当前的结构可用吗 如果我在中断处理程序中执行 current gt pid 我是否可以获得我中断的进程的 pid 你可以 current gt pid存在并
  • Windows 与 Linux 文本文件读取

    问题是 我最近从 Windows 切换到 Ubuntu 我的一些用于分析数据文件的 python 脚本给了我错误 我不确定如何正确解决 我当前仪器的数据文件输出如下 Header 有关仪器等的各种信息 Data 状态 代码 温度 字段等 0
  • 使用命令行将 MediaWiki 维基文本格式转换为 HTML

    我倾向于编写大量文档 因此 MediaWiki 格式对我来说很容易理解 而且比编写传统 HTML 节省了我很多时间 然而 我也写了一篇博客 发现一直从键盘切换到鼠标来输入正确的 HTML 标签会增加很多时间 我希望能够使用 Mediawik
  • Gradle 1.3:build.gradle 不构建类

    这里有一个新问题 我有一个 build gradle 文件apply plugin java在其中 并与 java 项目 包关联 当我跑步时gradle build从命令行我得到 compileJava UP TO DATE process
  • 如何从 Linux 的 shell 中删除所有以 ._ 开头的文件?

    确实如标题所示 我已将许多文件从 Mac 复制到 Raspberry Pi 这导致了许多以前缀开头的多余文件 我想删除以以下开头的文件夹中的每个文件 我该怎么做 尝试类似的方法 cd path to directory rm rf 或者 如
  • CentOS目录结构是树形的吗?

    CentOS 上有相当于树的东西吗 如果你的 Centos 系统上没有安装 tree 无论如何我通常建议服务器设置使用最小安装磁盘 你应该在命令行中输入以下内容 yum install tree y 如果没有安装 那是因为您没有正确的存储库
  • Linux 上的 Python 3.6 tkinter 窗口图标错误

    我正在从 Python GUI 编程手册 学习 Python GUI 某项任务要求我通过将以下代码添加到我的配方中来更改窗口图标 Change the main windows icon win iconbitmap r C Python3
  • 为 Linux 安装 R 包时出错

    我试图在 R 3 3 上安装一个名为 rgeos 的包 但是当我输入 install packages rgeos 但它返回给我以下错误 其他包也会发生同样的情况 但不是所有包 gt installing source package rg
  • 无法仅在控制台中启动 androidstudio

    你好 我的问题是下一个 我下载了Android Studio如果我去 路径 android studio bin 我执行studio sh 我收到以下错误 No JDK found Please validate either STUDIO
  • 将数组传递给函数名称冲突

    Specs GNU bash 版本 3 1 17 无法升级 Premise 我一直在摆弄数组 我想知道是否有任何方法可以让函数的本地变量与所述函数外部的数组同名 Example 在下面的示例中 我将尝试显示该问题 Working bin b

随机推荐

  • STM32超级蓝牙小车——基于STM32F103C8T6的多功能蓝牙小车(PID循迹、跟踪、有源蜂鸣器播放音乐、蓝牙遥控、AD采集+DMA转运等超多元素小车)

    一 项目时间 2023 7 24 11 26 二 实现效果 通过蓝牙控制小车运动与模式转换 模式一 循迹模式 模式二 跟踪模式 模式三 音乐模式 模式四 控制运动模式 三 使用模块 STM32F103C8T6核心板 1 L298N电机驱动模
  • cocos2d-x系列教程

    1 官网 http www cocos com 2 论坛 http www cocoachina com bbs thread php fid 48 3 官网下载 http www cocos2d x org download versio
  • 【如何注销华为云账号(解绑合作伙伴)】

    如何注销华为云账号 解绑合作伙伴 一 解绑合作伙伴 1 1 注意事项 1 2 创建工单 二 账号关闭 三 账号注销 一 解绑合作伙伴 首先进入华为云官网 https www huaweicloud com 登录账号 将鼠标拖至页面右上角 选
  • MySQL 事务

    事务特性 ACID 事务隔离中的脏读 幻读问题 隔离级别 一 事务特性 ACID 原子性 Atomicity 一个事务内多个操作语句 不可被分割 一个事务的执行结果 要么全部成功 要么全部失败 一致性 Consistency 一个事务操作之
  • CURL 宏定义列表

    列表CURL库一共有17个函数 curl close 关闭CURL会话 curl copy handle 复制一个CURL会话句柄 同时3复制其所有参数 curl errno 返回最后一个错误码 curl error 返回一个字符串 用以描
  • uboot启动之BL1阶段的分析1

    对uboot启动的BL1阶段的主体代码分析1 BL1阶段代码的分析以start s文件作为主要的目标 此篇博文主要对整个个流程进行分析 总体分析 BL1阶段的代码固化在IROM中的BL0调用执行 在上电之后会会执行 他的主要主要工作就是初始
  • 浮动元素与定位元素的关系

    div class a div div class b div 两种情况 a不浮动 在元素a不浮动的情况下 元素a并没有脱离文档流
  • VS2019-C++创建和调用DLL动态链接库(傻瓜式教程)

    转载地址 前言 查了好久好久网上的资料C 调用动态链接库 试了好多方法 直接创建DLL 空项目创建的 都多多少少有些问题 最后自己不断摸索着成功了 还是很开心的 接下来把最清晰的步骤分享给大家 C 新人 有什么说的不清楚的还请大佬们见谅 第
  • oracle 删除所有外键

    1 执行语句 select alter table table name drop constraint constraint name from user constraints where constraint type R 2 执行第
  • 跨品种套利 - 期货

    1 原理 什么是套利 套利是指在买入或卖出一种金融资产的同时卖出或买入另一种相关的金融资产从中利用价差获得套利的过程 什么是跨品种套利 当两个合约有很强的相关性时 可能存在相似的变动关系 两种合约之间的价差会维持在一定的水平上 当市场出现变
  • 【burpsuite安全练兵场-客户端14】点击劫持-5个实验(全)

    前言 介绍 博主 网络安全领域狂热爱好者 承诺在CSDN永久无偿分享文章 殊荣 CSDN网络安全领域优质创作者 2022年双十一业务安全保卫战 某厂第一名 某厂特邀数字业务安全研究员 edusrc高白帽 vulfocus 攻防世界等平台排名
  • IDEA test程序无法输入 This view is read-only 解决办法

    问题 test程序无法输入 按回车键显示如下 解决办法 在IDEA Help gt Edit Custom VM Options 中添加如下代码 然后重启IDEA即可 Deditable java test console true
  • 5-7 12-24小时制

    编写一个程序 要求用户输入24小时制的时间 然后显示12小时制的时间 输入格式 输入在一行中给出带有中间的 符号 半角的冒号 的24小时制的时间 如12 34表示12点34分 当小时或分钟数小于10时 均没有前导的零 如5 6表示5点零6分
  • python输入10个数求偶数奇数之和_从键盘上输入十个整数,并求出这十个数所有奇数之和及偶数之和。C++编程,要求有do while,w...

    展开全部 include int main int i int num int jishu oushu do while i 0 jishu oushu 0 do scanf d num if num 2 0 oushu num else
  • mysql grouping sets_mysql – PostgreSQL:如何使用GROUPING SETS,CUBE...

    我有以下在MySQL 5 6中编写的代码块 INSERT INTO Totals SELECT Zone State COUNT Sponsored COUNT Enrolled COUNT PickedUp FROM MasterData
  • HTTP头的Expires与Cache-control

    HTTP头的Expires与Cache control HTTP头的Expires与Cache control 1 概念 Cache control用于控制HTTP缓存 在HTTP 1 0中可能部分没实现 仅仅实现了Pragma no ca
  • 零基础学SQL(1):初识数据库与SQL

    零基础学SQL 1 初识数据库与SQL 一 初识数据库 数据库是将大量数据保存起来 通过计算机加工而成的可以 进行高效访问的数据集合 该数据集合称为数据库 Database DB 用来管理数据库的计算机系统称为数据库管理系统 Databas
  • ionic3+angular4 HttpClient封装优化

    背景 众所周知 angular4以后引入的HTTPClient为前端http请求带来了非常大的改进 它支持了与java类似的拦截器机制 通过拦截器 可以方便的对请求进行前置 后置及异常处理 但如果我们需要在不同的项目中使用这个拦截器 且有不
  • pt-online-schema-change添加索引没有反应

    之前使用 pt online schema change添加索引没有问题 如下语句 root ixxxxxx pt online schema change no version check execute alter foreign ke
  • WSL使用技巧 / 虚拟机对比

    WSL使用技巧 虚拟机对比 前言 虚拟机比较 VMware使用技巧 WSL使用技巧 官方文档 工具 安装WSL 基本命令 运行命令 关闭卸载 磁盘管理 导入导出 指定安装路径 前言 本文介绍了VMware和WSL的区别 并详细介绍了WSL的