WSL(Windows Subsystem for Linux)的安装与排错
这里写目录标题
- WSL(Windows Subsystem for Linux)的安装与排错
- 一、WSL简介
- 二、WSL的安装步骤
- 三、WSL的排错步骤
- 四 安装时出现403错误(网络禁用)
- (一)配置基础运行环境
- (二)Windows11家庭版默认没有Hyper-V选项。这时在桌面上新建一个文本文档,复制以下命令粘贴进去
- 1. `pushd "%~dp0"`
- 2. `dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt`
- 3. `for /f %%i in ('findstr /i.hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"`
- 4. `del hyper-v.txt`
- 5. `dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL`
- (三)选择启用或关闭
- (四)安装wsl
- 五 wsl查找版本时候,出现一个ubuntu正在分发中
- 五 wsl查找版本时候,出现一个909错误
一、WSL简介
WSL是一个在Windows 10及以上版本中运行的兼容层,它允许用户在Windows系统上原生运行Linux二进制可执行文件(如ELF格式)。这为开发人员提供了一个方便的环境,可以在同一台机器上同时利用Windows和Linux系统的优势,无需使用虚拟机或双系统。
二、WSL的安装步骤
(一)系统要求
• Windows 10版本1607或更高版本(推荐使用较新的版本以获得更好的兼容性和性能)。
(二)启用WSL功能
- 通过控制面板
• 打开“控制面板”,选择“程序”。
• 在“程序”页面中,点击“启用或关闭Windows功能”。
• 在弹出的“Windows功能”对话框中,找到“适用于Linux的Windows子系统”,勾选该选项。
• 点击“确定”,系统会提示需要重启计算机,重启后WSL功能将被启用。 - 通过PowerShell(管理员权限)
• 以管理员身份打开PowerShell。
• 运行以下命令:Enable - WindowsOptionalFeature - Online - FeatureName Microsoft - Windows - Subsystem - Linux - NoRestart
• 执行完上述命令后,再运行Restart - Computer
命令重启计算机。
(三)安装Linux发行版
-
从Microsoft Store安装
• 打开Microsoft Store。
• 在搜索栏中输入“Linux”,会出现多个可安装的Linux发行版,如Ubuntu、Debian、Kali Linux等。
• 选择想要安装的发行版(以Ubuntu为例),然后点击“获取”按钮。
• 等待下载和安装过程完成。安装完成后,会提示设置用户名和密码,按照提示操作即可。 -
通过命令行安装(可选方法)
• 以管理员身份打开PowerShell。
• 首先,需要更新WSL包索引,运行命令:wsl --update
• 然后,可以指定安装特定的Linux发行版及其版本。例如,要安装Ubuntu 20.04 LTS,可以运行命令:wsl --install -d Ubuntu -2004
(四)安装成功截图
启动WSL
三、WSL的排错步骤
(一)安装失败 - 功能未启用相关
- 检查Windows功能是否真正启用
• 如果按照上述步骤通过控制面板或PowerShell启用WSL功能后,在安装Linux发行版时仍然提示相关错误,可能是功能未完全启用。
• 再次检查“适用于Linux的Windows子系统”是否在“Windows功能”对话框中被勾选。如果没有,重新勾选并重启计算机。
• 可以通过在PowerShell中运行Get - WindowsOptionalFeature - Online - FeatureName Microsoft - Windows - Subsystem - Linux
命令来查看WSL功能的当前状态。如果“State”显示为“Disabled”,则表示功能未启用,需要重新启用。 - 检查系统更新
• 旧版本的Windows可能存在一些与WSL不兼容的问题。确保Windows系统已经安装了最新的更新。
• 打开“设置”,选择“更新和安全”,点击“检查更新”,安装所有可用的更新后,再尝试安装WSL。
(二)安装失败 - 网络相关
- Microsoft Store下载问题
• 如果从Microsoft Store安装Linux发行版时出现下载失败的情况,可能是网络问题或者Microsoft Store本身的问题。
• 首先,检查网络连接是否正常。可以尝试打开网页或者使用其他网络应用程序进行测试。
• 如果网络正常,可以尝试清除Microsoft Store的缓存。以管理员身份打开PowerShell,运行命令:Get - AppxPackage - AllUsers Microsoft.WindowsStore | Foreach {Add - AppxPackage - DisableDevelopmentMode - Register “$($_.InstallLocation)\AppXManifest.xml”}
• 清除缓存后,重新尝试从Microsoft Store安装Linux发行版。 - 代理设置影响
• 如果计算机处于代理环境下,可能会影响WSL相关组件(如Microsoft Store或WSL本身的更新包)的下载。
• 如果使用系统级代理,可以在“设置” - “网络和Internet” - “代理”中查看代理设置。尝试暂时关闭代理(如果允许),然后重新进行WSL的安装操作。
• 如果是通过命令行安装,并且需要通过代理访问外部资源,可以设置代理环境变量。例如,在PowerShell中设置HTTP和HTTPS代理:$env:http_proxy = "http://proxy - address:port"
和$env:https_proxy = "http://proxy - address:port"
(将“proxy - address:port”替换为实际的代理地址和端口)。
(三)安装Linux发行版后无法启动或运行问题
-
检查WSL版本兼容性
• WSL有两个版本:WSL 1和WSL 2。某些较旧的Linux发行版可能在WSL 2上存在兼容性问题。
• 可以通过在PowerShell中运行wsl --list --verbose
命令查看已安装的Linux发行版及其使用的WSL版本。
• 如果怀疑是WSL 2的兼容性问题,可以将发行版转换为WSL 1。对于名为“Ubuntu”的发行版,可以运行命令:wsl --set - version Ubuntu 1
(将“Ubuntu”替换为实际的发行版名称)。 -
检查文件系统错误
• 在Linux发行版内部,文件系统错误可能导致无法正常启动或运行。
• 进入Linux发行版的命令行界面(通过在开始菜单中找到对应的发行版并点击打开)。
• 对于基于Debian或Ubuntu的系统,可以尝试运行sudo fsck -f /dev/sdX
(其中/dev/sdX
是需要检查的分区,通常是根分区,可能需要根据实际情况调整)。注意,在运行fsck
之前,最好先备份重要数据。
• 如果是在WSL 2环境下,还可以尝试重新创建虚拟硬盘。首先,在PowerShell中停止相关的WSL发行版:wsl --shutdown
,然后找到对应的虚拟硬盘文件(通常位于%LOCALAPPDATA%\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\ext4.vhdx
,这里的路径根据不同的发行版会有所不同),将其重命名或移动到其他位置,再重新启动WSL发行版,系统会自动重新创建虚拟硬盘。 -
检查环境变量和配置文件
• 某些环境变量设置不正确或者配置文件损坏可能导致Linux发行版无法正常运行。
• 在Linux发行版中,检查~/.bashrc
、~/.profile
等配置文件是否存在语法错误。可以使用命令如bash -n ~/.bashrc
来检查~/.bashrc
文件的语法。
• 如果在安装过程中自定义了一些环境变量,确保其设置正确。例如,如果设置了JAVA_HOME
等环境变量,检查其指向的路径是否存在并且正确。 -
查看日志文件
• WSL会生成一些日志文件,这些日志文件可以帮助诊断问题。
• 在Windows系统中,可以查看%LOCALAPPDATA%\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\
(同样,路径根据发行版不同而不同)目录下的日志文件,如wsl.log
等。
• 在Linux发行版内部,也可以查看系统日志,如/var/log/syslog
(对于基于Debian或Ubuntu的系统)或者/var/log/messages
(对于其他一些Linux发行版),查找与启动或运行相关的错误信息。
(四)性能问题
- WSL 2性能优化
• 如果使用WSL 2并且遇到性能问题,可以尝试调整虚拟硬盘的大小和存储位置。
• 虚拟硬盘默认大小可能不足以满足某些工作负载的需求。可以通过编辑注册表来调整虚拟硬盘的大小限制。打开注册表编辑器(regedit
),找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LxssManager\Parameters
键,在右侧窗口中找到DefaultAllocationSize
和DefaultDiskSize
键值(如果没有则可以新建DWORD值),适当增大其数值(例如,将DefaultDiskSize
设置为100GB或更大,具体根据磁盘空间和使用需求而定)。
• 将虚拟硬盘文件存储在快速的存储设备上,如固态硬盘(SSD)。如果计算机有多个磁盘,可以将虚拟硬盘文件从默认位置移动到SSD磁盘的合适位置。在移动之前,需要先停止WSL发行版(wsl --shutdown
),移动文件后再重新启动发行版。 - 资源占用问题
• 检查Windows系统资源是否被其他程序过度占用,导致WSL性能下降。
• 打开任务管理器(Ctrl + Shift+ Esc
),查看CPU、内存和磁盘的使用情况。如果发现有其他程序占用大量资源,可以尝试关闭不必要的程序或者调整其资源使用优先级。
• 在Linux发行版内部,也可以检查进程的资源占用情况。例如,使用top
命令查看CPU和内存占用率较高的进程,根据需要终止一些不必要的进程以提高整体性能。
四 安装时出现403错误(网络禁用)
Windows11家庭版下载wsl出现[已禁止403]错误,笔者试了管理员权限似乎不太好用
原因主要有两个,一是没有虚拟平台,二是需要访问国外服务器。
(一)配置基础运行环境
先设置windows自动更新,点击启动,这个就在计算机管理、服务里面
(二)Windows11家庭版默认没有Hyper-V选项。这时在桌面上新建一个文本文档,复制以下命令粘贴进去
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
这段代码是一个Windows批处理脚本,用于安装Hyper-V(Hyper-Virtualization,超虚拟化)角色。下面为你详细解释每一行代码的作用:
1. pushd "%~dp0"
• 功能:
◦ pushd
是一个批处理命令,用于将当前目录压入堆栈,并切换到指定的目录。在这里,%~dp0
是一个特殊的批处理变量扩展,表示当前批处理脚本所在的目录路径(包括驱动器号和路径,但不包括文件名)。所以这行代码的作用是切换到当前批处理脚本所在的目录。
2. dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
• 功能:
◦ dir
是用于列出目录内容的命令。/b
参数表示以简洁模式(bare format)输出,即只显示文件名,不显示其他额外信息(如文件大小、修改日期等)。
◦ %SystemRoot%
是一个系统环境变量,通常指向Windows操作系统的安装目录(如 C:\Windows
)。
◦ 这行命令的目的是在 %SystemRoot%\servicing\Packages
目录下查找所有文件名包含 “Hyper-V” 的 .mum
文件(.mum
文件是Windows更新的安装包元数据文件),并将找到的文件名以简洁模式输出到当前目录下的 hyper-v.txt
文件中。
3. for /f %%i in ('findstr /i.hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
• 功能:
◦ for /f
是用于处理文本字符串或文件内容的循环命令。%%i
是在批处理脚本中定义的循环变量(在命令行直接执行时使用单个 %
,如 %i
)。
◦ findstr
是一个在文件中查找字符串的命令。/i
参数表示忽略大小写,.
表示查找任意字符(这里可能是为了确保能匹配到所有行),hyper-v.txt
是要查找的文件。所以 findstr /i.hyper-v.txt
的作用是在 hyper-v.txt
文件中的每一行查找任意字符(实际上就是读取文件的每一行)。
◦ 2>nul
是将错误输出重定向到空设备(即不显示错误信息)。如果 findstr
命令执行过程中出现错误(例如文件不存在等情况),错误信息将不会显示在屏幕上。
◦ 对于 findstr
找到的每一行(即每个包含 “Hyper-V” 的 .mum
文件名),执行 dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
命令。
▪ dism
(Deployment Image Servicing and Management)是Windows系统用于管理部署映像的工具。
▪ /online
参数表示对正在运行的Windows操作系统进行操作(而不是对离线的映像文件)。
▪ /norestart
表示执行完操作后不自动重启计算机。
▪ /add-package
表示添加指定的包,这里指定的包就是 %SystemRoot%\servicing\Packages
目录下由前面找到的 .mum
文件对应的包。
4. del hyper-v.txt
• 功能:
◦ 删除之前创建的 hyper-v.txt
文件,因为这个文件已经完成了它的使命(用于存储 .mum
文件名以便后续处理)。
5. dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL
• 功能:
◦ 再次使用 dism
工具,/online
表示对正在运行的Windows操作系统进行操作。
◦ /enable-feature
表示启用指定的功能。
◦ /featurename:Microsoft-Hyper-V-All
明确指定要启用的功能是 “Microsoft-Hyper-V-All”,这是Hyper-V相关的所有功能的总称。
◦ /LimitAccess
参数表示限制访问,即不从Windows Update获取更新或依赖项,只使用本地已有的资源。
◦ /ALL
参数表示启用该功能及其所有父功能和子功能(如果有的话)。
总体而言,这段批处理脚本的目的是在Windows系统中安装Hyper-V角色。它首先查找相关的 .mum
包文件,然后将这些包添加到系统中,最后启用Hyper-V的所有相关功能 。
将文件另存为所有文件格式,文件名是Hyper-V.cmd,点击保存。
然后右击该文件以管理员身份运行,等待命令执行,成功后输入Y重启电脑。
(三)选择启用或关闭
(四)安装wsl
wsl --install --web-download
多试几次,卡住了就ctrl+C退出
安装成功
五 wsl查找版本时候,出现一个ubuntu正在分发中
C:\Windows\System32>wsl
wsl: 正在等待 OOBE 命令完成分发“Ubuntu”...
主要是因为上一步ubuntu的账号配错了
(一)配置一个符合校验规则的账号
Provisioning the new WSL instance Ubuntu
This might take a while...
Create a default Unix user account: 0120
Invalid username. A valid username must start with a lowercase letter or underscore, and can contain lowercase letters, digits, underscores, and dashes.
Create a default Unix user account: 0120
Invalid username. A valid username must start with a lowercase letter or underscore, and can contain lowercase letters, digits, underscores, and dashes.
Create a default Unix user account: xieyitang1028
(二)给这个虚拟机的密码设置
好像校验比较严格,不能和账户名重复
Create a default Unix user account: 0120
Invalid username. A valid username must start with a lowercase letter or underscore, and can contain lowercase letters, digits, underscores, and dashes.
Create a default Unix user account: 0120
Invalid username. A valid username must start with a lowercase letter or underscore, and can contain lowercase letters, digits, underscores, and dashes.
Create a default Unix user account: xieyitang1028
New password:
Retype new password:
Sorry, passwords do not match.
passwd: Authentication token manipulation error
passwd: password unchanged
Try again? [y/N] y
New password:
Retype new password:
passwd: password updated successfully
<3>WSL (670 - Relay) ERROR: operator():420: getpwuid(1000) failed 0
Welcome to Ubuntu 24.04.2 LTS (GNU/Linux 5.15.167.4-microsoft-standard-WSL2 x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/pro
System information as of Sun Mar 16 13:32:13 CST 2025
System load: 0.0 Processes: 37
Usage of /: 0.1% of 1006.85GB Users logged in: 1
Memory usage: 11% IPv4 address for eth0: 172.25.65.129
Swap usage: 0%
Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings
This message is shown once a day. To disable it please create the
//.hushlogin file.
#
直接输入一个通用的top命令
top - 13:37:07 up 2:32, 1 user, load average: 0.02, 0.02, 0.00
Tasks: 31 total, 1 running, 30 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 7596.3 total, 6393.3 free, 1021.2 used, 416.9 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 6575.1 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 21648 13120 9600 S 0.0 0.2 0:01.20 systemd
2 root 20 0 2776 1920 1796 S 0.0 0.0 0:00.01 init-systemd(Ub
8 root 20 0 2792 68 68 S 0.0 0.0 0:00.01 init
56 root 19 -1 50424 16548 15412 S 0.0 0.2 0:00.73 systemd-journal
80 root 20 0 23992 6124 4948 S 0.0 0.1 0:00.35 systemd-udevd
155 systemd+ 20 0 21452 11800 9604 S 0.0 0.2 0:00.21 systemd-resolve
156 systemd+ 20 0 91020 6596 5744 S 0.0 0.1 0:00.27 systemd-timesyn
165 root 20 0 4236 2668 2436 S 0.0 0.0 0:00.02 cron
166 message+ 20 0 9528 5136 4508 S 0.0 0.1 0:00.45 dbus-daemon
173 root 20 0 17976 8248 7232 S 0.0 0.1 0:00.26 systemd-logind
176 root 20 0 1756096 15928 9312 S 0.0 0.2 0:00.26 wsl-pro-service
181 root 20 0 3160 1128 1040 S 0.0 0.0 0:00.01 agetty
195 root 20 0 3116 1096 1004 S 0.0 0.0 0:00.00 agetty
199 syslog 20 0 222508 11232 4500 S 0.0 0.1 0:00.19 rsyslogd
210 root 20 0 107016 22472 13140 S 0.0 0.3 0:00.13 unattended-upgr
291 root 20 0 2788 920 784 S 0.0 0.0 0:00.00 SessionLeader
294 root 20 0 2784 212 80 S 0.0 0.0 0:00.00 Relay(295)
295 root 20 0 2800 1156 1064 S 0.0 0.0 0:00.02 sh
296 root 20 0 6664 4456 3692 S 0.0 0.1 0:00.01 login
347 root 20 0 20352 11504 9364 S 0.0 0.1 0:00.21 systemd
350 root 20 0 21156 1716 0 S 0.0 0.0 0:00.00 (sd-pam)
370 root 20 0 5940 4996 3468 S 0.0 0.1 0:00.02 bash
446 root 20 0 2788 216 80 S 0.0 0.0 0:00.00 Relay(447)
(三)分发中的问题解决了
账号也顺登上去了
C:\Windows\System32>wsl <3>WSL (923 - Relay) ERROR: CreateProcessParseCommon:909: getpwuid(1000) failed 0 root@xyt:/mnt/c/Windows/System32#
又出来一个909,用户名不不合法的问题,尝试打开这个xshell’
五 wsl查找版本时候,出现一个909错误
[c:\~]$ C:\Windows\System32>wsl
wsl: 正在等待 OOBE 命令完成分发“Ubuntu”...
<3>WSL (845 - Relay) ERROR: CreateProcessParseCommon:909: getpwuid(1000) failed 0
root@xyt:/mnt/c/Windows/System32#
root@xyt:/mnt/c/Windows/System32#'C:\Windows\System32' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
主要是因为上一步ubuntu的账号配错了。但也是能用,笔者感觉影响不大