
WSL 里装 Rocky Linux这事不像装 Ubuntu 那样一条wsl --install就完事因为微软商店里根本没有 Rocky 这个发行版。折腾过的人都知道第一步就会卡在 rootfs 获取上官方没有现成的 WSL 安装包网上流传的第三方包你又不敢随便用。我前前后后试了四五种方式最后才捋出一条稳定且不依赖 Docker Desktop 的完整链路。这篇就把整个流程从头到尾拆开讲包括环境检查、rootfs 导出、手工导入、系统初始化以及装完之后十个里有九个会遇到的问题——静态 IP、C 盘膨胀、启动报错、VSCode 连不上这类一并说清楚。这篇内容适合三类人一是公司统一用 Rocky Linux 做服务器本地开发想尽量贴近生产环境的人二是想把手头 Windows 电脑的默认 Ubuntu 换成更熟悉的 RHEL 系发行版的人三是之前装 WSL 时被各种奇怪报错劝退想找个完整排错思路的人。我会尽量把命令背后的逻辑也交代一下而不是让你复制粘贴完就完事。1. 装之前先想清楚你的 Windows 环境处于什么状态1.1 为什么说 WSL 1 和 WSL 2 的安装思路完全不同很多人一上来就敲wsl --install -d RockyLinux然后发现系统提示找不到这个发行版就开始怀疑人生。实际上 Rocky Linux 从来就不在微软商店的默认发行版列表里这条路从一开始就走不通。更关键的是你要先搞清楚自己电脑上现在的 WSL 是 1 还是 2因为后续导入 rootfs 的操作基本只对 WSL 2 友好。WSL 1 用的是系统调用翻译层没有真正的 Linux 内核文件系统布局和网络行为跟原生 Linux 差距很大很多 RHEL 系软件跑起来会有奇怪问题。WSL 2 则是跑在一个轻量虚拟机上有完整 Linux 内核Rocky Linux 在里面可以当正常服务器用。所以下面的所有流程都建立在 WSL 2 之上。在 Windows PowerShell 或 CMD 里跑这几条命令先把家底盘清楚wsl --status wsl --version wsl -l -vwsl --version输出里有内核版本号如果提示kernel version是 5.x 或 6.x说明已经是 WSL 2 时代的内核。wsl -l -v会列出所有已安装发行版及对应的 WSL 版本看 VERSION 这一列是不是 2。如果显示 1可以用wsl --set-version 发行版名 2做转换但转换过程偶尔会报错我建议是如果转换不顺利就直接重新导入一个干净利落。1.2 确认虚拟化已开启避免安装到一半报 CPU 不兼容WSL 2 依赖 Windows 的虚拟机平台功能而虚拟机平台又依赖 CPU 虚拟化。绝大多数近十年的 Intel/AMD 处理器都支持但 BIOS 里可能被关掉。进入 WSL 后如果看到类似Please enable the Virtual Machine Platform的提示多半就是这里出了问题。你可以打开“任务管理器 - 性能 - CPU”右下角能看到“虚拟化: 已启用”或“虚拟化: 已禁用”。如果显示禁用需要重启电脑进 UEFI/BIOS找到 Intel VT-x 或 AMD SVM 选项并打开。这一步没法用命令绕过去物理机不支持虚拟化的话 WSL 2 基本没戏。如果只是说虚拟机平台功能没开可以管理员身份打开 PowerShell 执行dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart然后重启电脑。这两条命令分别负责 WSL 基础功能和虚拟机平台缺一不可。1.3 新版 WSL 的安装方式从微软商店换到命令行在比较新的 Windows 11 和 Windows 10 版本里推荐直接跑wsl --install它会自动帮你装好 WSL 内核、虚拟机平台并且默认安装 Ubuntu。如果你不想自动装 Ubuntu也可以加--no-distribution参数wsl --install --no-distribution只装 WSL 本体不装任何发行版。这样后面我们导入 Rocky Linux 时系统里不会多一个用不上的 Ubuntu。升级到最新版 WSL 有个常见坑直接执行wsl --update时如果网络不好会在下载阶段卡很久。这时候可以试试加一个参数wsl --update --web-download这个参数会从 GitHub 的发布通道直接下载安装包有时候比走微软服务器快不少。如果依然慢那也别死磕去微软官方文档里找 WSL 的 GitHub Release 页面手动下载最新版.msixbundle文件然后双击安装也行。2. 获取 Rocky Linux rootfs三种方式对比与我的推荐2.1 为什么先要把 rootfs 搞到手WSL 导入发行版的核心动作是wsl --import一个 Linux 根文件系统归档rootfs tar 包。微软商店里的 Ubuntu、Debian、Kali 之所以一条命令就装好是因为商店自动帮你处理了这一步。Rocky Linux 没人帮你做包装所以只能拿到 tarball 后手动导入。rootfs 的本质是 Linux 根目录的一份快照包含/etc、/usr、/var等目录结构但不包含内核。WSL 2 会用自己的内核去启动这个文件系统所以 rootfs 不需要打包内核这一点适合用容器镜像的方式获取——容器镜像本质上就是一套最小化的根文件系统。2.2 方案一用已有的 Ubuntu WSL 导出 Rocky 容器镜像最推荐这个方法的前提是你电脑上已经有一个能正常跑的 WSL 发行版比如 Ubuntu。思路是在这个 Ubuntu 里安装一个轻量容器工具拉取官方rockylinux镜像然后用export导出文件系统。具体命令如下假设已经在 Ubuntu WSL 里sudo apt update sudo apt install -y docker.io sudo service docker start sudo docker pull rockylinux:9这里如果拉取镜像超时大概率是 Docker Hub 访问问题。可以给 Docker 配置一个国内可用的镜像加速器通常镜像站地址是https://docker.m.daocloud.io这类在/etc/docker/daemon.json里填上registry-mirrors数组然后sudo systemctl restart docker。镜像拉下来之后用一个临时容器导出文件系统sudo docker create --name rocky9 rockylinux:9 sudo docker export rocky9 -o /mnt/c/temp/rockylinux-rootfs.tar sudo docker rm rocky9docker create不启动容器只是把容器写到磁盘上。docker export的作用是把容器当前的文件系统导出成 tar这里要强调的是导出结果只包含实际文件不含镜像历史分层信息干净利落正好适合 WSL 做 rootfs。最后把 tar 放到/mnt/c/temp/也就是 Windows 的C:\temp\方便在 Windows 侧操作。我特别推荐这个方案因为全程用的是官方镜像可信度最高而且不需要在 Windows 上装 Docker Desktop对只想在 WSL 里跑 Rocky 的轻量用户来说负担最小。2.3 方案二借助 Windows 上的 Docker Desktop 导出如果你电脑上已经装了 Docker Desktop并且后端用的是 WSL 2那可以完全跳过 Ubuntu 里的配置直接在 Windows PowerShell 里执行docker run --name rocky9 rockylinux:9 docker export rocky9 -o C:\temp\rockylinux-rootfs.tar docker rm rocky9这个方式更直接但前提是你已经在 Windows 侧搭好了 Docker 环境。平时不搞容器开发为了装一个 WSL 发行版去装整套 Docker Desktop 属于杀鸡用牛刀所以这个方案只作为备选。2.4 方案三下载第三方现成 rootfs 包不推荐但值得了解网上确实有人发布编译好的 Rocky Linux WSL rootfs tar 包下载下来直接wsl --import省时省力。但我个人非常不建议在生产或长期开发环境用这种方式因为你无法确定打包者塞了什么额外东西进去也无法验证文件完整性和原始来源。万一里面被塞了奇怪的公钥或后门脚本等你发现的时候可能已经跑了好几个月。如果一定要用至少要检查两件事一是文件是否提供 SHA256 校验值且校验值和官方渠道能对应二是导入后先不要做任何敏感操作用rpm -qa看看系统里装了哪些包用cat /etc/passwd看看有没有可疑用户。不过说实话自己导出一次也就几分钟完全没必要冒这个风险。3. 手工导入 Rocky Linux 并完成首次启动3.1 wsl --import 的正确用法和路径规划拿到 rootfs tar 之后在 Windows PowerShell 里执行wsl --import RockyLinux C:\WSL\RockyLinux C:\temp\rockylinux-rootfs.tar三个参数分别是发行版名称、安装目录、rootfs tar 路径。第一个参数RockyLinux是以后wsl -d RockyLinux时用的名称大小写敏感第二个参数会决定这个发行版的虚拟磁盘文件存在哪强烈建议不要装在 C 盘默认路径下因为后面虚拟磁盘会长大C 盘本来就不宽裕的话很容易被撑爆。我习惯把所有 WSL 发行版统一放在如C:\WSL\RockyLinux这样的独立目录下既方便备份也方便以后迁移。导入完成后系统会自动创建ext4.vhdx虚拟磁盘文件这就是整个 Rocky Linux 的文件系统容器。顺带说一句如果这个命令执行完没有任何输出不代表失败。直接跑wsl -d RockyLinux进去看看。3.2 首次启动你先看到的是 root这不是偶然导入成功后进入系统wsl -d RockyLinux你会发现当前用户是 root而且很多基础工具没有。这是因为我们导出的容器 rootfs 遵循容器镜像的最小化原则没有创建普通用户也没装sudo、langpacks这类工具。这是正常的不是装坏了。接下来先做两件事安装基础工具创建日常用户。在 Rocky Linux 9 上包管理器是dnfdnf install -y sudo glibc-langpack-en langpacks-ensudo不用解释langpacks-en和glibc-langpack-en是为了让系统英文 locale 能正常工作避免后面一跑命令就刷一堆warning: setlocale的告警。如果你需要中文环境也把langpacks-zh装上但先建议保持英文 locale避免终端下中文字体乱码影响排查问题。创建日常用户useradd -m -G wheel -s /bin/bash rocky passwd rocky这里-G wheel把用户加进管理员组-s /bin/bash指定登录 shell。然后配置免密 sudo开发环境图方便可以用生产环境不建议echo rocky ALL(ALL) NOPASSWD:ALL /etc/sudoers.d/rocky chmod 440 /etc/sudoers.d/rocky最后创建/etc/wsl.conf告诉 WSL 以后默认使用这个用户同时开启 systemd[boot] systemdtrue [user] defaultrocky然后退出 WSL在 PowerShell 里重启发行版wsl --terminate RockyLinux wsl -d RockyLinux重新进去后whoami如果输出rocky说明默认用户配置成功。systemctl list-units --typeservice能看到一堆服务正常加载说明 systemd 也生效了。3.3 容器 rootfs 残留的两个小坑/dev 权限与默认 shell从容器导出有个比较隐蔽的问题容器内的/dev是容器运行时挂载的导出后里面可能残留一些没有意义的设备节点或某些目录权限过于严格。WSL 启动时会自己重新挂载/dev所以大部分情况不用管但如果后面跑dnf或安装某些软件时遇到/dev/pts相关报错可以先执行一次mount -t devpts devpts /dev/pts或者干脆重启 WSL让 WSL 重新初始化设备节点。另一个坑是默认 shell。容器环境里/bin/sh往往直接链接到bash但有的精简镜像会链到dash之类导致交互式体验很怪。建议安装完bash后直接检查一下ls -l /bin/sh如果指向的不是 bash用alternatives --config sh改回来。4. 装好之后要做的事换源、网络、存储、开发环境4.1 软件源必须换成国内镜像不然 dnf 慢到怀疑人生Rocky Linux 默认源指向dl.rockylinux.org在国内网络条件下速度不稳定尤其是第一次dnf check-update可能要磨蹭几分钟。换源是第一步。Rocky Linux 9 的源配置在/etc/yum.repos.d/下默认有一个rocky.repo。用国内镜像站提供的替换脚本最省事例如阿里云、清华 TUNA、中科大都提供了 Rocky 的镜像帮助页。以阿里云为例思路是下载它们提供的RockyLinux.repo覆盖默认文件curl -o /etc/yum.repos.d/RockyLinux.repo https://mirrors.aliyun.com/repo/rocky-9.repo更稳妥的做法是先备份原文件再替换。替换后不要直接跑dnf update先清除缓存dnf clean all dnf makecache如果makecache能快速完成源就换成功了。这时候再dnf update -y速度会有质的提升。4.2 网络问题为什么 IP 老变到底能不能设静态 IP这是 WSL 2 用户最常见的一个疑问。默认情况下 WSL 2 跑在一个 NAT 网络里每次 Windows 重启或 WSL 重启虚拟交换机会给发行版重新分配 IP。你在 Rocky 里ip addr看到的 IP过一会儿可能就变了。传统虚拟机里改/etc/sysconfig/network-scripts/ifcfg-eth0配置静态 IP 的做法在 WSL 2 里不可行因为整个网络是 Windows 侧的虚拟交换机控制的Linux 内自己改 IP 会导致路由错乱。解决办法分两种场景。场景一你只需要开发机自己能联网不要求外部设备访问 WSL 里的服务。那什么都不用改默认 NAT 就能用域名解析、外网访问都没问题。场景二运行 Windows 的同一台机器上访问 WSL 服务比如浏览器访问http://localhost:8080这种场景其实也不需要配 IP。WSL 2 有 localhost 转发机制Windows 上的 localhost 会转发到 WSL 内的对应端口。唯一要注意的是WSL 里监听服务的地址不能是127.0.0.1要监听0.0.0.0否则外部转发不进来。场景三局域网里的其他设备要访问 WSL 里的服务。如果你用的是 Windows 11 22H2 及以上版本最优雅的方案是在%USERPROFILE%\.wslconfig里开启 mirrored 网络模式[wsl2] networkingModemirrored dnsTunnelingtrue autoProxytrue firewallfalse设置完执行wsl --shutdown再重启。mirrored 模式会让 WSL 直接共享 Windows 的 IPWSL 里跑的服务会和 Windows 一样暴露在局域网不用再折腾端口转发。如果你的系统不支持 mirrored或者不想动那就只能用端口转发硬解。确认 WSL 的 IP 后用管理员 PowerShell 执行netsh interface portproxy add v4tov4 listenport8080 listenaddress0.0.0.0 connectport8080 connectaddress172.20.120.5 netsh advfirewall firewall add rule nameWSLPort8080 dirin actionallow protocolTCP localport8080注意connectaddress填的 IP 是 WSL 当时的 IP换了就要重新设置所以这种方案只适合临时调试。4.3 C 盘空间越用越小vhdx 瘦身与发行版迁移WSL 的虚拟磁盘文件ext4.vhdx有个特性往里面删文件并不会自动释放 Windows 侧的磁盘空间。比如你在 Rocky 里下载了一个 20GB 的数据集用完删了但ext4.vhdx还是占着 20GB。这是虚拟磁盘的常见行为需要手动压缩。压缩流程三步走。首先关掉 WSLwsl --shutdown然后用管理员 PowerShell 运行diskpartselect vdisk fileC:\WSL\RockyLinux\ext4.vhdx attach vdisk readonly compact vdisk detach vdisk exitcompact vdisk会把 vhdx 内部空闲块回收掉。如果文件本身很小但虚拟磁盘被撑大过这个操作能明显缩小文件体积。实测中一个曾经涨到 60GB 的 vhdx压缩后能回到 15GB 左右效果非常可观。如果你的磁盘空间已经彻底不够另一个思路是把整个发行版迁移到其他盘。最简单的方式是直接移动目录wsl --shutdown Move-Item C:\WSL\RockyLinux D:\WSL\RockyLinux移动后 WSL 会自动通过目录识别一般不需要额外操作。如果识别不了用wsl --unregister RockyLinux删除旧注册信息再重新 import 一次但那样会丢失所有配置和数据所以移动前一定要确认目录路径正确。4.4 VSCode 连接 Rocky LinuxRemote-WSL 的几个细节用 VSCode 连 WSL 是开发效率提升最明显的一步。先在 VSCode 里安装微软官方的Remote - WSL扩展。安装后在 WSL 终端里执行code .VSCode 会自动启动并连接到当前 WSL 发行版。这里有个容易踩的坑如果你的 Windows 上装了很多 VSCode 扩展它们不会自动在 WSL 侧生效需要在 WSL 连接窗口里重新装一份扩展。像 Python、Go、Shell 这类跟语言相关的扩展强烈建议装在 WSL 侧理由是 WSL 里的解释器和编译器和 Windows 侧是两套环境扩展乱装容易导致解释器路径混乱。文件互访方面WSL 里访问 Windows 文件走/mnt/c/Windows 里访问 WSL 文件可以在资源管理器地址栏输入\\wsl.localhost\RockyLinux\home\rocky。有个体验优化在 Rocky Linux 里创建~/win之类符号链接指向/mnt/c省去每次敲全路径。5. 高频报错与实战排错我把逐个踩过的坑捋一遍5.1 ERROR_FILE_NOT_FOUND启动时直接崩掉错误代码长这样错误代码: WSL Service CreateInstance CreateVm HCS ERROR_FILE_NOT_FOUND这个报错我遇到过两次两次都是因为虚拟磁盘路径对不上。最常见的原因是你手动移动了发行版目录但 Windows 注册表里记录的路径还是旧的。WSL 把发行版注册信息放在注册表HKCU\Software\Microsoft\Windows\CurrentVersion\Lxss下里面每个子键对应一个发行版BasePath字段指向目录。排查思路是先确认 vhdx 文件确实存在Test-Path C:\WSL\RockyLinux\ext4.vhdx如果文件不存在那可能是被误删只能重新导入。如果文件存在但依然报错可以去注册表检查BasePath是否和实际路径一致不一致就改回来。另外%USERPROFILE%路径下如果含中文字符旧版 WSL 也会触发类似的诡异错误解决办法是把安装路径放到纯英文目录。还有一个容易忽略的原因Windows 用户名本身就含中文导致默认发行版安装路径变成C:\Users\张三\AppData\Local\Packages\...。这种模式下问题更多建议直接把发行版放到自定义盘符根目录下避开用户目录。5.2 wsl --install 被禁止403怎么办有次在同事电脑上跑wsl --install直接返回“已禁止(403)”这是因为电脑处于公司域管理环境微软商店安装被策略拦截。这种情况不要尝试强行绕过安全策略正确做法是联系 IT 管理员开通权限或者走手动安装路线。手动安装的方式是从微软 WSL Release 页面下载.msixbundle安装包然后管理员 PowerShell 执行Add-AppxPackage -Path 下载路径\Microsoft.WSL_version_x64.msixbundleWSL 本体装好之后发行版用前面讲的wsl --import方式放进去完全绕开商店公司电脑也能正常用。5.3 WSL 里能启动但网络不通ping 外网全部超时第一次启动 Rocky 的容器 rootfs 时网络配置可能没有初始化。现象是ip addr能看到eth0但ping 8.8.8.8不通ping baidu.com也不通。一个常见原因是容器 rootfs 里没有network manager 或 dhcp clientsystemd 没把eth0的地址正确拉起来。先确认接口上有没有 IPip addr show eth0如果没有 IP 或显示DOWN手动拉起dhclient eth0如果能通说明问题在自动配置上。在开启了 systemd 的 WSL 里可以装NetworkManager后启用dnf install -y NetworkManager systemctl enable NetworkManager重启 WSL 后正常情况下 systemd 会自己管理eth0。如果想验证 DNS看一下/etc/resolv.conf如果内容为空或指向127.0.0.53但又不通可以在/etc/wsl.conf里加[network] generateResolvConf false然后手动写一个可用的 DNS 服务器。但这个方法会破坏 WSL 和 Windows 之间的 DNS 联动除非确有必要否则不推荐。5.4 延伸场景CUDA、Docker 与各种热门工具搜索热词里很多人在 WSL 上装 CUDA、Docker、LibreOffice、binwalk、ijkplayer 这些说明 WSL 已经不只是跑命令行的玩具了而是正经的 Linux 开发环境。这里简单说下在 Rocky Linux 上的注意点。CUDA 方面WSL 2 支持 GPU 透传但有两个条件Windows 侧必须装支持 WSL 的 NVIDIA 驱动且版本不要太旧Linux 侧要用 NVIDIA 提供的 RPM 仓库安装 CUDA Toolkit。Rocky Linux 用户不要从默认 dnf 源里找 CUDA版本通常很旧去 NVIDIA 官网选对应发行版和架构拿到仓库配置脚本执行后dnf install cuda即可。Docker 方面Rocky Linux 里编辑/etc/yum.repos.d/docker-ce.repo加官方仓库然后dnf install docker-ce启动systemctl enable docker --now再把当前用户加进docker组避免每次要 sudo。如果用 Docker Desktop 则反过来在 Docker Desktop 的 WSL 集成设置里勾选 RockyLinux让 Windows 侧统一管理容器环境。LibreOffice 那个安装包是 RPM 格式的下载解压后dnf install ./LibreOffice_7.4.7.2_Linux_x86-64_rpm/RPMS/*.rpm就能装注意必须用./以本地路径形式传给 dnf否则系统会去源里找同名包找不到。binwalk 这类工具更简单直接dnf install binwalk配合 WSL 的文件访问能力做固件分析非常顺手。至于编译 ijkplayer 这种大型 C/C 项目WSL 的优势体现得淋漓尽致Rocky Linux 作为编译宿主完全没毛病但记得先dnf groupinstall Development Tools把编译工具链补齐。6. 我的一些最终建议把这套环境当真正的 Linux 服务器对待WSL 里的 Rocky Linux 不是 Windows 上的一个小玩具它跑着完整的 systemd完全可以当一台真正的 Linux 服务器来开发、测试、部署。所以我给几个长期使用的建议。第一从一开始就把数据和工作目录放在/home下的独立用户目录里不要全堆在 root 下面。WSL 本身不反对你一直用 root但哪天你往生产环境迁移命令时会发现权限模型完全不一样习惯要养早。第二备份这件事不能被 WSL 的路径复杂度劝退。整个发行版其实就一个ext4.vhdx文件想备份的时候先wsl --shutdown然后把这个文件复制到移动硬盘就行比虚拟机备份简单一个量级。恢复时重新 import 那个 vhdx 文件即可或者可以直接用wsl --export导出成 tar 再wsl --import恢复。第三不要在 WSL 里的/etc/hosts或 Windows 的 hosts 文件之间反复横跳镜像网络和 DNS 隧道开启后域名解析基本是透明无缝的手动改 hosts 只会给自己埋坑。最后再分享一个小技巧如果你经常需要在 Rocky Linux 和其他 Windows 工具之间移动文件在 Rocky 里给/mnt/c设置快捷键似的别名是很爽的比如在~/.bashrc里加一条alias wincd /mnt/c再配合source ~/.bashrc就能随时一条命令切到 Windows 侧目录。这种小细节平时不起眼但连续一周高强度下来节省的时间是实打实的。WSL 装 Rocky Linux 这条路走通一次之后后续所有 RHEL 系相关的实验、服务调试、脚本验证就都有了稳定的落脚点值得你花一个下午完整配好。