今天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密码,又忘了用户密码的情况,就是我。
- 打开PowerShell,并使用以下命令进入默认WSL分发版的根目录:
wsl-u root
如果需要在非默认分发版中更新忘记的密码,使用下面命令,并将Debian替换为你安装分发版的名称。
wsl -d Debian -u root
然后你就进入了目录分发版的root用户,
- 在PowerShell内的打开WSL发行版的根目录后,可使用下面的命令更新密码:
passwd <username>
其中<username>是发行版中帐户的用户名,而你忘记了它的密码,这里也可以修改root用户的密码。
- 系统将提示你输入新的UNIX密码,然后确认该密码。
在被告知密码已成功更新后,可以使用以下命令在PowerShell内关闭WSL:exit
- 然后就可以正常使用wsl了。
参考
微软官方文档:https://learn.microsoft.com/zh-cn/training/modules/wsl-introduction/