1. 先理清需求:为什么这几个动作要一起做
1.1 典型场景:C盘红了、默认用户不对、sudo 用不了
我平时主力开发环境是 Windows + WSL,手上几台机器从 Win10 企业版 LTSC 到 Win11 都折腾过。最常见的一类需求就是:WSL 安装完后 C 盘被吃满,想迁移 D 盘;默认登录账户每次都要手动切;root 密码不知道;普通用户没 sudo 权限,装个包就卡住。这几个问题看上去分散,实际上是一条链:安装决定发行版放在哪、用什么用户进入;迁移决定 ext4.vhdx 在哪;默认账户决定你每次打开终端是谁;root 密码和 sudo 权限决定你能不能自救。只要其中一步没做对,后面就会反复折腾。
很多人第一次接触 WSL,是在 Microsoft Store 点一下 Ubuntu,然后一路下一步。用着没问题,直到某天 C 盘飘红,或者从别的机器导入了一个发行版,发现默认用户变成 root,终端提示符是#,VSCode 里创建的文件全是 root 所属,普通用户连apt update都跑不了。这时再去搜“WSL 迁移 D 盘”“WSL 默认用户”“WSL root 密码”“WSL sudo 权限”,信息很碎,每个帖子只讲一半。我写这篇,就是把这几个动作按真实排障顺序串起来,从安装、迁移、默认用户、root 密码到 sudo 授权,一次讲透。
适合谁看?如果你刚准备在 Win10 或 Win11 上装 WSL,想避开 C 盘爆满;如果你已经装了 WSL,但想搬到 D 盘;如果你导入过离线发行版,发现登录用户不对;如果你需要给普通用户开 sudo,或者忘了 root 密码,这篇都能直接抄。文中命令以 Ubuntu 22.04 为例,其他 Debian 系发行版也通用,部分命令在 Ubuntu 20.04、Ubuntu 24.04 上需要微调,我会标出来。
1.2 方案选型:命令行优先,别急着上图形工具
WSL 的安装、迁移、用户权限,全部可以用命令行完成。为什么我建议命令行优先?第一,可复现。你在一台机器上跑通的命令,换一台机器还能跑。第二,出错有日志。图形界面点一下失败,往往只弹一句“安装失败”,命令行会告诉你 403、超时、还是虚拟化没开。第三,迁移和导入场景下,图形入口经常找不到。比如你用wsl --import导入的发行版,Microsoft Store 的 Ubuntu 启动器可能不认;你用wsl --manage --move迁移后,旧快捷方式可能还指向原路径。命令行是更稳的入口。
方案选型可以按 WSL 版本分。新版 WSL,也就是支持wsl --version、wsl --manage的版本,优先用wsl --manage <发行版> --move <目标路径>迁移,用wsl --manage <发行版> --set-default-user <用户>设置默认用户。老版本 WSL 没有这些子命令,就用wsl --export和wsl --import做迁移,用/etc/wsl.conf设置默认用户。再老一点的 Ubuntu 启动器,比如ubuntu2204.exe config --default-user,也能用,但它依赖 Windows 上的启动器路径,迁移后可能失效。综合下来,/etc/wsl.conf是最跨版本的默认用户方案,值得优先掌握。
还有一个常见选择:发行版放 C 盘还是 D 盘。默认安装放%LOCALAPPDATA%\Packages或%LOCALAPPDATA%\Microsoft\WindowsApps相关位置,实际 ext4.vhdx 通常在用户目录下的包目录里。C 盘空间紧张时,迁移到 D 盘是合理选择。但 D 盘必须是 NTFS,不能是 exFAT 或 FAT32,也不能是网络映射盘。原因很简单:WSL2 的 ext4.vhdx 需要 NTFS 的权限、稀疏文件、硬链接等特性,exFAT 不支持,放上去轻则启动失败,重则文件系统损坏。这个坑我见过不止一次。
1.3 迁移前的容量与备份计算
迁移前一定要算空间,不要凭感觉。WSL2 的ext4.vhdx是动态扩展盘,你在 Linux 里删了文件,vhdx 不一定自动缩小。所以它可能看起来比实际占用大。迁移时,如果你用wsl --manage --move,系统会把 vhdx 从原位置移动到新位置,目标盘至少要能放下当前 vhdx 大小,最好再留 20% 余量。如果你用wsl --export导出 tar,再wsl --import导入,临时 tar 和目标目录会同时存在,目标盘需要准备“tar 大小 + 导入后 vhdx 大小”的空间。
举个例子。假设当前 Ubuntu 的ext4.vhdx是 40GB,导出 tar 后是 25GB。你要把 tar 放在D:\WSL\backup,把新发行版导入到D:\WSL\Ubuntu-22.04。那么 D 盘至少需要 25GB 加 40GB,也就是 65GB,再留 15GB 余量,合计 80GB 比较稳。如果 D 盘只剩 50GB,就不要硬上,先清理或者换盘。计算逻辑不复杂:临时文件、目标文件、备份文件,三个不要放在同一个空间不足的盘上。备份 tar 最好再复制一份到移动硬盘或 NAS,迁移完成前不要删。
备份不只是导出 tar。你还需要备份几个关键配置:/etc/wsl.conf、/etc/sudoers或/etc/sudoers.d/下的自定义文件、用户目录里的重要项目、Windows 侧的C:\Users\你的用户名\.wslconfig。这些文件不大,但恢复时能省很多事。我自己的习惯是,迁移前先跑一遍wsl --shutdown,确认没有 WSL 进程占用,然后导出 tar,记录当前默认用户、发行版名称、WSL 版本。发行版名称别改,比如原来是Ubuntu-22.04,导入时还用Ubuntu-22.04,VSCode 和脚本里的配置就不用改。
2. WSL 安装:从启用功能到装好 Ubuntu
2.1 系统版本与前置检查
安装 WSL 前,先确认 Windows 版本。Win10 需要 2004 及以上,内部版本 19041 及以上;Win11 全系支持。Win10 企业版 LTSC 有些版本也能用,但 Microsoft Store 可能被移除,需要用离线或命令行方式安装。检查版本最简单的是winver,或者 PowerShell 里[System.Environment]::OSVersion.Version。另外要确认 CPU 虚拟化在 BIOS 里开了。任务管理器性能页看“虚拟化:已启用”。如果没开,WSL2 起不来。
管理员 PowerShell 里先看状态:
wsl --status wsl --version wsl --list --verbose如果提示“适用于 Linux 的 Windows 子系统没有已安装的分发版”,说明 WSL 功能可能已启用但没装发行版。如果提示命令不存在,说明 WSL 可选组件没启用。最省事的安装命令是:
wsl --install这条命令会自动启用“适用于 Linux 的 Windows 子系统”和“虚拟机平台”,下载 WSL2 内核,安装默认 Ubuntu 发行版。它做完后通常需要重启一次。如果你想要指定版本:
wsl --set-default-version 2 wsl --install -d Ubuntu-22.04如果wsl --install报错或者卡住,可以手动启用功能:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart然后重启。再安装 WSL2 内核更新包。这里注意,wsl --install和手动 DISM 不要同时乱跑,先看wsl --status的输出。企业环境里,虚拟机平台可能被组策略禁用,需要管理员放行。
2.2 在线安装与 403、超时处理
在线安装最常遇到三类报错:wsl --install已禁止 403、wsl --list --online连接超时、wsl --update下载很慢。403 不一定是你的网络坏了,很可能是组织策略、AppLocker、Microsoft Store 安装策略、或者系统优化工具把安装源拦了。先不要急着改注册表,先确认你是不是在公司域环境。如果是,联系 IT 放行 WSL 和 Microsoft Store 相关策略。如果是个人机器,检查安全软件、系统优化工具、组策略里有没有禁用 Store 或应用安装。
可以尝试的官方命令行选项是--web-download:
wsl --install --web-download -d Ubuntu-22.04 wsl --update --web-download--web-download的意思是绕过 Microsoft Store 通道,直接从网络下载组件。它不保证一定能解决 403,但能排除 Store 通道的问题。如果wsl --list --online超时,先试试wsl --update --web-download更新 WSL 本体,再跑wsl --list --online。还是超时,就换一个网络环境,或者直接走离线包。这里要提醒一句:不要从不明来源下载 WSL 内核和 rootfs,尽量用微软官方发布页和 Ubuntu 官方镜像。来源不明的 tar 包可能带后门,导入后你所有代码和密钥都在里面。
下载慢的问题,通常出在微软源或 GitHub Release 的连通性上。可以错峰下载,或者用离线包。离线包不是“歪门邪道”,在企业内网、离线机房、经常断网的笔记本上,离线导入反而是标准做法。你需要准备两样东西:WSL2 内核更新包,以及 Ubuntu rootfs tar。内核包是.msi,双击安装或者在 PowerShell 里Add-AppxPackage相关方式安装。rootfs tar 用来wsl --import。
2.3 离线安装与 rootfs 导入
离线安装的核心是wsl --import。假设你已经启用了 WSL 和虚拟机平台,也装了 WSL2 内核,现在有一个ubuntu-22.04-rootfs.tar。把它放到D:\WSL\ubuntu2204-rootfs.tar,目标安装目录设为D:\WSL\Ubuntu-22.04。管理员 PowerShell 执行:
wsl --import Ubuntu-22.04 D:\WSL\Ubuntu-22.04 D:\WSL\ubuntu2204-rootfs.tar --version 2导入完成后,wsl --list --verbose应该能看到Ubuntu-22.04,状态是Stopped,版本是 2。第一次进入:
wsl -d Ubuntu-22.04注意,导入的发行版默认用户是 root。你会看到提示符是#。这不是故障,而是wsl --import的设计。你需要手动创建普通用户,加入 sudo 组,再设置默认用户。后面第 4 章会详细讲。离线导入的好处是快、可控、不依赖在线源;坏处是首次配置多几步。tar 包要完整,最好校验哈希。导入时目标目录不要提前塞满东西,命令会创建ext4.vhdx。如果导入报错,先检查 tar 路径有没有中文、空格,目标盘是不是 NTFS,空间够不够。
2.4 安装后的首次初始化
无论在线安装还是离线导入,第一次进系统后都建议做一轮初始化。先确认用户和权限:
whoami id如果是普通用户,正常。如果是 root,先去创建普通用户:
adduser alice usermod -aG sudo alice然后更新系统:
sudo apt update sudo apt upgrade -y装基础工具:
sudo apt install -y curl git build-essential zsh unzip这些工具不大,但后面装 Node、Python、Docker、CUDA 都可能用到。接着检查/etc/wsl.conf是否存在。新装 Ubuntu 默认可能没有这个文件。你可以先不急着写,等确定默认用户后再写。首次初始化还要注意 systemd。Ubuntu 22.04 的 WSL 默认可能没有开 systemd,装 Redis、Docker、snap 时可能服务起不来。开启方式是在/etc/wsl.conf里加:
[boot] systemd=true然后wsl --shutdown,重新进入。这个配置和默认用户配置可以写在同一个文件里。初始化完成后,建议立刻做一次导出备份:
wsl --export Ubuntu-22.04 D:\WSL\backup\ubuntu2204-initial.tar这样后面迁移、改坏配置,都有后悔药。
3. 迁移到 D 盘:新版 --move 与传统 export/import
3.1 为什么要迁移:C 盘空间与 IO
WSL2 的 Linux 文件系统放在一个ext4.vhdx虚拟磁盘里。默认安装时,这个文件在 C 盘用户目录下。随着你装包、拉代码、跑 Docker、编译项目,vhdx 会越来越大。更麻烦的是,Linux 里删文件后,vhdx 不会自动把空间还给 Windows。你可能在 WSL 里rm -rf了几十 GB 缓存,C 盘还是红的。迁移到 D 盘能直接缓解系统盘压力。另外,D 盘如果是 NVMe SSD,IO 性能比机械硬盘好很多;如果是 SATA SSD,也比 C 盘爆满后系统卡顿强。
迁移前要明确:WSL2 的 vhdx 不是普通文件,不能直接用资源管理器剪切。你手动剪切,注册表里的路径没变,下次启动会找不到盘。也不要把它放到 OneDrive 同步目录、网络盘、可移动 U 盘。OneDrive 会尝试同步 vhdx,导致文件锁冲突;网络盘延迟高,WSL 启动极慢;可移动盘拔了就崩。正确做法是用wsl --manage --move或wsl --export/--import。这两个命令会处理注册表和路径。迁移前先wsl --shutdown,确保没有进程占用。
还有一个细节:WSL2 的磁盘性能受 Windows 磁盘影响。D 盘最好不是压缩盘,不要开 NTFS 压缩,不要开 BitLocker 解锁延迟太高的情况。企业环境里如果 D 盘是网络映射盘,直接放弃迁移,改用移动 C 盘其他文件。迁移后,WSL 里访问 Windows 文件仍然通过/mnt/c、/mnt/d,但 Linux 根文件系统已经在 D 盘。项目代码建议放在 Linux 文件系统里,比如~/projects,不要放在/mnt/d,否则 IO 会慢很多。
3.2 用 wsl --manage --move 迁移
新版 WSL 支持wsl --manage,迁移非常舒服。先看版本:
wsl --version如果版本较新,支持--manage,按下面做:
wsl --shutdown wsl --list --verbose wsl --manage Ubuntu-22.04 --move D:\WSL\Ubuntu-22.04执行前,建议先创建父目录D:\WSL,目标目录D:\WSL\Ubuntu-22.04不要提前创建,让命令自己创建,避免冲突。迁移过程中不要断电,不要休眠。迁移完成后:
wsl --list --verbose wsl -d Ubuntu-22.04进去后pwd、whoami、df -h看一下。df -h根分区应该还是原来的大小。wsl --manage --move的优点是保留用户、配置、已装软件,默认用户也不会丢。缺点是要求 WSL 版本较新,老版本 Win10 可能没有这个子命令。如果你的wsl --manage提示未知参数,就走下一节的传统方案。
这里有个容易忽略的点:--move的目标路径不要和原路径相同,也不要把目标目录设在原目录里面。比如原路径是C:\Users\你\AppData\Local\Packages\...,目标可以设为D:\WSL\Ubuntu-22.04。迁移后,原位置的 vhdx 会被移走,但旧快捷方式可能还指向旧路径。用wsl -d Ubuntu-22.04启动最稳。VSCode Remote WSL 如果连不上,先wsl --shutdown,再重开 VSCode。
3.3 传统导出导入流程
老版本 WSL 用导出导入。这个流程更通用,但步骤多,且导入后默认用户会变成 root。先关闭:
wsl --shutdown导出 tar:
wsl --export Ubuntu-22.04 D:\WSL\backup\ubuntu2204.tar导出完成后,确认 tar 大小正常。然后注销原发行版:
wsl --unregister Ubuntu-22.04注意:
wsl --unregister会删除原发行版及其 ext4.vhdx。执行前必须确认 tar 导出成功,并且最好再复制一份 tar。不要在没有备份的情况下执行。
导入到 D 盘:
wsl --import Ubuntu-22.04 D:\WSL\Ubuntu-22.04 D:\WSL\backup\ubuntu2204.tar --version 2导入后启动:
wsl -d Ubuntu-22.04你会发现默认用户变成 root。别慌,这是预期行为。修复方法在第 4 章。导入后检查根分区、已装软件、用户目录。如果 tar 里原来有/home/alice,导入后用户还在,只是默认登录用户不是 alice。用ls /home看一下。然后设置默认用户,再wsl --shutdown重进。传统方案的好处是兼容性极强,几乎任何 WSL 版本都能用;坏处是中间多一次注销,风险比--move高,所以备份是硬要求。
3.4 迁移后的校验与磁盘压缩
迁移完成后,先做一轮校验。进入 WSL:
whoami df -h ls /mnt/d ip addrwhoami确认默认用户。df -h确认根分区挂载正常。ls /mnt/d确认 Windows D 盘挂载。ip addr看网络是否正常。然后测试常用命令:git --version、python3 --version、node --version。如果有 Docker,docker ps看一下。VSCode 里打开项目,确认 Remote WSL 能连。
如果 vhdx 太大,可以压缩。先在 WSL 里清理无用文件,跑:
sudo apt autoremove --purge -y sudo apt clean sudo fstrim -av然后关闭 WSL:
wsl --shutdown管理员 PowerShell 用 diskpart 压缩:
diskpart select vdisk file="D:\WSL\Ubuntu-22.04\ext4.vhdx" attach vdisk readonly compact vdisk detach vdisk exit注意 diskpart 操作磁盘有风险,路径必须写对。路径中有空格要用引号。压缩前确保 WSL 完全关闭,否则文件被占用会失败。也可以考虑Optimize-VHD,但需要 Hyper-V 模块。压缩后 vhdx 可能明显变小。压缩不是必须,但对 C 盘或 D 盘空间紧张的情况很有用。我一般迁移完成后先不压缩,等用一两周稳定了再压,避免刚迁移就动磁盘。
4. 默认登录账户:让 wsl 一开就是你要的用户
4.1 三种设置方式对比
设置 WSL 默认登录账户有三条路:新版wsl --manage --set-default-user、跨版本的/etc/wsl.conf、老版 Ubuntu 启动器ubuntu2204.exe config --default-user。我推荐/etc/wsl.conf,因为它不依赖 WSL 版本,也不依赖 Windows 启动器路径。迁移、导入后都能用。新版--manage适合不想进 Linux 改文件的场景。老版启动器适合 Microsoft Store 安装的 Ubuntu,但迁移后启动器可能找不到发行版,所以不是首选。
| 方式 | 命令/文件 | 适用场景 | 注意点 |
|---|---|---|---|
| 新版 WSL | wsl --manage Ubuntu-22.04 --set-default-user alice | WSL 版本较新 | 需要先确认支持--manage |
| wsl.conf | /etc/wsl.conf写[user] default=alice | 所有版本,导入后修复 | 改完必须wsl --shutdown |
| 老版启动器 | ubuntu2204.exe config --default-user alice | Store 安装的 Ubuntu | 迁移后可能失效 |
无论用哪种方式,核心逻辑都是:WSL 启动时读取配置,决定用哪个用户登录。如果配置里写的用户不存在,或者 shell 无效,就会回退到 root。所以设置完一定要wsl --shutdown,再重新进入验证。不要在多个地方同时设置冲突的值,比如/etc/wsl.conf写 alice,启动器设 bob,最后谁生效看版本,容易混乱。统一用/etc/wsl.conf最省心。
4.2 /etc/wsl.conf 的正确写法
进入 WSL,用有 sudo 权限的用户编辑:
sudo tee /etc/wsl.conf <<'EOF' [user] default=alice EOF如果文件已存在,先备份:
sudo cp /etc/wsl.conf /etc/wsl.conf.bak然后追加或修改。你要确保[user]节名小写,default键小写,值是你真实的 Linux 用户名。不要写Default、User、username。写错不会报错,但默认用户不生效。如果同时要开启 systemd,可以写成:
[user] default=alice [boot] systemd=true改完在 Windows PowerShell 里关闭 WSL:
wsl --shutdown等待几秒,再进入:
wsl -d Ubuntu-22.04然后whoami应该输出alice。如果还是 root,检查/etc/wsl.conf权限和内容,检查alice是否存在,检查/etc/passwd里 alice 的 shell 是不是/bin/bash或/bin/zsh。还有一个坑:某些 Windows 编辑器保存文件时会加 BOM 或 CRLF 换行,导致 Linux 解析异常。用cat -A /etc/wsl.conf看一下有没有^M或 BOM。如果有,用dos2unix或sed清理。
4.3 导入后默认 root 的修复
wsl --import导入的发行版默认 root,这是最常见的“迁移后遗症”。修复步骤很固定。先以 root 进入:
wsl -d Ubuntu-22.04 -u root然后创建普通用户:
adduser alice系统会提示设置密码、全名等。接着加入 sudo 和 adm 组:
usermod -aG sudo alice usermod -aG adm alice检查用户:
id alice ls -la /home/alice然后写/etc/wsl.conf:
tee /etc/wsl.conf <<'EOF' [user] default=alice EOF退出 root shell,在 PowerShell 里:
wsl --shutdown wsl -d Ubuntu-22.04再whoami。如果原来 tar 里已经有/home/alice,你不需要重新adduser,只需要确保用户存在、密码可登录、加入 sudo 组,然后设置默认用户。可以用cat /etc/passwd | grep alice确认。如果 UID 冲突,比如 alice 的 UID 是 1000,但系统里另一个用户也用了 1000,需要调整。一般情况下导入的 tar 用户和组关系完整,不会冲突。修复完成后,建议立刻导出一次新备份,因为此时配置是你想要的状态。
4.4 VSCode Remote WSL 的用户跟随
VSCode 的 Remote - WSL 扩展会使用 WSL 发行版的默认用户。默认用户是 root 时,VSCode 里新建文件属主就是 root,之后普通用户改不了,终端里也容易权限混乱。把默认用户改成 alice 后,wsl --shutdown,然后在 VSCode 里重新连接 WSL。左下角绿色角标会显示WSL: Ubuntu-22.04。打开终端,whoami应该是 alice。项目建议放在~/projects或~/code,不要放在/mnt/c/Users/...。原因不是不能用,而是跨文件系统 IO 慢,尤其是npm install、cargo build、go build这种大量小文件读写,放在/mnt/c下会明显卡。
如果你之前用 root 在 VSCode 里创建过项目,文件属主可能是 root。修复:
sudo chown -R alice:alice ~/projects如果项目在/mnt/c下,Windows 侧权限和 Linux 侧权限混在一起,chown可能不生效,这是跨文件系统特性。最稳的做法还是把代码移到 Linux 文件系统。VSCode 的 Remote WSL 默认用户跟随发行版默认用户,所以只要/etc/wsl.conf对了,VSCode 就对了。如果 VSCode 还连旧用户,执行wsl --shutdown,重启 VSCode,或者命令面板里Remote-WSL: Reopen in WSL。还不行,检查 VSCode 设置里有没有手动指定用户。
5. root 密码与 sudo 权限:把权限这事一次搞明白
5.1 root 密码到底要不要设
Ubuntu WSL 初始状态下,root 账户通常没有密码,或者密码被锁定,日常通过普通用户加 sudo 提权。很多教程让你设 root 密码,但没解释为什么。设 root 密码的好处是:你可以su - root进入 root shell,可以在 sudo 配置坏掉时用 root 自救,可以在单用户恢复场景下更方便。坏处是:多了个高权限密码,如果设得太简单,或者到处用 root 登录,容易误操作。我的建议是设一个强密码,存在密码管理器里,日常仍然用普通用户加 sudo。不要用 root 作为 WSL 默认登录用户,也不要用 root 跑 VSCode。
还有一种情况:你从别人那里导入了一个 tar,root 密码未知,sudo 也可能被改坏。这时可以用wsl -d Ubuntu-22.04 -u root直接以 root 身份进入,不需要密码。这是 WSL 的特性:Windows 侧用户可以指定-u root启动。所以即使 root 密码忘了,只要你能操作 Windows 命令行,就能救回来。这也意味着 Windows 账户安全很重要,别随便让别人用你的电脑。设 root 密码不是必须,但建议设。设完不要忘记,也不要设成和 Windows 登录密码一样。
5.2 修改 root 密码的几种入口
如果当前普通用户有 sudo 权限:
sudo passwd root系统会提示输入新密码两次。输入时屏幕不显示字符,正常。设完后验证:
su - root输入新密码,能进入 root shell 就成功。退出用exit。如果普通用户没 sudo 权限,或者 sudo 报错,在 Windows PowerShell 里直接以 root 运行:
wsl -d Ubuntu-22.04 -u root passwd这会直接执行passwd,修改 root 密码。也可以进入 root shell:
wsl -d Ubuntu-22.04 -u root然后:
passwd root如果提示Authentication token manipulation error,可能是/etc/shadow权限不对,或者文件系统只读。检查:
ls -l /etc/shadow passwd -S root chage -l root/etc/shadow正常权限是640 root:shadow。如果被改坏,用 root 修:
chmod 640 /etc/shadow chown root:shadow /etc/shadow如果 root 被锁定,passwd -S root会显示L。解锁:
passwd -u root如果设置完密码登录仍提示错误,先确认键盘布局、Caps Lock、数字小键盘。WSL 终端里密码不回显,输错很常见。还不行,用wsl -u root重新设一遍。注意,sudo passwd root和wsl -u root passwd改的是同一个/etc/shadow,不会冲突。
5.3 普通用户加入 sudo 组
Ubuntu 里,sudo 权限通常通过sudo组控制。安装时创建的第一个用户默认在 sudo 组。如果你新建了用户,或者导入后创建的用户没加组,就会提示alice is not in the sudoers file。修复:
sudo usermod -aG sudo alice如果当前用户没 sudo,用 root 执行:
wsl -d Ubuntu-22.04 -u root usermod -aG sudo alice顺便加入adm组,方便看日志:
usermod -aG adm alice组变更不会影响已经登录的会话。你需要退出当前 shell,或者wsl --shutdown后重新进入。验证:
id alice groups aliceid输出里应该有sudo。然后切换到 alice:
su - alice sudo whoami如果输出root,说明 sudo 可用。注意不同发行版组名不同。Debian、Ubuntu 用sudo,CentOS、Fedora、RHEL 用wheel。如果你在 WSL 里装的是 AlmaLinux、openSUSE,别照抄sudo组,先看/etc/sudoers里启用了哪个组。grep -E 'sudo|wheel' /etc/sudoers可以查。组名错了,加了也没用。
5.4 sudoers 安全编辑与验证
大多数情况下,把用户加入 sudo 组就够了。少数情况需要精细控制,比如只允许某些命令、免密、限制命令路径。编辑 sudoers 必须用visudo:
sudo visudo默认文件里通常有:
%sudo ALL=(ALL:ALL) ALL这表示 sudo 组所有成员可以执行所有命令。如果你要单独加用户:
alice ALL=(ALL:ALL) ALL不建议写成:
alice ALL=(ALL:ALL) NOPASSWD: ALL免密 sudo 方便,但风险高,尤其是多人使用的机器。如果确实需要免密,比如自动化脚本,建议只对特定命令免密:
alice ALL=(ALL) NOPASSWD: /usr/bin/apt update, /usr/bin/apt upgrade改完保存,用sudo visudo -c检查语法。语法错误会导致 sudo 完全不能用,所以visudo会在保存前检查。不要把/etc/sudoers权限改成 777,正确权限是440。更推荐把自定义配置放到/etc/sudoers.d/下,比如:
sudo tee /etc/sudoers.d/alice <<'EOF' alice ALL=(ALL:ALL) ALL EOF sudo chmod 440 /etc/sudoers.d/alice然后sudo visudo -c验证。如果 sudoers 被改坏,用wsl -u root进入修复:
visudo或者直接恢复备份。做 sudoers 修改前,先sudo cp /etc/sudoers /etc/sudoers.bak,但不要用普通编辑器直接改,还是visudo最安全。
5.5 常见权限错误排查
权限问题看起来五花八门,其实常见就几类。第一类:alice is not in the sudoers file。解决是把用户加入 sudo 组,然后重新登录。第二类:sudo: effective uid is not 0。这通常是因为/usr/bin/sudo权限不对,或者挂载选项有问题。检查:
ls -l /usr/bin/sudo正常应该是-rwsr-xr-x root root,有 setuid 位。如果不对:
chown root:root /usr/bin/sudo chmod 4755 /usr/bin/sudo第三类:Authentication failure。可能是密码错、键盘布局、账户锁定。用passwd -S alice查看状态。第四类:passwd: Authentication token manipulation error。检查/etc/passwd、/etc/shadow权限和磁盘空间。df -h看根分区是不是满了。第五类:组变更后 sudo 仍不可用。因为当前会话的组信息没更新。exit重新登录,或者wsl --shutdown。用newgrp sudo可以临时刷新组,但不如重新登录彻底。
6. 开发环境联动:VSCode、字体、Docker、CUDA 的注意事项
6.1 VSCode + WSL 的工作流
VSCode 里装 Remote - WSL 扩展后,WSL 里的项目可以直接在 Windows 版 VSCode 打开,但代码运行在 Linux 环境。工作流通常是:在 WSL 终端进入项目目录,运行code .。VSCode 会自动连接 WSL。左下角显示发行版名称。终端默认是 WSL 的 shell。调试、Git、任务都在 Linux 侧执行。这样既有 Windows 的图形界面,又有 Linux 的工具链,写 Python、Go、Rust、Node 都很舒服。关键点:项目放 Linux 文件系统,比如~/projects。放在/mnt/c或/mnt/d下虽然能在 Windows 资源管理器看到,但 IO 慢,文件权限也容易乱。
code .命令需要 VSCode 在 Windows PATH 里。如果 WSL 里提示code: command not found,在 VSCode 命令面板运行Shell Command: Install 'code' command in PATH。如果 Remote WSL 连接失败,先wsl --shutdown,重启 VSCode。检查默认用户是不是正确。VSCode 的扩展分本地和远程,Python、Go、Rust 这些扩展要装在 WSL 侧。Git 配置也在 WSL 里。不要把 Windows 的 Git 和 WSL 的 Git 混用,容易换行符和权限混乱。统一在 WSL 里git config --global。
6.2 接近 macOS 的终端字体设置
很多人说 WSL 写代码想接近 macOS 的体验,其实一半在字体,一半在行距和抗锯齿。Windows Terminal 和 VSCode 都可以设置。字体推荐等宽字体:JetBrains Mono、Cascadia Code、Maple Mono、Fira Code、IBM Plex Mono。它们都有连字和不错的字形。VSCode 设置 JSON:
{ "editor.fontFamily": "'JetBrains Mono', 'Cascadia Code', monospace", "editor.fontLigatures": true, "editor.fontSize": 14, "editor.lineHeight": 1.6, "terminal.integrated.fontFamily": "JetBrains Mono", "terminal.integrated.fontSize": 14, "terminal.integrated.lineHeight": 1.25 }Windows Terminal 的settings.json里给对应 profile 加:
{ "font": { "face": "JetBrains Mono", "size": 12 }, "opacity": 95, "useAcrylic": true }行高别太挤,1.2 到 1.3 比较舒服。抗锯齿在 Windows 上由 ClearType 和字体渲染决定,VSCode 可以试"editor.fontWeight": "450"。如果你想要更接近 macOS 的观感,注意深色主题、稍微大一点的字号、足够的行距、不要太亮的背景。字体文件可以装在 Windows 侧,WSL 终端也会用到。终端里的字体是 Windows Terminal 渲染的,不是 Linux 渲染的,所以在 WSL 里改字体配置没用。
6.3 Docker、CUDA、binwalk、Redis 的安装位置
WSL 里装 Docker 有两条路:Docker Desktop 的 WSL2 后端,或者在发行版里直接装 Docker Engine。Docker Desktop 省心,支持端口转发、Kubernetes,适合开发;直接装 Engine 更轻,但需要自己配 systemd。要在 WSL 里用 systemd,先在/etc/wsl.conf开[boot] systemd=true,wsl --shutdown后重进,再systemctl status docker。CUDA 的坑最多:Windows 侧装 NVIDIA 驱动,WSL 里只装 CUDA Toolkit,不要装 Linux 显卡驱动。装错驱动会导致nvidia-smi不工作。装完在 WSL 里跑nvidia-smi验证。binwalk 直接sudo apt install binwalk,固件分析常用,依赖较多,装完binwalk --help验证。Redis 可以sudo apt install redis-server,开了 systemd 后sudo systemctl enable --now redis-server。这些工具都建议装在 Linux 文件系统里,不要装到/mnt/d。
6.4 .wslconfig 资源限制与 systemd
WSL2 默认会占用较多内存,尤其是跑 Docker、编译项目时。你可以在 Windows 用户目录下创建.wslconfig:
[wsl2] memory=8GB processors=4 swap=2GB localhostForwarding=true路径是C:\Users\你的用户名\.wslconfig。内存给多少要算。主机 16GB,给 WSL 8GB,留 8GB 给 Windows,比较稳。主机 8GB,给 4GB,别给 6GB,否则 Windows 容易卡。主机 32GB,给 16GB 也合理。processors给物理核心数的一半到三分之二。swap给内存的 25% 到 50%。改完wsl --shutdown生效。localhostForwarding=true让 WSL 里监听的服务可以通过 Windows 的 localhost 访问。如果要用 Docker、Redis、CUDA,这些配置很关键。注意.wslconfig是 Windows 侧文件,不是 Linux 里的/etc/wsl.conf,两个别搞混。
7. 常见问题速查与实战排查
7.1 安装类问题
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
wsl --install已禁止 403 | 组织策略、Store 策略、安全软件拦截 | 联系管理员放行,试--web-download,离线导入 |
wsl --list --online连接超时 | 网络到微软源不稳定 | 换网络,wsl --update --web-download,离线 rootfs |
wsl --update下载很慢 | 官方源速度波动 | 错峰下载,离线内核包 |
| 没有已安装分发版 | 只启用了 WSL 没装发行版 | wsl --install -d Ubuntu-22.04或离线导入 |
| 虚拟化未启用 | BIOS 没开 VT-x/AMD-V | 进 BIOS 开启,任务管理器确认 |
安装类问题最忌讳东改西改。先看wsl --status,再看 Windows 版本,再看虚拟化。403 和超时不是一回事。403 是权限或策略拒绝,超时是网络不通。处理方式不同。离线导入能绕过很多在线问题,但前提是 WSL 本体和内核已经装好。企业机器上,先问 IT 有没有禁用 WSL。不要从第三方站下载修改版内核。
7.2 迁移类问题
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| 迁移后默认用户变 root | 使用 export/import | 写/etc/wsl.conf设置 default 用户 |
| 启动提示找不到发行版 | 手动剪切 vhdx,注册表路径未更新 | 用wsl --import重新导入 |
| 迁移后无法启动 | 目标盘 exFAT、网络盘、空间不足 | 换 NTFS 本地盘,检查空间 |
| VSCode 连不上 | 旧连接缓存、默认用户错 | wsl --shutdown,重启 VSCode,检查用户 |
| D 盘空间不足 | tar 和目标 vhdx 同时存在 | 清理临时 tar,换盘,先压缩再迁移 |
迁移类问题里,手动剪切 vhdx 是最危险的。WSL 注册表里记录了发行版路径,手动剪切后路径失效,重新注册很麻烦。正确做法只有官方命令。另一个常见问题是迁移后 root 登录,VSCode 里文件权限全乱。按第 4 章修复默认用户,再用chown修项目属主。迁移前备份 tar,迁移后验证df -h、whoami、git status。
7.3 用户与权限类问题
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| 默认用户不生效 | wsl.conf 写错、未 shutdown、用户不存在 | 检查/etc/wsl.conf,wsl --shutdown,id alice |
| root 密码错误 | 键盘布局、账户锁定、密码未设 | wsl -u root passwd重置,passwd -S root |
| sudo 不可用 | 用户不在 sudo 组 | usermod -aG sudo alice,重新登录 |
| sudoers 语法错 | 直接编辑文件 | 用wsl -u root和visudo修复 |
| 文件属主是 root | 默认用户曾是 root | sudo chown -R alice:alice ~/projects |
用户权限问题大多有救。因为 WSL 支持-u root启动,即使 sudo 全坏了,也能从 Windows 侧以 root 进入修复。关键是别慌,别重装。先确认默认用户,再确认组,再确认 sudoers。改完配置一定要wsl --shutdown。组变更要重新登录。密码问题优先用 root 重置。
7.4 性能与网络类问题
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| WSL 内存占用高 | 默认吃内存,Docker/编译缓存 | .wslconfig限制 memory、swap |
| 项目编译慢 | 代码放在/mnt/c | 移到~/projects |
| 端口无法访问 | localhostForwarding 关闭 | .wslconfig开localhostForwarding=true |
| 磁盘越来越大 | vhdx 不自动收缩 | fstrim,wsl --shutdown,diskpart compact |
| 终端字体不好看 | 默认字体、行距太小 | 换 JetBrains Mono、调行高、开连字 |
性能问题往往不是 WSL 本身慢,而是文件放错位置。跨/mnt的 IO 比 Linux 文件系统慢很多。node_modules、target、build目录放/mnt/c会非常卡。内存限制别设太死,给 WSL 太小会 OOM。磁盘压缩要等 WSL 完全关闭。网络问题先检查 Windows 防火墙,再看服务监听地址是不是0.0.0.0。
8. 我的实操心得与避坑清单
8.1 备份永远不亏
我现在给新机器装 WSL 的固定顺序是:先备份,再安装,迁移,改默认用户,设 root 密码,加 sudo,最后在 VSCode 里打开项目。这套流程跑过 Win10 LTSC 和 Win11,最省事的还是新版wsl --manage --move,老机器就用export/import。真要说一句,迁移前把 tar 导出来,比什么都踏实。导出 tar 不贵,坏一次环境很贵。除了 tar,/etc/wsl.conf、/etc/sudoers.d/、~/.ssh、~/.gitconfig都值得备份。项目代码如果用了 Git,确认远程仓库最新提交都推了。
8.2 不要手改 vhdx
不要用资源管理器剪切ext4.vhdx,不要用第三方工具挂载写入,不要在 WSL 运行时复制 vhdx。运行时复制出来的 vhdx 可能不一致,导入后文件系统损坏。正确流程永远是wsl --shutdown,再用官方命令。如果你非要手动备份 vhdx,也只在关机后复制,而且恢复时最好用wsl --import配合 tar,而不是直接替换 vhdx。很多“迁移后启动不了”的案例,都是手动剪切造成的。官方命令慢一点,但稳。
8.3 密码与 sudo 的边界
root 密码设了别到处用,日常还是普通用户加 sudo。sudo 组变更要重新登录才生效。免密 sudo 能不开就不开,自动化场景用 sudoers.d 精细控制。改 sudoers 一定用visudo,改完visudo -c。如果 sudo 坏了,用wsl -u root救。默认用户不要设成 root,VSCode 里文件属主会乱。密码别用弱口令,别和 Windows 密码相同,最好存密码管理器。WSL 不是隔离沙箱,Windows 用户能直接以 root 进入,所以 Windows 登录密码也要设。
8.4 后续扩展路线
环境稳定后,可以按需扩展:VSCode Remote WSL、Docker Desktop 或 Docker Engine、CUDA Toolkit、binwalk、Redis、Node、Python、Go。每装一类工具,先确认 systemd 是否开启,再确认文件放 Linux 文件系统。重要配置改动前导出备份。发行版升级大版本前,先看官方说明,不要直接do-release-upgrade赌运气。WSL 的便利在于随时能导出、导入、迁移,把备份和默认用户这两件事做对,后面换机器、换盘、重装系统都不慌。