ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Windows 11 WSL2 手动导入 CentOS 全攻略

Windows 11 WSL2 手动导入 CentOS 全攻略 1. Windows 11 上为什么搜不到 CentOS 这个发行版如果你在 Windows 11 上敲过wsl --install大概率会得到一个 Ubuntu命令行一开就能用体验非常顺。可你一旦把关键词换成 CentOS事情就变味了wsl --install -d CentOS直接报找不到发行版去商店里翻也翻不到一个能长期稳定用的 CentOS 条目。这不是你机器的问题也不是网络的问题。WSL 的发行版分发走的是微软商店这套机制只有在商店上架的发行版才能被--install一键拉起来而 CentOS 因为上游项目本身的路线调整CentOS Linux 8 提前结束支持、主线转向 CentOS Stream在商店里的存在感一直断断续续很多时间点干脆就搜不到。所以想在 Windows 11 里跑 CentOS主流思路是绕开商店自己准备一份rootfs 压缩包用wsl --import把它注册成一个自定义发行版。这条路听起来比--install麻烦但好处非常明显发行版名字、安装位置、版本号、系统盘大小全部由你自己控制而且这套方法对任何没上架的 Linux 发行版都通用学会了能把 CentOS、Rocky、Alma、甚至自己裁的系统统统塞进 WSL。1.1 WSL 发行版的本质一个 rootfs 加一层启动壳很多人对 WSL 发行版有误解觉得它是个安装包其实不是。一个 WSL 发行版拆开来看就两样东西一份 Linux 根文件系统也就是/bin、/etc、/usr这一整套目录树加上一层负责把它引导起来的壳。商店里的 Ubuntu本质上是 Canonical 打包好的一份 rootfs 加一个 launcher 应用你自己wsl --import的时候喂给 WSL 的就是那份 tar 包后面那层壳 WSL 自己帮你生成。想通这一点后面所有操作就顺了。所谓在 WSL 里装 CentOS准确说法是把一份 CentOS 的根文件系统注册给 WSL 管理。tar 包里有什么你进去之后就是什么tar 包里没有的进去之后也不会凭空出现。这也是为什么导入完第一次进去是 root 用户、没有普通账号、/etc/wsl.conf一片空白——因为那份 rootfs 本来就是给人当基础镜像用的没人替你做过个性化配置。1.2 与 VMware 里跑 CentOS 的本质差异我见过不少人是先在 VMware 里跑 CentOS 7用顺手了想搬到 WSL结果发现很多习惯动作失效了。这两者的差别不是哪个更好而是模型完全不同下面这张表是我自己踩过一轮之后总结出来的对比维度WSL2 里的 CentOSVMware 里的 CentOS内核由 WSL 统一提供所有发行版共用同一个 Linux 内核发行版自带内核随系统升级引导流程不走 GRUB不跑 initrd直接由 WSL 拉起进程树完整 BIOS/UEFI GRUB initrd 流程systemd依赖 WSL 版本和发行版自身 systemd 版本不一定能起默认就是一号进程稳网络默认 NAT也可以切成 mirrored 模式桥接或 NAT由 VMware 管文件系统系统盘是一个ext4.vhdx动态虚拟盘一整个 vmdk资源占用内存按需分配空闲时占用很低开机就吃掉固定内存最需要注意的是内核这一条。WSL2 所有发行版共用 WSL 自己那个内核这意味着发行版自带的某些内核相关功能比如特定的内核模块、老版本的工具链可能和你预期的不一致。反过来也有好处你不需要为 CentOS 单独准备内核省了一大堆麻烦启动速度是 VMware 完全比不了的。1.3 三条可落地路线与取舍对照把 CentOS 塞进 WSL目前我实际用下来靠谱的就三条路各有权衡从容器镜像导出 rootfs最稳、最可复现。有 Docker 环境的话docker export出来的 tar 结构天然就是 WSL 要的格式几乎零改造。缺点是必须先有一个能跑 Docker 的环境。用官方提供的 Docker 基础镜像 tar / 云镜像下载即用省掉导出步骤。缺点是 CentOS 项目调整之后官方镜像站的目录结构和文件名变过几轮老链接经常 404需要自己核对清楚。从 ISO 手工制作 rootfs最灵活能精确控制装哪些包。代价是要在虚拟机或物理机里装一遍再打包工作量最大除非有特殊定制需求一般没必要。我的建议很直接优先走第一条。哪怕你手上没有 Docker临时在 WSL 里装个 Ubuntu 再装 Docker也比手工从 ISO 做 rootfs 省事得多。下面章节会重点把第一条路写透。2. 开工前把 Windows 11 的地基打牢WSL 装不上、装上了跑不起来八成问题都出在地基上。这一步不算难但顺序错了会反复重启、反复排查很折磨人。2.1 虚拟化、可选组件与一次重启先确认 CPU 虚拟化在 BIOS/UEFI 里是打开的。Windows 11 自带的任务管理器性能标签页右下角会显示虚拟化已启用 / 已禁用先看一眼禁用的话去 BIOS 里把 Intel VT-x 或 AMD-V 打开这是硬条件绕不过去。接下来是 Windows 的两个可选功能。以管理员身份打开 PowerShelldism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart或者用 PowerShell 原生命令Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux -All Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -All两条命令分别对应适用于 Linux 的 Windows 子系统和虚拟机平台。第二个是 WSL2 的硬依赖少了它wsl --set-default-version 2会直接报错。全部执行完之后重启一次不要图省事跳过组件状态的刷新必须重启才生效。注意如果你机器上同时装着 VMware启用了虚拟机平台之后VMware 的版本要跟上老版本会提示冲突。新版 VMware 已经能共存但需要在设置里确认相关兼容选项是打开的不然会出现虚拟机启动失败。2.2 WSL 本体升级卡住时的几种处理方式组件开完之后装 WSL 本体。Windows 11 较新的版本已经内置了 WSL直接升级即可wsl --update如果这条命令下载卡住、进度条半天不动可以加参数让它走网络下载通道而不是走商店分发wsl --update --web-download--web-download这个参数很多人不知道但在更新不动的时候往往有奇效因为它跳过了商店那条链路。如果还是慢另一条路是去 WSL 的官方发布页下载离线安装包微软现在提供的是.msi格式形如wsl.2.x.x.x64.msi用浏览器下好之后双击安装安装完再执行一次wsl --version确认版本号。这条路的好处是断点续传和下载工具都能用上比命令行里干等靠谱。想用预览版的新特性比如后面会提到的 mirrored 网络模式、wsl --manage这些可以加--pre-releasewsl --update --pre-release用不用预览版看个人习惯。我自己的原则是主力开发机跟着稳定版走折腾新功能的机器才上预览版因为预览版偶尔会引入一些诡异的挂载问题。2.3 默认版本、发行版清单与状态核对升级完后把默认版本锁到 2wsl --set-default-version 2然后核对一下当前状态wsl --version wsl --list --verbose wsl --statuswsl --list --verbose会把每个发行版的名称、当前状态、WSL 版本号列出来。这个命令后面会反复用到导入完 CentOS 之后要回来这里确认版本号是 2 而不是 1。如果发现哪个发行版被识别成版本 1可以单独转换wsl --set-version 发行版名 2转换过程是把整个文件系统重新打包如果原来的系统里东西多这一步会花点时间别中途关机。3. 亲手做一份 CentOS 的 rootfs 包这是整件事里最关键的一步。tar 包做得好不好直接决定导入之后是开箱能用还是进去就报一堆错。3.1 从容器镜像导出最稳的一条路如果你机器上有 Docker Desktop 或者别的能跑容器的环境这条路的操作非常短。先拉一个 CentOS 7 的最后版本镜像docker pull centos:7.9.2009然后创建一个容器但不启动它直接导出docker create --name centos7-tmp centos:7.9.2009 docker export centos7-tmp -o centos7-rootfs.tar docker rm centos7-tmp用docker create而不是docker run是因为docker export对已停止的容器同样有效没必要真的把它跑起来。导出的 tar 里顶层直接就是/bin、/etc、/usr这些目录这正是 WSL 需要的扁平结构。如果你要的是 CentOS Stream 9镜像地址换成docker pull quay.io/centos/centos:stream9 docker create --name cs9-tmp quay.io/centos/centos:stream9 docker export cs9-tmp -o cs9-rootfs.tar docker rm cs9-tmpCentOS 官方镜像早就从 Docker Hub 迁到了 quay.ioDocker Hub 上的centos仓库已经停止更新这一点务必注意别在一个不再维护的标签上浪费半天时间。3.2 官方 Docker 基础镜像 tar 与云镜像的取舍不想折腾 Docker 的话还有一条更直接的路CentOS 官方在镜像站上提供过专门给容器用的基础镜像 tar 包文件名一般形如CentOS-7-x86_64-Docker.tar.xz下载下来解压得到 tar可以直接喂给 WSL。这个包的体积很小几百 MB 级别好处是省掉了本地 Docker 这一环。代价是它的维护状态。CentOS 7 已经在 2024 年 6 月 30 日走完了整个生命周期官方镜像站的目录结构在这之后做过调整老链接失效是常事。所以如果你要下载建议从官方镜像站的目录里逐层点进去找而不是直接用一个不知道从哪抄来的深链接。遇到 403 或者 404基本就是这个原因不是你的网络有问题。至于云镜像GenericCloud 那种 qcow2 格式我不太推荐拿来直接做 WSL 的 rootfs。qcow2 是磁盘镜像格式里面是带分区表的完整磁盘需要先挂载再打包才能变成 rootfs中间多了一层转换还容易在权限和元数据上出问题。除非你有明确的定制需求否则别绕这个弯。3.3 打包环节几个决定成败的细节打包环节有几个坑我挨个说权限和属主必须保留。如果你是自己拿tar打包一个目录一定要带-p和--numeric-ownertar -cppf centos7-rootfs.tar --numeric-owner -C /path/to/rootfs .少了--numeric-owneruid/gid 会被解析成名字再重新映射像systemd-network这种在目标系统里不存在的账号就会全部变成数字或者干脆丢失进去之后一堆服务起不来。别忘了设备节点和符号链接的处理。rootfs 里/dev下的设备节点、/etc/localtime这种软链导出方式不对就会丢。用docker export的话这些都不用操心这也是我推荐它的原因之一。tar 要检查完整性再拿去用。从几 GB 的包里导入到一半失败是很崩溃的事先用tar -tf列一下内容确认能正常读取tar -tf centos7-rootfs.tar | head -n 20能看到/bin/、/etc/、/usr/这些顶层目录就说明结构对了。如果看到顶层是个centos7/之类的目录名那说明打包时多套了一层WSL 导进去会变成一个空壳进去后连/bin/bash都找不到。4. wsl --import 全流程与首次登录后的收尾配置包做好了导入本身是一条命令的事真正花时间的是导入之后的收尾。这一步决定了你是得到一个能用的系统还是一个只能看看的壳子。4.1 import 命令的参数逐个拆开看命令格式是这样的wsl --import 发行版名 安装位置 tar文件路径 [--version 2]实际用起来长这样mkdir D:\wsl\CentOS7 wsl --import CentOS7 D:\wsl\CentOS7 D:\wsl\img\centos7-rootfs.tar --version 2参数逐个说清楚发行版名自己起CentOS7、CentOS-Stream-9都行这个名字后面所有wsl -d 名字命令都要用起得短一点、别有空格能省很多事。安装位置会被当作这个发行版的家目录ext4.vhdx就生成在这里。这一条最要紧默认情况下 WSL 发行版都堆在 C 盘的用户目录下CentOS 的 yum 缓存、编译产物、Docker 镜像加起来很容易吃掉几十 GB。系统盘紧张的话第一次导入就指定到 D 盘或 E 盘别等 C 盘红了再迁移。tar 文件路径就是上一步做好的包。--version 2明确指定 WSL2。不写的话会跟随系统默认版本建议显式写出来避免以后切换默认版本把这个发行版带偏。导入完成后检查wsl -l -v能看到CentOS7且VERSION列是 2就算成功了。然后进去wsl -d CentOS74.2 建普通用户、开 sudo、指定默认登录身份第一次进去你一定是 root。日常开发不建议一直用 root 跑建个普通用户是标准动作useradd -m -G wheel dev passwd devCentOS 7 的/etc/sudoers里wheel 组那行默认是被注释掉的很多人卡在这里明明把用户加进了 wheelsudo 却还是提示不在 sudoers 里。解决方法有两种一是直接改 sudoerssed -i s/^#\s*%wheel\s\ALL(ALL)\s\ALL/%wheel ALL(ALL) ALL/ /etc/sudoers二是更稳妥的做法在/etc/sudoers.d/下单独建一个文件echo dev ALL(ALL) NOPASSWD:ALL /etc/sudoers.d/dev chmod 440 /etc/sudoers.d/devsudoers.d这种写法比直接改主文件安全升级系统时不会被覆盖也不会因为语法错误把整个 sudo 锁死。这个是吃过亏之后才改过来的习惯——一次 sed 手滑写错了sudoers整个系统的 sudo 全废掉只能靠 root 进去手动修。用户建好之后还要让 WSL 知道默认用谁登录。编辑/etc/wsl.conf[user] defaultdev改完退出在 PowerShell 里重启这个发行版wsl --terminate CentOS7 wsl -d CentOS7再进去时提示符就应该是dev主机名了。注意wsl --terminate只关这一个发行版wsl --shutdown是关掉整个 WSL 虚拟机改wsl.conf这类全局配置的时候两者都可以但只想让一个发行版重载配置时用--terminate更精准。4.3 wsl.conf 里那几个真正影响体验的开关/etc/wsl.conf是 WSL 侧的配置文件跟发行版内部的配置文件是两套东西写错了不会被 CentOS 报错只会静默不生效所以这里必须写准。下面这份是我常用的组合[boot] systemdtrue [user] defaultdev [network] generateResolvConftrue [interop] enabledtrue appendWindowsPathfalse几个开关分别解释一下systemdtrue是最容易被高估的一个。它要求 WSL 版本在 0.67.6 以上同时发行版自带的 systemd 版本也要够新。实测下来CentOS Stream 9 自带的 systemd 252 基本能正常拉起CentOS 7 自带的 systemd 219 版本偏老在 WSL 里成功率不高经常表现成起来一半、systemctl报连不上 dbus。所以如果你走的是 CentOS 7做好手动起服务的心理准备别在这上面耗太久。generateResolvConf控制 WSL 是否自动生成/etc/resolv.conf。默认是 true由 WSL 写好 DNS。如果你发现每次重启 DNS 配置都被冲掉、或者你想固定用某个 DNS就把它设成 false然后自己写/etc/resolv.conf。appendWindowsPathfalse这个我强烈建议关掉。默认情况下 WSL 会把 Windows 的 PATH 追加到 Linux 的 PATH 后面结果是which node、which python这类命令经常先命中 Windows 装的那一份报一堆奇怪的错。关掉之后命令冲突的概率大幅下降代价是没法直接在 WSL 里敲code、explorer.exe这类命令需要时可以写绝对路径或者自己加软链。另外要提醒一句网上不少老教程里写[boot] command...来自动执行启动脚本这个写法在新版 WSL 上已经不再生效了照着抄会发现脚本压根不执行。别再在这上面浪费时间。4.4 CentOS 7 停维之后必须做的 yum 源迁移CentOS 7 停止维护之后原来的mirrorlist地址会直接返回错误症状就是yum makecache一堆 404 或者Could not resolve host。迁移到 vault归档源是必须做的一步sed -i s|^mirrorlist|#mirrorlist|g /etc/yum.repos.d/CentOS-*.repo sed -i s|^#baseurlhttp://mirror.centos.org|baseurlhttp://vault.centos.org|g /etc/yum.repos.d/CentOS-*.repo yum clean all yum makecache第一条把mirrorlist注释掉第二条把baseurl从 mirror 改成 vault。这两条的顺序不能反先注掉 mirrorlist 才能让 baseurl 生效。如果你所在的环境访问 vault 也不顺畅可以把 baseurl 换成国内的镜像站很多高校和云厂商的镜像站都保留了 CentOS 7 的归档目录速度会好很多。这一步纯属下载加速不涉及任何系统改造。提示CentOS 8 的情况更特殊它比 7 更早停止维护源也要迁到 vault路径和 7 不一样别直接套用上面的命令。如果对新特性有需求建议直接上 CentOS Stream 9源是活的省掉这一整段折腾。5. 让 CentOS 在 WSL2 里真的能干活导入完成、源修好系统能装包了。但离好用还有一段距离网络、服务、文件互访这几块是每天都会碰到的。5.1 网络与 DNS为什么有时连不上外网WSL2 默认走 NAT 模式Linux 侧看到的默认网关是一个虚拟网卡地址。这时候有几种典型症状能 ping 通 IP但域名解析不了。这就是 DNS 的问题。先看/etc/resolv.conf的内容对不对如果是空的或者指向一个不存在的地址直接改掉nameserver 223.5.5.5 nameserver 119.29.29.29同时在/etc/wsl.conf里加[network] generateResolvConffalse防止下次启动又被覆盖。ping 不通网关。这个在 NAT 模式下挺常见宿主机侧的防火墙默认不回 ICMP属于正常行为不要以为网络坏了。判断网络是否正常用curl或者ping一个公网 IP 更准确ip route curl -I https://mirrors.aliyun.comip route看默认路由有没有curl看实际能不能出去这两条比 ping 网关有说服力得多。想要更接近原生网络的体验WSL 2.0 之后可以在 Windows 用户目录下建一个.wslconfig[wsl2] networkingModemirrored dnsTunnelingtruemirrored 模式让 WSL 直接镜像 Windows 的网络接口Linux 里看到的 IP 和 Windows 一致做局域网调试、起服务给同事访问会方便很多。dnsTunneling 让 DNS 查询走 Windows 的解析通道能解决一部分解析不到的问题。改完这两个配置要wsl --shutdown才会生效注意是 shutdown 不是 terminate因为这两个是虚拟机级别的设置。5.2 没有 systemd 时怎么把 sshd、redis 拉起来如果 systemd 起不来systemctl start sshd会直接报错。这时候得手动来。启动 sshdssh-keygen -A mkdir -p /run/sshd /usr/sbin/sshdssh-keygen -A是生成主机密钥很多人第一次起 sshd 失败就是缺这一步报错信息是no hostkeys available。/run/sshd这个目录在容器化的 rootfs 里可能不存在也要补一下。启动 redisredis-server /etc/redis.conf --daemonize yes加--daemonize yes让它后台跑。判断有没有起来用ps -ef | grep redis或者直接连一下redis-cli ping返回PONG就正常。关于 firewalld在 WSL 环境下它通常起不来因为它依赖 systemd 和 dbus。这其实不算坏事——WSL 的 Linux 默认只对本机可见端口暴露由 Windows 侧控制一般不需要额外的防火墙规则。如果你的场景确实需要端口控制用iptables直接加规则更实在。想省事的话可以把这些启动动作写进~/.bashrc的最后加个判断只执行一次if [ -z $WSL_SERVICES_STARTED ]; then /usr/sbin/sshd 2/dev/null export WSL_SERVICES_STARTED1 fi这种做法不优雅但足够实用很多人的开发机就是这么跑的。5.3 Windows 与 Linux 之间的文件互访WSL 会自动把 Windows 的盘挂到/mnt/下/mnt/c、/mnt/d直接就能访问。这是最方便的一点也是最容易踩坑的一点。核心原则只有一条代码和项目放在 Linux 侧的文件系统里不要放在/mnt/c下。原因是跨文件系统的访问要经过一层转换小文件密集的场景比如node_modules、.git、大量源码性能差距非常明显我做过的对比是同一个前端项目在/mnt/c下跑构建要几分钟挪到~/projects下只要几十秒。正确的操作方式是用\\wsl$从 Windows 侧访问 Linux 文件在资源管理器地址栏里敲\\wsl$\CentOS7\home\dev就能像访问共享目录一样浏览也能拖文件进去。想在资源管理器里快速打开当前位置在 WSL 里敲explorer.exe .就行前提是appendWindowsPath没关关了就用绝对路径/mnt/c/Windows/explorer.exe .。反向操作比如要把 Windows 上的某个安装包拷进 Linux用cp就够了cp /mnt/d/downloads/some-package.tar.gz ~/小文件用cp大目录建议先在 Windows 侧压缩好再拷跨文件系统的批量小文件操作会慢到让人怀疑人生。5.4 VSCode 接入、终端字体与中文环境VSCode 接 WSL 是我日常最常用的组合。装好 Remote Development 扩展包后在 WSL 里进到项目目录敲code .VSCode 会自动在 Windows 侧打开并且把整个工作区挂在 WSL 里终端、调试、扩展全部跑在 Linux 侧。对非商店来源的自定义发行版也就是我们自己导入的 CentOSRemote-WSL 同样支持只要在左下角的远程连接列表里能看到CentOS7就行。如果连的时候报your version of Windows Subsystem for Linux is too old说明 WSL 本体版本低于扩展要求的下限回去执行wsl --update --web-download升级一下重启 VSCode 即可不用重装扩展。中文显示这块在 CentOS 7 里要单独处理默认是没有中文语言包的yum install -y langpacks-zh_CN没有 systemd 的情况下localectl用不了直接写配置文件echo LANGzh_CN.UTF-8 /etc/locale.conf重启这个发行版后date输出里就能看到中文了。终端字体是我个人比较在意的一点。默认的等宽字体中英混排时字重不统一看着很跳。近几年我一直在用Sarasa Term SC更纱黑体这一类中英文对齐的等宽字体中文和英文的宽度比例合适写代码时注释和代码的节奏感一致纯英文场景下 JetBrains Mono、Cascadia Code 也都很舒服。字体装在哪一侧无所谓Windows Terminal 和 VSCode 都可以直接指定 Windows 侧安装的字体名不需要在 Linux 里再装一遍。6. 磁盘占用扩容、瘦身与删了文件空间没回来WSL2 的磁盘模型和传统虚拟机不一样不理解这一点很容易在 C 盘爆红的时候手足无措。6.1 先搞清楚 vhdx 和文件系统的关系WSL2 每个发行版的系统盘就是一个ext4.vhdx文件放在你 import 时指定的那个安装目录里。它有几个特性动态增长用多少长多少不会一上来就占满。不会自动收缩这是最关键的一条。你在 Linux 里rm -rf删掉 20 GB 文件df -h立刻显示空间回来了但ext4.vhdx在 Windows 侧的大小纹丝不动。有上限默认有最大尺寸限制用wsl --manage 发行版名 --resize可以调整。所以Linux 里空间够用、Windows 上 C 盘还在涨是正常现象不是出 bug 了。6.2 扩容的两种做法先看当前情况df -h / lsblk如果df显示根分区快满了先扩容虚拟盘WSL 2.0 以上wsl --manage CentOS7 --resize 200GB这个操作只能往大了调不能缩小所以要一次想清楚。执行完成后进到 Linux 里看文件系统有没有自动跟上df -h /如果没跟上手动扩一次文件系统。在 WSL2 里根文件系统通常直接挂在整块设备上df显示的设备名形如/dev/sdd没有分区号所以直接对设备做resize2fssudo resize2fs /dev/sdd设备名一定要以你自己df -h /看到的为准不要照抄。对错误的设备执行resize2fs是有风险的动手前先确认清楚。6.3 空间回收与迁移到别的盘空间回收的标准流程是先彻底关掉 WSL再用 diskpart 压缩虚拟盘。wsl --shutdown然后以管理员身份打开 diskpartselect vdisk fileD:\wsl\CentOS7\ext4.vhdx attach vdisk readonly compact vdisk detach vdisk exit顺序不能乱必须attach vdisk readonly之后才能compact vdisk压缩完记得detach vdisk不然文件会被一直占用。压缩之前 Linux 侧最好把没用的东西清一清比如yum clean all、清空~/.cache这样压缩效果才明显。我有一次偷懒没清缓存就压缩几 GB 的包缓存被算进已使用里白压了一场。迁移到别的盘有两条路。WSL 2.0 以上直接wsl --manage CentOS7 --move E:\wsl\CentOS7老版本用导出导入的方式wsl --export CentOS7 D:\backup\centos7-backup.tar wsl --unregister CentOS7 wsl --import CentOS7 E:\wsl\CentOS7 D:\backup\centos7-backup.tar --version 2导出这一步顺便也是个好习惯——改配置之前先导出备份。wsl --export出来的 tar 就是完整的系统快照搞坏了重新 import 一次就行比重装快得多。尤其是折腾 yum 源、systemd 这类容易把系统搞乱的操作之前先导出一次心里踏实。7. 踩坑实录几个最容易卡住人的报错前面讲了怎么做对这一节讲讲做错之后长什么样以及排查的顺序。7.1 import 之后进不去或一进去就退症状是wsl -d CentOS7敲下去窗口闪一下就没了或者直接回到 PowerShell 提示符。排查按这个顺序走先看列表状态。wsl -l -v里如果状态一直是Installing说明导入还在进行大包导入慢是正常的等一等。确认 tar 结构。用tar -tf xxx.tar | head -n 20看顶层是不是直接就是bin/、etc/。多套了一层目录是最常见的原因。换启动命令试。wsl -d CentOS7 -e /bin/bash或wsl -d CentOS7 -u root -e /bin/sh。能进去说明 rootfs 本身没问题问题出在默认用户或初始化脚本上。看/etc/passwd里有没有默认用户。如果wsl.conf里指定了defaultdev但/etc/passwd里根本没这个用户WSL 会启动失败。这是导入之后先建用户、再改wsl.conf的顺序不能反的原因。另一个高频问题是权限。用tar手工打包时忘了--numeric-owner/usr/bin/sudo的 setuid 位丢了表现是sudo: effective uid is not 0这时候用 root 进去chmod us /usr/bin/sudo补回来就行。7.2 yum 报错与时间漂移yum 相关的报错百分之八十是源的问题。按这个顺序排查报 404源地址指向了已经不存在的路径按 4.4 节迁到 vault 或国内镜像。报Could not resolve hostDNS 问题回到 5.1 节。报 GPG 校验失败多半是源的 key 没导入rpm --import一下对应的 GPG key 文件。报another app is currently holding the yum lock上一次 yum 没退干净rm -f /var/run/yum.pid清掉锁再试。还有一个不那么显眼但很烦人的问题时间漂移。WSL 的虚拟机在宿主机休眠再唤醒之后Linux 侧的时钟有时会偏掉表现是https请求报证书过期、或者yum报时间戳错误。修法很简单sudo hwclock -s如果这个命令不可用手动同步一下date -s $(date)或者干脆wsl --shutdown重启一次虚拟机时间会自动跟宿主机对齐。这个问题我遇到过好几次一开始以为是证书出了问题查了半天才反应过来是时钟。7.3 版本过旧类报错的处理顺序热词里提到的WSL 版本过旧以及各种工具在连 WSL 时报的版本错误本质上是同一类问题。处理顺序建议固定下来wsl --version看当前版本号。wsl --update --web-download升级。升级不动去官方发布页下载.msi离线包手工安装。装完重启终端和编辑器再确认wsl --version。还是不行检查 Windows 是不是有一直挂着没装的系统更新某些 WSL 功能对 Windows 版本有硬性要求。最后说一个小习惯把 WSL 的相关配置和导入命令整理成一个脚本放在仓库里。因为从 rootfs 制作、import、建用户、写wsl.conf到迁移 yum 源这一整套流程重复做第二次的时候你绝对不想再从头回忆一遍每个参数。我自己那份脚本前后改了七八版每次遇到新坑就往里加一行注释现在给同事搭环境基本是十分钟搞定。这比写一篇使用文档管用得多。
返回列表