适用于 Linux 的 Windows 子系统 (WSL)
本文发布于526天前,本文最后更新于521 天前,其中的信息可能已经过时,如有错误请留言或评论。

今天ubunt虚拟机莫名其妙崩了,整了半天也没搞好,好像是图形界面G了,因为磁盘空间不足,但是在VM上面给它新加了磁盘,然后在命令行给它分配,但是整了半天没整好,就有点烦,也不知道我的ubuntu虚拟机也没干啥,咋磁盘就满了。

然后朋友推荐说不如wsl,然后就在Windows上搞了一下,感觉比虚拟机方便多了,然后我就把ubuntu虚拟机给删了。这个wsl是有ip的,所以创建之后也可以用finalshell或者xshell连接。

什么是 WSL?

使用 WSL,可以在 Windows 上安装和运行 Linux 发行版。 这可能会有点令人困惑,因为 Linux 和 Windows 一样,也是一种操作系统 (OS),也就是说,你基本上要运行两个相互集成的操作系统。

双启动和虚拟机

过去,要在一台计算机上同时运行 Windows 和 Linux,需要单独安装这两个操作系统,并使用启动管理器选择在启动期间使用哪个操作系统来运行计算机。 这存在一些问题,例如每次要在系统之间切换时,都需要重启计算机。

使用虚拟机 (VM),可以解决双启动两个不同的操作系统的难题。 VM 使你能够在运行 Windows 的计算机上运行 Linux 的虚拟化实例。 但是使用 VM 时通常性能较低,因为需要大量的资源来运行虚拟实例,并且两个操作系统之间缺乏集成,你仍在运行孤立的单独操作系统。

WSL 解决了这些问题,它集成了 Windows 和 Linux,使用的资源占用量要少得多,与传统的虚拟机相比,所需的资源(CPU、内存、存储)更少。 以令人难以置信的快速高效的性能,在 Linux 开发环境旁边运行你喜爱的 Windows Office 应用、开发工具、游戏等。

使用 WSL 在 Windows 上安装和设置 Linux

注意:必须确保运行的是 Windows 11 或 Windows 10 版本 2004+(内部版本 19041 及更高版本),才能运行 WSL install 命令。

WSL install 命令

通过在管理员 PowerShell 或 Windows 命令提示符中输入 wsl --install,然后重启计算机,你可以安装运行 WSL 所需的全部内容。

wsl --install 命令执行以下操作:

  • 启用虚拟机平台可选组件并安装 WSL 核心二进制文件。
  • 从 Microsoft Store 下载 WSL 包(包括最新的 Linux 内核),以便在更新和安全修补程序可用时推送它们。
  • 下载并安装 Linux 的 Ubuntu 发行版(除非使用一个命令选项来选择不同的发行版)。

安装其他 Linux 发行版

默认情况下,wsl --install 命令将安装 Linux 的 Ubuntu 发行版。 可以从 Microsoft Store 中提供的列表中选择其他 Linux 发行版。 还可以与默认的 Ubuntu 一起安装其他 Linux 发行版。

若要查看当前通过应用商店提供了哪些发行版,请输入命令:

wsl --list --online

若要选择用其他版本替换默认的 Ubuntu 发行版,或者要从应用商店安装其他发行版,请使用命令:

wsl --install --distribution <Distribution Name>

如果你要安装的 Linux 发行版没有在 Microsoft Store 中提供,你仍然可以通过使用 .tar 文件或 .appx 文件导入来安装它。我这个没用到,就没学。

设置 Linux 用户名和密码

使用 WSL 安装了 Linux 发行版并重启计算机后,发行版将打开,系统会要求你输入新的 UNIX 用户名以及密码。

这里要注意几个问题:

  • 此处创建的用户名和密码将被视为 Linux 管理员,能够运行 sudo(superuser do)管理命令。
  • 每个用户帐户都特定于安装的每个单独的 Linux 发行版,与 Windows 用户名无关。 如果安装多个 Linux 发行版,每个发行版将具有自己的单独的 Linux 用户帐户和密码。 当你每次添加发行版、重新安装或重置时,都必须配置新的用户名和密码。
  • 用户名和密码几乎接受任何有效内容,但有些字符可能会在各种上下文中带来问题。 下划线之类的标点符号一般没有问题,但句点、斜杠或冒号(例如 /:.)可能会导致麻烦。 绝对不应使用 - 连字符/减号字符作为你的用户名的开头。 我们建议去掉不常见的标点。 此外还应注意,当你输入密码时,屏幕上不会显示任何内容(这是正常的,称为“盲打”)。
  • 如果需要更改或重置密码,或者忘记了已安装的 Linux 发行版的密码(这个我就踩雷了,之前貌似安装过,而且配置了密码,但是今天用的时候忘了,就只能重新设置了一下。方法可以看后面解决问题的重置密码)

输入用户名和密码后,可以使用 cat /etc/os-release 命令确认已安装的 Linux 发行版和版本号。

