前言
将 wsl 迁移到非系统盘(如 d 盘)后,再次启动时可能遇到 “拒绝访问” 错误,本文记录完整排查与修复过程。
一、问题现象
打开 powershell,输入 wsl 启动,报错如下:
ps d:\file\军哥聊技术> wsl 无法将磁盘"\\?\d:\software\wsl\ext4.vhdx"附加到 wsl2: 拒绝访问。 错误代码: wsl/service/createinstance/mountdisk/hcs/e_accessdenied
根本原因:当前 windows 用户对 wsl2 虚拟磁盘文件
ext4.vhdx没有完全控制权限,导致 wsl 无法挂载磁盘。
二、解决步骤
2.1 关闭 wsl
先确保 wsl 完全关闭:
wsl --shutdown
2.2 查看当前文件权限
icacls "d:\software\wsl\ext4.vhdx"
输出如下:
d:\software\wsl\ext4.vhdx builtin\administrators:(i)(f)
nt authority\system:(i)(f)
nt authority\authenticated users:(i)(m)
builtin\users:(i)(rx)可以看到:
administrators和system有完全控制权限(f)- 普通用户只有读取和执行权限
(rx),缺少写入权限
2.3 查看当前用户名
$env:username
记住输出的用户名(例如 23670),下一步要用。
2.4 以管理员身份修复权限
普通终端没有权限修改该文件的 acl,直接运行 icacls /grant 会报"拒绝访问":
# ❌ 普通权限下会失败 icacls "d:\software\wsl\ext4.vhdx" /grant "23670:(f)" # 输出:d:\software\wsl\ext4.vhdx: 拒绝访问。
正确做法——通过 start-process -verb runas 提权执行,运行后会弹出 uac 管理员确认窗口,点击 “是”:
start-process powershell -verb runas -argumentlist "-command", "icacls 'd:\software\wsl\ext4.vhdx' /grant '你的用户名:(f)'; icacls 'd:\software\wsl' /grant '你的用户名:(oi)(ci)(f)'; pause"
⚠️ 注意:将
你的用户名替换为上一步获取的实际用户名。例如用户名为
23670,完整命令为:
start-process powershell -verb runas -argumentlist "-command", "icacls 'd:\software\wsl\ext4.vhdx' /grant '23670:(f)'; icacls 'd:\software\wsl' /grant '23670:(oi)(ci)(f)'; pause"
参数说明:
| 参数 | 含义 |
|---|---|
(f) | full control,完全控制权限 |
(oi) | object inherit,子文件继承此权限 |
(ci) | container inherit,子文件夹继承此权限 |
等弹出的管理员窗口显示 “请按任意键继续” 后,说明权限修复成功。
2.5 重新启动 wsl
wsl
正常输出:
to run a command as administrator (user "root"), use "sudo <command>". see "man sudo_root" for details. (base) wyj@wyj:/mnt/d/file/军哥聊技术$
✅ wsl 启动成功!
三、常见原因总结
| 原因 | 说明 |
|---|---|
| wsl 迁移到非系统盘 | 从 c 盘迁移到 d 盘后,新位置的文件权限未正确继承 |
| windows 更新 | 系统更新后可能重置部分文件夹权限 |
| 手动移动 vhdx 文件 | 复制/移动虚拟磁盘文件时权限丢失 |
| 多用户环境 | 其他管理员创建的 wsl 实例,当前用户无权限 |
四、补充:关于 localhost 代理警告
启动时可能看到以下警告:
wsl: 检测到 localhost 代理配置,但未镜像到 wsl。nat 模式下的 wsl 不支持 localhost 代理。
这条警告 不影响 wsl 正常使用,可以忽略。如需消除,在 %userprofile%\.wslconfig 中添加:
[wsl2] networkingmode=mirrored
保存后执行:
wsl --shutdown wsl
重启即可消除警告。
总结
| 步骤 | 命令 |
|---|---|
| 关闭 wsl | wsl --shutdown |
| 查看权限 | icacls "d:\software\wsl\ext4.vhdx" |
| 查看用户名 | $env:username |
| 提权修复权限 | start-process powershell -verb runas ... |
| 重启 wsl | wsl |
核心思路:用管理员权限给当前用户授予 vhdx 文件的完全控制权限,一行命令即可解决。
ps d:\file\军哥聊技术> wsl --shutdown; icacls "d:\software\wsl\ext4.vhdx" 2>$null
d:\software\wsl\ext4.vhdx builtin\administrators:(i)(f)
nt authority\system:(i)(f)
nt authority\authenticated users:(i)(m)
builtin\users:(i)(rx)
已成功处理 1 个文件; 处理 0 个文件时失败
ps d:\file\军哥聊技术> $env:username
ps d:\file\军哥聊技术> wsl --shutdown; icacls "d:\software\wsl\ext4.vhdx" 2>$null
d:\software\wsl\ext4.vhdx builtin\administrators:(i)(f)
nt authority\system:(i)(f)
nt authority\authenticated users:(i)(m)
builtin\users:(i)(rx)
已成功处理 1 个文件; 处理 0 个文件时失败
ps d:\file\军哥聊技术> wsl --shutdown; icacls "d:\software\wsl\ext4.vhdx" 2>$null
d:\software\wsl\ext4.vhdx builtin\administrators:(i)(f)
nt authority\system:(i)(f)
nt authority\authenticated users:(i)(m)
builtin\users:(i)(rx)
ps d:\file\军哥聊技术> wsl --shutdown; icacls "d:\software\wsl\ext4.vhdx" 2>$null
d:\software\wsl\ext4.vhdx builtin\administrators:(i)(f)
nt authority\system:(i)(f)
ps d:\file\军哥聊技术> wsl --shutdown; icacls "d:\software\wsl\ext4.vhdx" 2>$null
d:\software\wsl\ext4.vhdx builtin\administrators:(i)(f)
nt authority\system:(i)(f)
ps d:\file\军哥聊技术> wsl --shutdown; icacls "d:\software\wsl\ext4.vhdx" 2>$null
d:\software\wsl\ext4.vhdx builtin\administrators:(i)(f)
nt authority\system:(i)(f)
ps d:\file\军哥聊技术> wsl --shutdown; icacls "d:\software\wsl\ext4.vhdx" 2>$null
d:\software\wsl\ext4.vhdx builtin\administrators:(i)(f)
nt authority\system:(i)(f)
ps d:\file\军哥聊技术> wsl --shutdown; icacls "d:\software\wsl\ext4.vhdx" 2>$null
d:\software\wsl\ext4.vhdx builtin\administrators:(i)(f)
d:\software\wsl\ext4.vhdx builtin\administrators:(i)(f)
nt authority\system:(i)(f)
nt authority\authenticated users:(i)(m)
builtin\users:(i)(rx)
已成功处理 1 个文件; 处理 0 个文件时失败
ps d:\file\军哥聊技术> $env:username
23670
ps d:\file\军哥聊技术> icacls "d:\software\wsl\ext4.vhdx" /grant "${env:username}:(f)"
d:\software\wsl\ext4.vhdx: 拒绝访问。
已成功处理 0 个文件; 处理 1 个文件时失败
ps d:\file\军哥聊技术> start-process powershell -verb runas -argumentlist "-command", "icacls 'd:\software\wsl\ext4.vhdx' /grant '23670:(f)'; icacls 'd:\software\wsl' /grant '23670:(oi)(ci)(f)'; pause"
ps d:\file\军哥聊技术> wsl -l -v
name state version
* ubuntu stopped 2
ps d:\file\军哥聊技术> wsl
wsl: 检测到 localhost 代理配置,但未镜像到 wsl。nat 模式下的 wsl 不支持 localhost 代理。
to run a command as administrator (user "root"), use "sudo <command>".
see "man sudo_root" for details.
(base) wyj@wyj:/mnt/d/file/军哥聊技术$到此这篇关于wsl2 启动报错“拒绝访问“ e_accessdenied 完整解决方案的文章就介绍到这了,更多相关wsl2 启动报错内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论