
前阵子帮同事在他那台Windows 11笔记本上搭开发环境进去一看虚拟机里躺着个CentOS 7卡得风扇狂转。我问他为什么不用WSL他说“我要跑的服务只给RHEL系写了安装文档WSL里都是Ubuntu不敢换”。这几乎是很多人都会踩的误区——WSL并不是只能装UbuntuRocky Linux同样可以跑得很好。我这段时间正好把本地开发环境从Ubuntu切到了Rocky Linux把从零安装、固定IP、开systemd、装CUDA、配Docker这一整套都折腾了一遍这篇文章就把完整过程写出来给需要在WSL里使用Rocky Linux的朋友做个参考。1. WSL Rocky Linux 这套组合到底解决了什么先说清楚一个很多人没想明白的问题你为什么要在Windows的WSL里装Rocky Linux我自己的场景是这样的工作用的服务器全是RHEL系本地开发却长期用Ubuntu。表面上没问题但一旦涉及dnf参数、rpm包依赖、或者给客户写部署脚本apt和dnf之间的细微差异就开始捣乱。最典型的一次我本地写好的Dockerfile里用了apt-get install部署到RHEL服务器上直接报错。环境不一致带来的问题往往在交付那一刻才暴露。Rocky Linux是RHEL的下游重建版包管理、目录结构、SELinux策略都和生产环境保持一致。在WSL里装一个Rocky Linux等于把你日常开发放进一个和线上几乎一致的环境里调试完直接打包上服务器踩坑率会低很多。再一个常见需求是“临时评估”。总有那么些软件只提供RHEL系的安装文档甚至只给rpm包。以前为了跑通安装流程得专门开一台虚拟机现在WSL里导入一个Rocky Linux两条命令搞定用完直接删实例都不影响Windows主系统。那为什么不直接用虚拟机或者双系统对比一下就清楚了。方案启动速度内存占用图形界面与Windows文件互访适合场景双系统要重启很慢独占整机完整桌面读NTFS要装工具需要完整硬件性能虚拟机1-3分钟2-4GB起步完整桌面共享文件夹需要完整内核、自定义模块WSL2秒级按需增长WSLg可用直接访问/mnt/c日常命令行、开发、容器裸Linux容器秒级很轻无依赖宿主已有Docker环境WSL2不是传统虚拟机概念它更像一个由Windows管理生命周期的轻量Linux运行时。你可以把它当成一个随开随用的开发环境不用了执行wsl --shutdown内存就释放了。这对只有16G内存的笔记本非常友好。还有一个容易忽略的点WSL2对systemd的支持已经成熟。我可以用systemctl管理httpd、dockerd这些服务启动行为跟真机几乎没有区别。Rocky Linux本身就是RHEL系systemd是天然组件两者配合得很稳。如果你还在用WSL1那我建议尽早换到WSL2后面所有步骤都基于WSL2展开。2. 装之前先把WSL这层地基夯实2.1 两个Windows功能必须开启很多人的WSL装到一半报错问题不在WSL本身而是Windows平台功能没开。管理员身份打开PowerShell依次执行dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart第一个是WSL主体第二个是虚拟机平台。两个都开完需要重启。重启后再看一眼BIOS里的虚拟化是否打开Intel是VT-xAMD是SVM。这一步经常被忽略尤其是一些品牌机的BIOS默认把虚拟化关了。如果后面启动WSL时报VIRTUALIZATION NOT ENABLED或者各种不明原因的创建虚拟机失败先进BIOS排查。重启后回到PowerShell设置默认版本并确认状态wsl --set-default-version 2 wsl --status wsl --version如果能正常输出WSL版本信息说明WSL本体已经就绪。注意wsl --version这个命令是老版本没有的如果提示找不到命令先执行wsl --update把WSL升级到新版。2.2 WSL1还是WSL2这个选择不用纠结WSL1和WSL2的差别可以简单理解成WSL1是一个翻译层把Linux系统调用翻译成Windows调用好处是启动快、跨文件系统性能好WSL2则是一个真正的精简虚拟机里面跑着完整的Linux内核兼容性大幅提升。对Rocky Linux来说答案非常明确选WSL2。原因有三Rocky的系统组件很多依赖完整内核特性WSL1的翻译层跑不了。Docker需要真正的Linux内核来跑容器WSL1下只能用Docker Desktop的虚拟机兜底。systemd在WSL1下支持不完整而RHEL系的核心服务管理全靠systemd。所以如果你以前用过WSL1别犹豫直接切到WSL2。执行上面那条wsl --set-default-version 2即可。2.3 为什么你的wsl --install会卡住怎么绕过去很多网络环境下执行wsl --install会长时间卡在“Downloading”阶段或者下载到一半失败。原因是WSL的发行版安装包和内核更新都依赖微软CDN不同网络环境下的下载速度差别很大有些公司网络还限制了商店下载。遇到这种情况我的经验是两条路并行第一先试wsl --update --web-download这个参数会强制WSL通过Web方式下载内核更新而不是走商店通道经常能解决“商店下载永远0%”的问题。第二如果还是不行干脆绕开在线安装直接走手工导入rootfs的路线。这个方案我在下一章里详细展开它最大的优势是不依赖商店也不依赖网络下载速度只要有能访问的tar包就能装。3. Rocky Linux安装全过程从零到能开机3.1 路线A一条命令装完如果你的WSL版本较新且网络通畅官方商店已经上架了Rocky Linux。先看发行版列表wsl -l -o如果输出里能看到Rocky Linux直接执行wsl --install -d RockyLinux安装过程会自动下载并注册发行版之后进入系统就是root用户。这条路最省事唯一的问题是“列表里没有”和“下载太慢”遇到这两个问题就切到路线B。3.2 路线B手工导入rootfs离线也能装这个方案是我最推荐的因为它完全绕开了商店和CDN的依赖只要你能拿到一个Rocky Linux的rootfs或者容器镜像tar包什么网络环境都能装。第一步拿tar包。两个来源任选从Rocky官方下载容器基础镜像比如Rocky-Container-Base-9.x-x86_64-latest.tar.xz后缀是tar.xz需要先解压成tar。如果你本地有Docker也可以直接拉取容器镜像再导出docker pull rockylinux:9 docker create --name rocky9 rockylinux:9 docker export rocky9 -o rocky9.tar第二种方式更灵活因为你可以导出任意你想要的Rocky版本。第二步把tar文件放到一个固定目录建议规划好WSL的安装目录mkdir C:\WSL\RockyLinux wsl --import RockyLinux C:\WSL\RockyLinux C:\Users\你的用户名\Downloads\rocky9.tar --version 2第三步启动并验证wsl -d RockyLinux cat /etc/os-release uname -r看到Rocky的版本信息和WSL内核版本就说明装成功了。路线B还有一个额外好处你可以把tar包留存一份以后任何机器上要重建环境直接导入备份包比在线安装快得多。我通常会把装好并用过的环境再导出一份tar作为“黄金镜像”。3.3 第一次登录后的初始化配置手工导入的发行版有个特点默认只有root没有普通用户甚至可能没有sudo。这不安全日常操作也不该一直用root。按下面顺序初始化dnf install -y sudo passwd useradd -m -G wheel rocky passwd rocky echo rocky ALL(ALL) NOPASSWD: ALL /etc/sudoers.d/rocky创建好用户后退出当前窗口在PowerShell里用普通用户重新登录wsl -d RockyLinux -u rocky以后想省掉-u rocky参数可以在Rocky Linux的/etc/wsl.conf里加上默认用户配置[user] defaultrocky修改完执行一次wsl --terminate RockyLinux再进入就会直接用rocky用户登录了。到这里一个能用的Rocky Linux WSL环境已经立起来了。但直接拿它开发还差三个关键配置——换源、固定IP、开systemd。这三件事做得越早后面越省心。4. 装完先别急着用这三件事必须第一时间做4.1 把dnf源切成国内镜像Rocky Linux默认的软件源走的是官方CDN网络环境一般的话dnf install会非常折磨人。换源是装完系统后第一件要做的事。以清华镜像为例执行sed -e s|^mirrorlist|#mirrorlist|g \ -e s|^#baseurlhttp://dl.rockylinux.org/$contentdir|baseurlhttps://mirrors.tuna.tsinghua.edu.cn/rockylinux|g \ -i.bak /etc/yum.repos.d/rocky*.repo然后清缓存并更新dnf clean all dnf makecache dnf update -y这里有个容易踩的坑Rocky 9的repo文件叫rocky.repo但Rocky 8的repo文件名是以Rocky-开头的大写格式如果你在Rocky 8上执行上面的通配符rocky*.repo一个文件都匹配不到。建议先ls /etc/yum.repos.d/看一下实际文件名再调整通配符。换完源之后dnf install速度会有明显提升。顺手把EPEL源也装了Rocky默认仓库里没有EPEL很多软件包要装了EPEL才能找到dnf install -y epel-release4.2 固定IP的两种现实方案WSL2默认采用NAT网络模式每次重启实例虚拟机内部的IP地址都可能发生变化。我一开始就踩了这个坑在WSL里跑了一个服务Windows浏览器用localhost访问没问题但局域网里其他设备要访问这个服务时IP一重启就变非常头疼。方案一镜像网络模式推荐Windows 11 22H2以上版本配合较新的WSL可以直接在Windows用户目录下的.wslconfig文件里启用镜像网络在%UserProfile%下新建或编辑.wslconfig[wsl2] networkingModemirrored然后在PowerShell里执行wsl --shutdown重新启动Rocky Linux。这个模式下WSL会共享Windows的IP地址不再有“WSL内部IP”和“Windows IP”不一致的问题局域网访问、端口映射都简单了。方案二传统NAT下手动绑定静态IP如果你用的Windows版本不支持镜像网络或者因为某些原因必须保留NAT模式可以写一个初始化脚本固定IP#!/bin/bash ip addr flush dev eth0 ip addr add 172.22.16.100/20 dev eth0 ip route add default via 172.22.16.1 echo nameserver 8.8.8.8 /etc/resolv.conf问题是172.22.16.0这个网段是WSL2每次启动时在Windows侧动态分配的你脚本里写死的IP段必须和当前实际网段一致不然会直接断网。所以这个方法只适合熟悉网络配置的进阶玩家新手老老实实用镜像网络模式。4.3 打开systemd让它真正像一个Linux服务器新版WSL默认不开启systemd你需要手动打开。在Rocky Linux里编辑/etc/wsl.conf[boot] systemdtrue保存后回到PowerShell执行wsl --shutdown再重新进入Rocky。验证是否生效systemctl list-units --typeservice --staterunning能列出正在运行的服务就说明systemd已经接管了。这一步对Rocky的用户来说格外重要因为RHEL系的操作习惯全是围绕systemd展开的——systemctl enable --now httpd、systemctl status docker这些命令在没开启systemd的WSL里全部不可用。顺便说一句/etc/wsl.conf和Windows侧的.wslconfig是两个不同层面的配置文件很多人会搞混。简单记忆.wslconfig在Windows用户目录下管的是WSL全局行为wsl.conf在发行版Linux里管的是单个发行版的行为。改完都要执行wsl --shutdown重启WSL实例才生效。5. 高频场景实录CUDA、LibreOffice、Docker、VS Code挨个过一遍5.1 在Rocky WSL里装CUDA千万别装Linux驱动WSL2一个很大的卖点是支持GPU加速。NVIDIA在WSL2里通过GPU-PV机制让Linux侧直接复用Windows侧的GPU驱动。这意味着你绝对不要在WSL里再装一遍NVIDIA Linux驱动否则轻则dkms编译失败重则整个图形栈崩掉。正确做法是Windows侧安装最新NVIDIA驱动然后进入Rocky Linux只装CUDA Toolkit本身dnf config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel9/x86_64/cuda-rhel9.repo dnf clean expire-cache dnf install -y cuda-toolkit-12-4装完验证nvcc --version如果能看到CUDA版本号就已经可以跑PyTorch或者TensorFlow的GPU版本了。特别提醒国内网络环境下从NVIDIA仓库下载可能很慢建议找一个网速稳定的时间段执行或者提前下载好rpm包离线安装。5.2 LibreOffice老包安装有时候会碰到软件官方只提供RHEL系rpm包的情况比如热搜词里那个LibreOffice_7.4.7.2_Linux_x86-64_rpm。如果你的业务需要在WSL里装这类软件流程其实很简单tar -xf LibreOffice_7.4.7.2_Linux_x86-64_rpm.tar.xz cd LibreOffice_7.4.7.2_Linux_x86-64_rpm/RPMS dnf localinstall *.rpmdnf localinstall会解析本地rpm包之间的依赖关系。如果报缺少某个系统库比如libXinerama、libcairo直接用dnf install装对应包再重试就行。至于要不要在WSL里跑LibreOffice的图形界面看你的需求。Windows 11下新版WSL支持WSLg直接运行soffice就能弹出界面不需要配X Server。5.3 Docker集成WSL2里跑Docker已经很成熟了。在Rocky Linux里安装Docker CEdnf config-manager --add-repo https://download.docker.com/linux/rocky/docker-ce.repo dnf install -y docker-ce docker-ce-cli containerd.io systemctl enable --now docker这里有个细节值得注意如果是手工导入的rootfs没有开启systemd之前你只能手动用dockerd命令硬启Docker守护进程非常别扭。这也是我坚持让大家先配置wsl.conf里systemdtrue的原因——RHEL系软件的操作逻辑都已经默认systemd了。5.4 VS Code Remote连接Windows上用VS Code连WSL几乎是零成本。安装VS Code后在扩展市场安装“Remote Development”扩展包然后进入Rocky Linuxcode /home/rocky/myproject第一次运行会在Linux侧自动下载VS Code Server这个下载过程和WSL本身更新一样网络不好时也可能会卡很久。如果卡住了先检查.vscode-server目录是否部分下载清掉重试或者配置代理环境变量。这里多说一句很多人用VS Code连接WSL后喜欢直接把项目放在/mnt/c/下也就是Windows文件系统里。这样做的后果是跨文件系统IO性能非常差编译大项目时尤其明显。我的习惯是项目文件放在Linux文件系统里比如~/projects需要和Windows交换文件时再通过共享目录或git同步。6. 我踩过的坑五个典型报错和处理方式6.1 wsl --install 提示403这个我看到不少人在问。执行wsl --install直接被拒绝错误码403。我遇到这个问题的场景是公司域控电脑组策略限制了商店访问WSL的发行版下载通道被拦住了。处理方式很简单放弃wsl --install直接走3.2节的手工tar导入流程。先用dism.exe开启WSL主体功能再wsl --update升级WSL核心最后wsl --import导入Rocky rootfs整个过程完全不依赖商店。6.2 启动WSL2时报error_file_not_found这个报错的上下文一般是旧版WSL升级到WSL2或者刚在BIOS里开启虚拟化后启动发行版时出现wsl/service/createinstance/createvm/hcs/error_file_not_found。排查链路如下先把vmcompute服务状态查出来正常情况下应该是RunningGet-Service vmcompute Get-Service LxssManager如果服务是手动或停止状态使用管理员PowerShell设置并启动Set-Service vmcompute -StartupType Automatic Start-Service vmcompute然后执行wsl --shutdown重试。还不行的话大概率是“虚拟机平台”功能虽然显示开启但WSL2内核没有正确安装。重新更新内核wsl --update --web-download我排查这个问题的经验是先服务、后内核、再重启按这个顺序能解决90%的情况。6.3 删除文件后ext4.vhdx不释放磁盘空间WSL2的Linux文件系统存储在一个ext4.vhdx虚拟磁盘文件里它的特点是只增不减。你删除大量文件后Windows端的ext4.vhdx体积纹丝不动C盘空间越来越少。最省事的处理方式是让WSL进入稀疏模式wsl --manage RockyLinux --set-sparse true这条命令会告诉WSL虚拟磁盘按需占用空间不再预分配全部容量。但要注意它只对设置之后的写入生效已经膨胀的空间需要手动压缩。手动压缩的方法要熟练一下先wsl --shutdown然后以管理员身份打开diskpartdiskpart select vdisk fileC:\WSL\RockyLinux\ext4.vhdx attach vdisk readonly compact vdisk detach vdisk exit压缩完成后C盘会立刻多出几个GB空间。这个操作用于任何WSL发行版不只是Rocky。6.4 wsl --update下载慢或卡住WSL内核包更新慢是常态。wsl --update默认走商店或微软CDN网速不佳时常常长时间没有进度。两个处理办法第一用wsl --update --web-download强制走Web通道有时会比商店通道快很多。第二如果Web通道也慢可以直接访问微软官方WSL release页面手动下载最新的WSL安装包msi格式双击安装。这个方法在离线或受限网络环境下最靠谱下载一次以后其他机器也能复用安装包。6.5 从Ubuntu切到Rocky后的小毛病最后聊一个很多人都会遇到的问题用惯了Ubuntu切到Rocky以后各种不适应第一反应是吐槽这系统“反人类”。其实有几个关键差异提前知道就能少踩坑没有apt包管理命令是dnf对应关系大致是apt install等于dnf install、apt update等于dnf makecache、apt upgrade等于dnf upgrade。很多软件包名不一样。比如装开发工具组Ubuntu是build-essentialRocky是dnf groupinstall Development Tools。Rocky 9默认没有装net-tools所以ifconfig、netstat这些命令都找不到要用ip addr、ss -lntp替代或者用dnf install net-tools补上。如果发现某些包怎么也找不到检查是否装了EPEL源这个源装了以后包的数量会多出一大截。这些差异不是坑是生态。适应两三天就会习惯毕竟dnf和yum的语法比apt要更贴近RHEL生产环境。我自己现在这台工作机的WSL里Rocky Linux已经连续跑了两个多月上面挂着Docker容器、定时任务脚本和一个内网小服务。固定IP用镜像网络模式解决后我在Windows浏览器、局域网手机端都能直接访问WSL里跑的服务日常开发几乎感觉不到它是个虚拟机。如果你也想搭一套贴近RHEL生产环境的本地开发环境这个组合值得一试。版本会更新命令也可能有细微变化但整体思路不会变——先把地基打牢后面所有事都顺。