我们用 WSL 折腾 Linux 太多年了之前几乎清一色 Ubuntu因为教程多、坑少。但最近手头项目服务器统一换成了 Rocky Linux为了和线上环境保持一致我花了点时间把 Rocky Linux 装进了 WSL 2。整个过程不算难但中间踩了不少文档里不会说的细节今天把完整步骤和坑都整理出来给同样需要“本地陪跑”Rocky Linux 的朋友一份直接能抄的作业。1. 核心思路为什么我选择在 WSL 里装 Rocky Linux1.1 从服务器到本地Rocky Linux 的定位Rocky Linux 是 RHEL 的社区重建版和 CentOS 同源目标就是做到和 RHEL 100% 兼容。服务器上跑的服务、编译环境本地用 Rocky Linux 基本能一比一还原。开发环境最怕什么最怕“本地好好的上线就崩”。用和服务器同一个发行版至少在系统库、包管理、内核行为这些层面能减少一大半的意外。有人会说服务器用 Rocky本地开发其实用 CentOS Stream 或 AlmaLinux 也行但既然要追求一致那就干脆都用 Rocky。它支持 x86_64、aarch64 等架构软件源里有完整的企业级工具链做开发、跑编译、测运维脚本都没问题。1.2 WSL 2 相比虚拟机好在哪在 Windows 上跑 Linux有三条常规路线双系统、虚拟机、WSL。双系统切换太麻烦虚拟机要分配固定内存和磁盘启动慢而且和 Windows 的交互很生硬。WSL 2 本质上是一个轻量级虚拟机但它的优势在于和 Windows 文件系统、网络、剪贴板都有原生级别的集成。我个人的使用体验是WSL 2 的冷启动速度在 12 秒内存只有真正用到的进程才会占用磁盘采用 VHDX 动态扩展不预占空间。对于写代码、跑服务、验证脚本来说它和真机几乎没区别除了不能直接访问物理设备比如串口、USB 设备这些限制在实际开发里影响不大。1.3 安装方案选型为什么不用wsl --install -d很多人第一反应是直接执行wsl --install -d rockylinux但很遗憾微软官方商店目前没有提供 Rocky Linux 的 distribution launcher。wsl --install -d只支持商店里列出来的那几个发行版比如 Ubuntu、Debian、openSUSE、Kali。Rocky Linux 并不在列表里。所以我们需要走另一条路手动导入 rootfs。WSL 允许通过wsl --import命令把一个包含 Linux 根文件系统的 tar 包导入为新的发行版。这样不仅能装 Rocky LinuxAlmaLinux、Oracle Linux 这些商店里没有的也可以照葫芦画瓢。2. 开工前的准备更新 WSL 与检查 Windows 环境2.1 确认 Windows 版本和 WSL 版本手动导入 rootfs 支持 WSL 1 和 WSL 2但强烈建议用 WSL 2。WSL 2 基于真正的 Linux 内核Rocky Linux 大多数软件都能正常跑而 WSL 1 是系统调用翻译机制很多高版本软件会报奇怪错误。检查系统信息在 PowerShell 里执行winver wsl --status wsl --versionwinver确认 Windows 版本是 Windows 10 21H2 以上或 Windows 11。wsl --status会显示默认版本和内核状态。如果你看到 “默认版本: 2”说明 WSL 2 已经启用。如果没有需要先启用“适用于 Linux 的 Windows 子系统”和“虚拟机平台”两个功能dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart这个过程要求重启电脑重启后再继续。2.2 升级 WSL 的两种方式含下载慢的解决办法Windows 10 或 Windows 11 自带的 WSL 组件可能是旧版功能不完整。建议先手动把 WSL 升级到最新版。最简单的办法是使用 Windows 自带的更新功能在管理员 PowerShell 里执行wsl --update如果你遇到下载很慢卡在进度条不动大概率是网络连接微软服务器不稳定。可以把运行方式改成从 Microsoft Store 安装 WSL打开 Microsoft Store搜索 “Windows Subsystem for Linux”点击“获取”或“更新”。商店版 WSL 的更新走的是商店分发通道往往比命令行更新稳定。升级后检查一下wsl --version这里能看到 WSL 的版本号、内核版本等信息。如果提示“WSL needs updating your version of Windows Subsystem for Linux is too old”就说明 WSL 内核确实太老了去更新系统或更新 WSL 即可。2.3 一条命令确认 WSL 可用在继续之前先用最简单的发行版验证 WSL 功能正常避免后面排错时还要怀疑 WSL 本身。比如先装一个 Ubuntuwsl --install -d ubuntuUbuntu 安装好以后能正常进入 shell说明 WSL 2 的基础环境没有问题。如果这一步就报错先解决掉 WSL 本身的问题再去装 Rocky Linux。我见过很多人跳过验证直接导入 Rocky最后启动失败排查了很久才发现是 WSL 的内核或功能没弄好。3. 核心实操三步把 Rocky Linux 请进 WSL3.1 第一步拿到 Rocky Linux 的 rootfsRootfs 就是 Linux 根文件系统的打包文件包含/bin、/etc、/usr这些基础目录。获取 Rocky Linux rootfs 最省事的方式是从官方容器镜像导出。如果你本机已经装了 Docker Desktop那最方便。在 PowerShell 里执行docker pull rockylinux:9 docker create --name rocky-tmp rockylinux:9 docker export rocky-tmp -o D:\wsl-images\rockylinux9.tar docker rm rocky-tmpdocker export导出的是容器的完整文件系统不是镜像层。这一步得到的 tar 包就是 WSL 可以直接使用的 rootfs。导出前先创建容器但不启动它因为我们只是要文件系统不需要容器运行。如果你不想装 Docker Desktop也可以用 Podman 替代或者去 Rocky Linux 官网下载官方容器镜像 tar 包通常叫rockylinux-9-docker.tar.xz解压后里面就有 rootfs 文件。只不过官网下载包解压后要再处理一下多一步麻烦所以我个人更推荐 Docker 导出法。3.2 第二步用 wsl --import 导入发行版在 Windows 上给 Rocky Linux 创建一个专属目录用来存放 WSL 的 VHDX 磁盘文件。我的习惯是放在 D 盘避免 C 盘空间被吃掉因为 WSL 的虚拟机磁盘会随着使用缓慢增大mkdir D:\WSL\RockyLinux然后导入wsl --import RockyLinux D:\WSL\RockyLinux D:\wsl-images\rockylinux9.tar --version 2命令格式是wsl --import 名称 安装目录 tar包路径 --version 版本。执行完没有报错就说明导入成功。可以用以下命令查看wsl -l -v输出里能看到RockyLinux这个发行版以及它对应的 WSL 版本是 2。这里有个小坑wsl --import导入的发行版默认用户是 root而且不会像 Ubuntu 安装器那样自动创建普通用户、设置默认用户。这个我们马上处理。3.3 第三步首次进入系统并初始化用户环境进入 Rocky Linux 控制系统wsl -d RockyLinux进去以后会看到 root 提示符。先用 dnf 更新系统基础包dnf update -y这个过程会根据网络慢快决定时间如果网络没问题一般几分钟。更新完后安装最基础的软件包dnf install -y sudo passwd dnf-plugins-core接下来创建一个普通用户并加入wheel组这样后续可以用sudo提权useradd -m -G wheel yourname passwd yourname把yourname换成你想要的名字。然后配置 sudo 权限Rocky Linux 的/etc/sudoers默认应该是包含%wheel ALL(ALL) ALL这一行的你可以用以下命令确认visudo在文件里找一下%wheel那一行如果被注释了去掉注释保存即可。最后最关键的一步把 WSL 默认用户改成这个普通用户。编辑/etc/wsl.confvi /etc/wsl.conf写入[user] defaultyourname [boot] systemdtrue保存后在 Windows PowerShell 里执行重启wsl --terminate RockyLinux wsl -d RockyLinux再次进入时你应该就是普通用户了且 systemd 已经开启。systemdtrue我们后面单独讲这里先写上省得以后还要再改一次。4. 把这套环境驯服常用配置与体验优化4.1 开启 systemd 管理服务WSL 从 0.67.6 版本开始支持 systemd。不开启 systemd 的话很多服务管理命令如systemctl start nginx、systemctl enable docker会报错。对 Rocky Linux 这种企业级发行版来说systemd 几乎是必须的。开启方法就是在/etc/wsl.conf里的[boot]段写入systemdtrue。改完后运行wsl --terminate RockyLinux wsl -d RockyLinux进入后执行systemctl status能看到系统已经由 systemd 接管就说明开启成功。开启 systemd 还有一个额外好处可以从 Rocky 的软件源直接安装 docker-ce、podman 这类服务型软件并让它们以服务的方式在 WSL 里后台运行不需要额外写启动脚本。4.2 设置默认用户和外设权限前面我们通过[user] default设置了默认用户。这样每次进 WSL 不用手动su - yourname直接就是普通用户安全且顺手。顺便再检查一下外设权限。WSL 2 默认会把 Windows 的盘符挂载到/mnt/c、/mnt/d如果你需要从 WSL 里访问 Windows 文件可以直接操作。不过需要提醒一点在/mnt/c下访问文件性能会比 WSL 内部的 Linux 文件系统慢得多因为跨了文件系统边界。如果你要在 WSL 里编译大型项目记得把项目代码放在 Linux 这侧的目录比如~/project不要把项目放在/mnt/c/Users/xxx/project下跑编译别问我怎么知道的慢到怀疑人生。4.3 开发环境与 VS Code 无缝接入Rocky Linux 装好以后VS Code 的 Remote-WSL 插件可以直接识别这个发行版。打开 VS Code安装 “WSL” 扩展然后按CtrlShiftP选择 “WSL: Connect to WSL”就能看到 RockyLinux 的选项。连接上以后用 VS Code 打开的终端就是 Rocky Linux 的 shell可以直接执行dnf、make、gcc这些命令。我个人最喜欢的点是代码提示、Git 操作、格式化都在 VS Code 里完成编译打包放到 Linux 环境互不干扰。第一次连接时VS Code 会在 Rocky Linux 的/home/yourname/.vscode-server里安装服务端组件需要一点时间。如果安装失败大概率是网络问题在 WSL 里执行dnf update确保 DNS 正常后重试。4.4 网络、代理与 WSL 交互配置WSL 2 默认使用 NAT 模式Rocky Linux 可以通过 WSL 的虚拟网卡正常联网。如果你在 Windows 上配置了代理WSL 里的流量通常不会自动走代理需要在 WSL 里单独设置http_proxy和https_proxy环境变量。获取 Windows 主机 IP 的方法是cat /etc/resolv.conf里面的nameserver一般是 Windows 主机的 IP。然后在~/.bashrc或~/.profile里加上export http_proxyhttp://WindowsIP:代理端口 export https_proxyhttp://WindowsIP:代理端口注意这里说的是“内网代理服务”如果你没有代理跳过这段配置不需要走代理反而更干净。有些公司内部有镜像源也可以通过dnf的仓库配置文件手动指定 internal mirror。如果你希望 WSL 和 Windows 网络完全同一个网段可以在 Windows 用户目录下创建.wslconfig写入[wsl2] networkingModemirrored开启 mirrored 模式后WSL 会共享 Windows 的 IP局域网设备可以直接访问 WSL 里跑的服务做联调非常方便。不过这个功能需要较新的 WSL 版本旧版本不支持升级后再用。5. 踩坑实录常见问题与排查5.1 wsl --import 后无法启动如果你导入 tar 后执行wsl -d RockyLinux半天没反应或者直接报错退出最常见的两种原因第一tar 包不是 WSL 能识别的 rootfs。用docker export导出的是文件夹结构的 tar这个没问题。但如果你下载的是官方容器镜像的.tar.xz它可能是分层镜像格式无法直接--import需要先解压并重新打包成单一 tar。第二VHDX 文件损坏或目录权限有问题。可以尝试在 PowerShell 里删除该发行版并重新导入wsl --unregister RockyLinux注意如果之前你已经在 Rocky Linux 里存了重要数据--unregister会连根文件系统带文件一起删除用时千万谨慎。5.2 dnf update 网络报错WSL 2 的 DNS 偶尔会出现解析不了的毛病表现是dnf update卡住或报Could not resolve host。解决办法是在 Rocky Linux 里手动设置 DNSsudo vi /etc/resolv.conf把nameserver改成公共 DNS比如nameserver 223.5.5.5或nameserver 8.8.8.8保存后重试。但有个坑WSL 每次重启后可能会重新生成/etc/resolv.conf覆盖你手动改的内容。如果想要持久化可以在 WSL 里执行sudo chattr i /etc/resolv.conf这样文件被锁住WSL 就不会自动覆盖。如果之后想恢复执行sudo chattr -i /etc/resolv.conf即可。5.3 磁盘空间越用越大怎么办WSL 2 的磁盘文件是动态扩展的 VHDX。你在 Rocky Linux 里删除了大文件VHDX 文件却不会自动缩小导致 Windows 侧一看磁盘空间没释放。解决方法是先彻底关闭 WSLwsl --shutdown然后管理员身份打开 PowerShell用 diskpart 工具压缩 VHDXdiskpart在 diskpart 里依次执行select vdisk fileD:\WSL\RockyLinux\ext4.vhdx attach vdisk readonly compact vdisk detach vdisk exit执行完后再启动 WSL磁盘占用就降下来了。这个操作同样适用于其他 WSL 发行版只要把路径换成对应的 vhdx 文件位置即可。5.4 locale、中文乱码与终端字体问题从 Docker 导出的 Rocky Linux rootfs 默认不包含中文语言包终端下输出中文很容易变成方块或乱码。安装语言包sudo dnf install -y glibc-langpack-zh langpacks-core-font-zh然后在~/.bashrc里设置export LANGzh_CN.UTF-8 export LC_ALLzh_CN.UTF-8保存后source ~/.bashrc生效。终端字体方面Windows Terminal 默认字体在显示中文时不算差但如果想要更接近 macOS 的观感推荐使用 “Cascadia Code” 配合 “霞鹜文楷” 或 “JetBrains Mono”。在 Windows Terminal 的设置里把字体改为CascadiaMono再把终端背景色调成浅色看起来会舒服很多。说实话WSL 的终端体验一多半靠 Windows Terminal别在默认的 cmd 窗口里挣扎了装个 Windows Terminal界面立刻上一个档次。5.5 和 Ubuntu 共存时的别名冲突很多人机器上装有多个 WSL 发行版比如 Ubuntu 和 Rocky Linux 同时存在。这时会遇到一个问题进入 Rocky Linux 后shell 提示符看起来和 Ubuntu 很像容易犯迷糊而且如果你在 Rocky 下执行apt会直接报错。建议给不同的 WSL 发行版设置不同的终端主题配色和标题。在 Windows Terminal 的配置里可以给每个发行版单独设置 tab 颜色、背景色、起始目录。我一般把 Ubuntu 设置为橙色系Rocky 设置为森林绿色系一眼就能分清。还可以在~/.bashrc里加一行别名提示echo Welcome to Rocky Linux $(cat /etc/rocky-release)每次进入都能确认当前环境避免把 RPM 系命令和 DEB 系命令搞混。6. 写在最后的个人体会这套流程走下来Rocky Linux 在 WSL 里跑得挺稳我已经用它跑了半年多的开发环境和一些内部服务包括编译、容器、脚本测试基本没有出现过因为 WSL 导致的兼容性问题。相比开虚拟机WSL 启动快、和 Windows 集成度高开发体验比较顺滑。最后再分享一个小技巧如果你经常需要在 Rocky Linux 里执行重复的初始化操作可以把第 3 节的 dnf 安装、用户创建、wsl.conf 配置写成一个初始化脚本放在一个共享目录比如/mnt/c/Users/yourname/setup-rocky.sh。这样以后想重新搭建环境一条命令就搞定不用一个个敲。WSL 这东西折腾一次把过程固化成脚本长期收益巨大。