更新和升级包

建议你经常更新和升级你已安装的每个 Linux 发行版包含的程序包。 定期更新可确保你拥有最新的安全更新。 Windows 不会自动更新或升级 Linux 发行版本。 大多数 Linux 用户往往倾向于自行控制此任务。 每个发行版都有关联的包管理器来处理此任务。 对于 Ubuntu 或 Debian,包含的包管理器称为高级包工具 (APT)。

若要使用 apt 更新和升级默认 Ubuntu 发行版的包,请执行以下操作:

打开 Ubuntu(安装后,可以在 Windows 搜索菜单中找到它)。输入命令:

sudo apt update && sudo apt upgrade

更新和升级包需要提升的权限,因此你还需要输入你为此 Linux 安装创建的密码。
update 命令会更新可用包及其版本的列表,但不安装或升级任何包。 upgrade 命令会安装已安装包的较新版本。 建议先运行更新(或与上面的组合命令同时运行),以便包管理器知道已安装软件的可用更新。

到这就安装好了,就有了一个Linux系统,并且可以在终端随时切换powershell和shell,很方便。

解决问题

报错

WSL参考的对象类型不支持尝试的操作。 Error code: Wsl/Service/0x8007273d

直接看这个文章解决的:https://blog.csdn.net/fjh1997/article/details/130462427,里面他提到的方法很多,我用的是下面这种,因为我觉得这种最省事,也最简单。

使用powershell脚本添加注册表项

使用管理员身份运行powershell执行下列脚本,输出success即可。

#Requires -RunAsAdministrator
# Fix for https://github.com/microsoft/WSL/issues/4177

$MethodDefinition = @'
[DllImport("ws2_32.dll", CharSet = CharSet.Unicode)]
public static extern int WSCSetApplicationCategory([MarshalAs(UnmanagedType.LPWStr)] string Path, uint PathLength, [MarshalAs(UnmanagedType.LPWStr)] string Extra, uint ExtraLength, uint PermittedLspCategories, out uint pPrevPermLspCat, out int lpErrno);
'@
$UserProfilePath = $env:USERPROFILE

$Ws2Spi = Add-Type -MemberDefinition $MethodDefinition -Name 'Ws2Spi' -PassThru

$WslLocation = Get-AppxPackage MicrosoftCorporationII.WindowsSubsystemForLinux | Select-Object -expand InstallLocation

$Executables = ("wsl.exe", "wslservice.exe","wslg.exe","wslhost.exe");
$Location = ($WslLocation,"C:\Program Files\WSL","C:\Windows\System32","${UserProfilePath}\AppData\Local\Microsoft\WindowsApps");
foreach ($Location in $Location){
    foreach ($Exe in $Executables) {
        $ExePath = "${Location}\${Exe}";
        $ExePathLength = $ExePath.Length;

        $PrevCat = $null;
        $ErrNo = $null;
        if ($Ws2Spi::WSCSetApplicationCategory($ExePath, $ExePathLength, $null, 0, [uint32]"0x80000000", <sup class="reference tippy-initialized" id="ref_1_1" data-content="" tabindex="0" aria-expanded="false"><a class="reference-link" href="#ref_1">[1]</a></sup> $PrevCat, <sup class="reference tippy-initialized" id="ref_1_2" data-content="" tabindex="0" aria-expanded="false"><a class="reference-link" href="#ref_1">[1]</a></sup> $ErrNo) -eq 0) {
            Write-Output "Added $ExePath!";
        }
    }
}
Write-Output "success";

修复完成之后需要进行重启,如果不想重新启动,可以使用下面的命令杀掉所有 wsl相关东西。

taskkill -IM "wslservice.exe" /F

然后就可以正常使用了。

重置密码

修改Linux用户密码

若要更改或重置密码,请打开Linux发行版并输入命令:passwd。系统会要求你输入当前密码,然后要求输入新密码,之后再确认新密码。就可以修改当前用户的密码。

修改Linux分发版的密码

这个就是又忘了root密码,又忘了用户密码的情况,就是我。

  1. 打开PowerShell,并使用以下命令进入默认WSL分发版的根目录:
    wsl-u root

    如果需要在非默认分发版中更新忘记的密码,使用下面命令,并将Debian替换为你安装分发版的名称。

    wsl -d Debian -u root

    然后你就进入了目录分发版的root用户,

  2. 在PowerShell内的打开WSL发行版的根目录后,可使用下面的命令更新密码:
    passwd <username>

    其中<username>是发行版中帐户的用户名,而你忘记了它的密码,这里也可以修改root用户的密码。

  3. 系统将提示你输入新的UNIX密码,然后确认该密码。
    在被告知密码已成功更新后,可以使用以下命令在PowerShell内关闭WSL:

    exit
  4. 然后就可以正常使用wsl了。

参考

微软官方文档:https://learn.microsoft.com/zh-cn/training/modules/wsl-introduction/

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