
如果你跟我一样Windows 上还想要一套跟生产环境完全一致的 Linux 开发机那 WSL 2 Rocky Linux 这个组合值得认真折腾一次。WSL 2 提供完整 Linux 内核启动发行版基本秒开跟 Windows 文件系统互通Rocky Linux 则是 RHEL 的下游重建版本企业级稳定性、软件包管理习惯、目录结构都跟服务器环境一模一样。这篇文章是我从头到尾实操的记录包含环境准备、rootfs 导入、用户与 systemd 初始化、静态 IP 思路、软件源加速、VSCode 与 Docker 集成、GUI 应用安装以及各种踩坑现场。适合谁看想摆脱双系统反复重启、但日常又只跟 CentOS/RHEL 系打交道的运维或后端开发也适合想把 Windows 当成桌面、把 Linux 藏在 WSL 里随叫随到的朋友。跟着文章走最快十来分钟就能得到一个可以日常写代码、跑服务、甚至跑 LibreOffice 这类 GUI 应用的 Rocky Linux。1. 装之前必须确认的三件事版本、内核和网络1.1 Windows版本与WSL功能开关先确认你的 Windows 能不能跑 WSL 2。Win10 2004Build 19041以上或者 Win11 基本都没问题更早的系统建议先把补丁打全不然下面一堆命令会报“虚拟化相关错误”。以管理员身份打开 PowerShell执行两条命令dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart第一条开启“适用于 Linux 的 Windows 子系统”第二条开启“虚拟机平台”。两条命令执行完必须重启系统。这里我建议直接用命令行而不是图形界面里的“启用或关闭 Windows 功能”因为命令行输出里能看到每个步骤的成败排错方便很多。重启后在 PowerShell 里敲wsl --version如果显示版本号比如 2.x.x说明 WSL 组件正常。如果提示wsl needs updating your version of windows subsystem for linux (wsl) is too old说明本地还是老版本继续看下一节。1.2 升级到WSL 2别再用老内核WSL 1 和 WSL 2 最大的区别是WSL 1 是系统调用翻译层跑不了 systemdDocker 也兼容得不好WSL 2 是虚拟机里的完整 Linux 内核兼容性接近真实 Linux 主机。我们要装 Rocky Linux并且后面要开 systemd、跑 Docker必须上 WSL 2。执行wsl --set-default-version 2如果报错提示需要更新内核再执行wsl --update这个命令会从微软服务器拉取内核更新包实际体验中经常卡在“下载中”或者直接超时。我的做法是到微软官方 WSL release 页面下载对应的 MSI 离线安装包手动装完再执行wsl --set-default-version 2。离线包不影响后续任何功能比在线更新稳定很多。装完可以用wsl --status确认默认版本已经是 2。这里有一个关键点Win11 上执行wsl --update之后内核版本一般会到 5.15 以上这对后面开启 systemd 至关重要。如果内核版本太老/etc/wsl.conf里的[boot] systemdtrue是不会生效的。1.3 wsl --install 太慢、403、--list --online 连接超时的自救思路很多人在第一步就卡住在 Windows Terminal 里执行wsl --install -d RockyLinux结果要么一直转圈要么直接报已禁止(403)要么wsl --list --online连接超时。这里说下原因wsl --install -d的发行版列表来自微软在线商店接口商店接口在某些网络环境中被卡是常见现象不一定是系统本身有问题。自救方案有三个先执行wsl --update把 WSL 主体升级到最新版旧版组件确实会导致商店接口鉴权失败不依赖在线商店直接走离线安装方案把 Rocky 的 rootfs 手工导入也就是下一章要讲的重点如果还想用商店方式可以打开 Microsoft Store 应用本身搜一下 Rocky Linux但说实话 Rocky 在商店里的出现概率很低大部分时候列表里只有 Ubuntu、Debian、openSUSE、Kali、Alpine 这几家。所以对于 Rocky Linux 这种“商店里不一定有”的发行版学会手工导入 rootfs 反而是更通用的技能。接下来进入正题。2. 在WSL上安装Rocky Linux的三种可行方式2.1 如果商店里碰巧有一行命令装完先试最简单的方式。前提是你的 WSL 版本比较新而且wsl --list --online能顺利列出在线发行版。如果列表里恰好有 RockyLinux直接wsl --install -d RockyLinux这个命令会自动下载、注册发行版首次启动进入用户态初始化。不过我要提醒一句不同时期商店列表变化很大今天有不代表明天有店里没有也别失望Rocky 本来就不像 Ubuntu 那样是微软商店的常驻嘉宾。这个方法属于“碰运气”真正的通用做法还是往下看。2.2 最通用的方式导入Rocky Linux的rootfs这是整个安装过程最核心的一步。所谓 rootfs可以理解成一个 Linux 发行版完整文件系统的一层快照。WSL 可以把任何一个带可执行环境的 rootfs 打包成 tar再通过wsl --import挂进来变成一个 Windows 上的发行版实例。Rocky Linux 官方虽然没有直接给 WSL 安装包但官方提供了容器基础镜像我们只需要把镜像文件系统导出成 tar 就行。具体分两个阶段。第一阶段拿到 Rocky Linux 的 rootfs tar 包。如果你系统里已经装了任意一个 WSL 发行版比如 Ubuntu可以在这个发行版里面装 Docker 然后拉取官方镜像sudo docker pull rockylinux:9拉取完成后用docker create创建但不启动容器再用docker export导出文件系统CONTAINER_ID$(docker create rockylinux:9) docker export $CONTAINER_ID -o /mnt/c/wsl-rocky/rockylinux-9.tar这里要特别说明为什么用docker export而不是docker savesave保存的是带镜像层结构的打包格式import进去之后会多一层镜像元数据对 WSL 来说反而多余export会把容器文件系统直接平铺成普通 tar这正是wsl --import想要的格式。如果你不想为了导出 tar 专门装一个 Docker也可以直接从 Rocky 官方镜像站下载 rockylinux:9 的容器 rootfs 压缩包解压成 tar 后继续操作。两种方式得到的 tar 效果一样。第二阶段在 Windows 侧导入发行版。先把刚才生成的 tar 复制到 Windows 可访问的路径比如D:\wsl-rocky\rockylinux-9.tar。然后打开 PowerShell创建存放该发行版磁盘文件的目录mkdir D:\WSL\RockyLinux执行导入wsl --import RockyLinux D:\WSL\RockyLinux D:\wsl-rocky\rockylinux-9.tar --version 2参数含义分别是发行版名称、vhdx 虚拟磁盘存放位置、rootfs tar 路径、--version 2强制使用 WSL2。导入完成后直接wsl -d RockyLinux就能进入系统。此时你大概率是 root 用户包管理器可用但没有 systemd也没有默认普通用户。这些初始化工作放到第三章详细讲。2.3 进阶方案从Rocky ISO自建WSL镜像有人想从官方 ISO 做一个“绝对纯净”的 WSL 镜像步骤会麻烦不少先把 Rocky ISO 里的 squashfs 提取出来再用virt-builder或livecd-tools把 rootfs 导出成 tar最后走wsl --import。整个过程依赖不少 Linux 工具而且 Rocky 的 Anaconda 安装器不是为无头环境设计的制作周期长坑点非常多。我的观点是除非你有特殊的合规要求必须确认镜像内容完全由自己从 ISO 构建否则没必要从 ISO 做起。官方容器镜像已经足够“纯净”同样来自 Rocky 官方渠道更新源和包签名都没问题。2.4 三种方式对比怎么选安装方式复杂度是否官方适合场景商店在线安装极低是如果商店有普通尝鲜用户rootfs 导入安装中是容器镜像长期使用、可复现最推荐ISO 自建镜像高是特殊合规需求日常使用我都推荐 rootfs 导入既能固定镜像版本也能把 tar 包当作备份源重装系统后一条命令就能恢复。3. 装完之后的初始化用户、systemd、网络、软件源一个都不能少3.1 创建普通用户并设为默认rootfs 导入后的 Rocky Linux 默认只有 root日常开发用 root 不太安全也容易误删系统文件。第一步先创建一个带 sudo 权限的普通用户。进入 Rocky 后先装 sudosudo dnf install -y sudo创建用户并设置密码sudo useradd -m dev sudo passwd dev加入 wheel 组sudo usermod -aG wheel dev然后让 WSL 默认以 dev 用户进入。编辑/etc/wsl.conf[user] defaultdev保存后退出发行版在 Windows 侧执行wsl --shutdown再重新wsl -d RockyLinux就会直接以 dev 身份登录。如果提示 sudo 未授权检查/etc/sudoers.d/wheel里是不是把%wheel ALL(ALL) ALL这行注释掉了。3.2 开启systemdWSL2 从某个内核版本开始支持在发行版内启用 systemd这对 Rocky 这种 RHEL 系发行版太重要了。没有 systemd你装完 nginx 或者 docker 后只能用/etc/init.d/脚本或者手动起进程体验很差。启用方式编辑/etc/wsl.conf在文件末尾加[boot] systemdtrue然后wsl --shutdown重新进入执行systemctl is-system-running输出running或degraded都算成功degraded一般是有个别单元启动失败可以用systemctl --failed查看具体是哪个服务。如果这条命令提示找不到 systemctl说明你的 WSL 内核版本太老回到 1.2 节升级 WSL。这是我在新装的 WSL 上遇到最多次的问题内核版本不够配置文件写得再对也没用。3.3 网络与DNS静态IP到底怎么配这是热词里被问得最多的一个问题。WSL2 默认使用 NAT 模式发行版分到的 IP 地址172.x.x.x由 Windows 侧 Hyper-V 虚拟交换机动态分配每次重启可能变化。Rocky Linux 自带 NetworkManager但 WSL 的网卡本质是虚拟设备直接在里面nmcli con mod eth0 ipv4.addresses ...配静态 IP 通常无效因为地址分配由 Windows 的虚拟化层决定不是 Rocky 自己说了算。如果你确实需要一个固定的 IP 用于对外服务有几个思路Windows 11 22H2 及以上系统推荐开启镜像网络模式。在用户目录下创建.wslconfig文件[wsl2] networkingModemirrored重启 WSL 后WSL 内的网络直接共享宿主机的 IPWindows 和 Linux 在同一个网络平面里localhost两边互通。此时在 Rocky 里手工配静态 IP 反而不必要了。仍在 NAT 模式时如果要从 Windows 外部访问 WSL 里的服务可以使用端口转发。在 Windows 侧用netsh interface portproxy add v4tov4 listenport8080 listenaddress0.0.0.0 connectport8080 connectaddressWSL的IP同时在 Windows 防火墙放行 8080 端口。注意 WSL 的 IP 每次重启会变建议写个 PowerShell 脚本在开机时动态更新 portproxy。纯粹解决 DNS 解析不稳定先编辑/etc/resolv.conf临时测试nameserver 1.1.1.1如果确实有效再在/etc/wsl.conf里设置[network] generateResolvConffalse然后自行维护/etc/resolv.conf。这样可以避免 WSL 每次启动都重新生成一个默认 DNS 配置。3.4 更换Rocky Linux软件源Rocky 9 的 repo 默认指向dl.rockylinux.org默认网络环境下速度不一定理想。建议换成国内镜像站比如阿里云或清华。以 Rocky 9 为例先把仓库文件备份sudo cp -r /etc/yum.repos.d /etc/yum.repos.d.bak然后修改/etc/yum.repos.d/rocky.repo和rocky-extras.repo等文件把里面baseurl对应的地址域名替换成镜像站。比如baseurlhttp://dl.rockylinux.org/$contentdir/$releasever/BaseOS/$basearch/os/改成baseurlhttps://mirrors.aliyun.com/rockylinux/$contentdir/$releasever/BaseOS/$basearch/os/AppStream、Extras 等仓库同理。也可以用 sed 批量替换注意$需要转义sudo sed -i s|dl.rockylinux.org/\$contentdir|mirrors.aliyun.com/rockylinux|g /etc/yum.repos.d/rocky*.repo替换完成后执行sudo dnf makecache看到Metadata cache created就说明新源生效。如果你所在的公司或学校有自建镜像同理替换只要目录结构一致就能用。3.5 终端体验字体与Windows Terminal配置开发体验里字体影响非常大。很多人觉得 Windows Terminal 加 Linux 发行版敲代码没有 macOS 清爽大部分原因是字体没选对。我试过几轮最接近 macOS 默认等宽字体的方案是Cascadia Code微软官方字体自带连字Windows Terminal 默认支持风格比较圆润JetBrains MonoJetBrains 全家桶同款字间距舒服适合长时间看代码Meslo LGPowerlevel10k 主题推荐字体配合 zsh、oh-my-zsh 效果很好。在 Windows Terminal 的配置文件settings.json里找到 Rocky Linux 对应的 profile加一组font: { face: JetBrains Mono, size: 11 }安装字体后重启 Windows Terminal 就生效。WSLg 还支持直接在 WSL 里跑 GUI 程序下一章会用到字体同样会通过 WSLg 渲染。4. 把它当成日常开发机VSCode、Docker与GUI应用4.1 在VSCode中使用WSLRemote - WSLVSCode 对 WSL 的支持相当成熟。安装扩展Remote - WSL后在 Windows Terminal 里进入 Rocky Linux直接敲code .VSCode 会自动在 Windows 侧打开窗口右下角状态栏显示WSL: RockyLinux终端、调试器、扩展都跑在 WSL 环境里。这跟开一台远程 Linux 机器开发几乎没区别但文件读写、剪贴板、端口转发都由 WSL 层处理省去 SSH 配置。有几个小技巧在 WSL 里执行code --install-extension可以安装扩展到远端把 Windows 侧的文件拖拽到 VSCode 窗口会自动走 WSL 文件系统路径如果提示找不到 code 命令说明两侧 VSCode Server 不同步执行code --install-extension ms-vscode-remote.remote-wsl重试。像“wsl 使用 binwalk”这类逆向分析工具也能在 Rocky 下正常安装配合 VSCode 的图形化插件体验很好。4.2 在Rocky里跑Docker两种思路在 WSL 里跑 Docker 有两派做法。方案 AWindows 侧装 Docker Desktop然后在 Docker Desktop 设置里把 Rocky Linux 勾选为 WSL 集成后端。这样 Windows 里也能敲docker命令Rocky 里也能用。优点是界面化管理镜像和容器与 Windows 共享资源缺点是需要先装一个比较大的软件。方案 B直接在 Rocky 里面安装 Docker Engine轻量、更接近生产服务器。我推荐方案 B。在 Rocky 9 里执行sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin sudo systemctl enable --now docker这里要再次强调安装前必须确认 systemd 已经按 3.2 节开启否则systemctl enable docker会报错。如果 systemd 确实没启用可以临时手动启动sudo dockerd /var/log/dockerd.log 21 验证安装sudo docker run hello-world能打印出 Hello from Docker! 就说明工作正常。之后你在 Rocky 里创建的 Docker 网络、容器都基于 WSL2 的虚拟化层资源隔离和性能都不错跑 MySQL、Redis、Nginx 这类开发服务绰绰有余。如果你想在 WSL 里跑 CUDA 相关的深度学习环境思路也类似Windows 侧装好显卡驱动WSL 里直接装 CUDA Toolkit 就能用 GPU很多 AI 项目在 WSL 里跑反而比双系统顺畅。4.3 GUI应用LibreOffice与WSLgWindows 11 的 WSLg 能在 WSL 里直接运行图形界面程序不需要额外 X server。刚装好的 Rocky Linux 没有图形桌面环境但这不重要我们只是偶尔跑个 GUI 软件。比如安装 LibreOffice 就是热词里被提到最多次的操作sudo dnf install -y libreoffice这个安装包比较大等几分钟。装完后在 Rocky 终端里执行soffice --version然后运行soffice窗口会直接弹到 Windows 桌面上跟原生 Windows 程序一样可以拉伸、复制粘贴、切换输入法。WSLg 默认提供 Wayland 和 X11 双通道大多数 GTK/Qt 应用都能直接显示。有几个注意点字体缺失是 WSLg 里常见的显示问题可以装fonts-noto-cjk解决中文乱码sudo dnf install -y fonts-noto-cjk如果程序窗口闪退先看环境变量echo $WAYLAND_DISPLAY、echo $DISPLAY两者至少要有一个非空如果你还在用 Win10没有 WSLg那就需要用 VcXsrv 之类的第三方 X server 配置步骤更多建议直接升级 Win11 省心。4.4 基础开发工具链接下来就是把这台 Rocky 变成顺手开发机的最后一步。安装常用编译工具链sudo dnf groupinstall -y Development Tools sudo dnf install -y git python3 python3-devel openssl-devel readline-devel zlib-devel这样 gcc、g、make、libtool 这些工具就齐了。之后不管是编译 C/C 项目还是用 pyenv 装多版本 Python基础依赖都已经满足。也有朋友喜欢在 Rocky 里做嵌入式或者多媒体项目比如在 WSL 下编译 ijkplayer 这类 Android 开源项目同样没问题只要 NDK、SDK 和编译依赖装好WSL 里跟真实 Linux 主机的体验一致。有一点要注意WSL2 的 IO 性能对大量小文件编译可能不如裸机快代码目录放在 Linux 文件系统内部也就是 home 目录会比放在/mnt/c下面快很多。所以我在 WSL 里习惯把仓库 clone 到 home 目录不要在 Windows 盘符里做编译踩过坑的人都知道这一步能省多少时间。5. 常见问题与排查实录5.1 导入失败wsl/service/createinstance/createvm/hcs/error_file_not_found这个报错我在新电脑上遇到过很多次。根本原因是 WSL2 创建虚拟机的服务环节出了问题常见于Windows 功能没有完全开启、物理机没有开启虚拟化、WSL 版本太旧。排查顺序打开任务管理器切到“性能”标签点 CPU看右下角“虚拟化”是否显示“已启用”。如果没有进 BIOS 打开 VT-x 或 AMD-V检查“虚拟机平台”和“适用于 Linux 的 Windows 子系统”是否都打开可以再执行一次 1.1 的 enable 命令并重启更新 WSLwsl --update重置 WSL 服务管理员 PowerShell 执行wsl --shutdown然后net stop LxssManager再net start LxssManager最后重新导入如果依然报错可以试试wsl --import时把--version 2临时改成--version 1。能导入说明问题出在 WSL2 虚拟机通道之后再想办法升级回 WSL2。5.2 磁盘空间被吃满删除文件后空间没释放WSL 发行版的磁盘文件是 vhdx 格式采用动态扩容机制文件删了但 vhdx 不会自动缩回去。所以在 WSL 里删掉几个大文件后Windows 侧的空闲空间不一定回来。正确做法是在 Windows 管理员 PowerShell 里执行wsl --shutdown然后找到发行版 vhdx 的位置就是我 2.2 节里的D:\WSL\RockyLinux文件名通常是 ext4.vhdx用 diskpart 压缩diskpart select vdisk fileD:\WSL\RockyLinux\ext4.vhdx attach vdisk readonly compact vdisk detach vdisk exit执行完毕后vhdx 体积会明显减小。这个过程不影响 WSL 里的文件但建议先wsl --shutdown保证没有进程占用。我习惯隔一段时间定期执行一下特别是频繁编译、安装又卸载软件之后能帮 Windows 侧省下不少空间。5.3 systemd启不来检查内幕明明在/etc/wsl.conf里写了systemdtrue重启后systemctl还是 not found。这种问题大多不是配置文件写错而是 WSL 版本太老。确认方法在 Windows 侧执行wsl --version主版本号至少 2.0.0 以上在 Linux 侧执行cat /proc/version内核版本最好是 5.15 以上。如果版本太低先回 1.2 升级。另一个隐形坑/etc/wsl.conf必须保存在 Linux 根文件系统的/etc下而且不能以 Windows 换行符保存。建议在 WSL 里用sudo vi /etc/wsl.conf编辑而不是在 Windows 记事本里创建后复制过去否则文件里可能带 CRLF 换行符导致解析失败。我曾经因为这个 Bug 排查了很久后来用dos2unix /etc/wsl.conf一次解决。5.4 网络连不上、无法连接远程如果 WSL 里能 ping 通网关但 ping 不通外网 IP先怀疑 DNS。查看/etc/resolv.conf如果里面为空或指向一个找不到的 DNS按 3.3 的方式设置公共 DNS 并关闭generateResolvConf。如果外部机器连不进 WSL 里的服务先确认服务监听地址是 0.0.0.0 还是 127.0.0.1。NAT 模式下Windows 访问 WSL 服务一般用 localhost 就能转发外部访问需要 portproxy。防火墙检查也不能漏Windows 侧要放行对应端口WSL 内如果开了 firewalld也需要执行sudo firewall-cmd --add-port8080/tcp --permanent sudo firewall-cmd --reload最后说一个 WSL 2 下常见的误会WSL2 的 IP 每次启动都可能变化不要在应用配置里写死172.x.x.x要么用 mirrored 模式要么用host.docker.internal这类特殊域名让容器通信。5.5 卸载Rocky Linux如何彻底清理有不少朋友问 WSL 卸载不干净的问题。在 Windows PowerShell 里wsl --unregister RockyLinux这样会把发行版从 WSL 列表移除对应 vhdx 文件也会被删除。但别以为这样就算完最好手动确认三处D:\WSL\RockyLinux目录是否已经被删除没有就手动删用户目录下的.wslconfig文件是否还需要之前配置了 mirrored 模式或内存限制的话留着也会影响其他发行版建议统一检查如果还装了 Docker Desktop去它的设置里把对应发行版的 WSL 集成取消勾选防止残留。卸载前记得备份 rootfs 或重要数据。wsl --export RockyLinux D:\backup\rocky.tar是官方推荐的备份命令挂载好的系统可以整体导出留着以后导入恢复。最后分享一个我自己养成的习惯在 WSL 里装好 Rocky Linux 后我会把导入用的 rootfs tar 和一份wsl --export的全量备份都存到移动硬盘里。这样不管 Windows 系统怎么重装只要执行一两条导入命令开发环境马上恢复原样。这比从零配置一台服务器的体验好太多也是我推荐大家学会 rootfs 导入而不是只依赖商店在线安装的根本原因——掌握原理之后装的就不只是 Rocky而是任何一种商店里没有的发行版。