如果你平时主要待在 Windows 桌面,又偏偏需要在本地维护一套和生产环境一致的 Linux 环境,那在 WSL 里装 Rocky Linux 这件事,大概率会从"图省事"变成"真香"。我最近给一台跑测试任务的 Windows 笔记本装 Rocky Linux,最初也想着开个虚拟机省心,结果光内存占用和文件共享就让人头疼,最后老老实实切回 WSL。用下来的体会是:WSL 下的 Rocky Linux 装得好不好,关键是前置检查、systemd、网络和磁盘这几件事有没有一次弄对。这篇文章就把我从零开始装到日常用的完整过程写出来,包含在线安装、离线导入、常见报错排查和几个高频扩展场景,希望给你省掉弯路。
1. 为什么不在虚拟机里装,偏要在 WSL 里跑 Rocky Linux
1.1 服务器系发行版和 WSL 的匹配度
Rocky Linux 是 RHEL 下游的免费重建版,最大的价值在于和红帽系生态高度对齐。生产服务器上用 Rocky 或者 RHEL 的团队,本地开发环境如果也用同系发行版,脚本、包管理、systemd 服务文件几乎可以无缝切换。这也是我为什么没有继续用 Ubuntu 的 WSL 当开发环境,而是单独建了一个 Rocky Linux 实例的根本原因。
但很多人的第一反应是:既然要跑 Linux,虚拟机不就行了?虚拟机确实更"完整",可是日常开发根本用不到那么重的隔离。WSL2 本质上是一个轻量虚拟机,但启动只要一两秒,内存可以动态回收,文件系统直接和 Windows 互通,还能在 VSCode 里一键进入 Linux 环境改代码。这种"低摩擦"的开发体验,是传统虚拟机给不了的。
1.2 什么场景适合 WSL,什么场景我劝你老实上虚拟机
先泼一盆冷水,WSL 不是万能的。以下场景我建议你还是用 VMware 或 Hyper-V:
- 需要自定义内核模块并直接加载,比如某些特定的驱动或安全加固模块;
- 需要跑嵌套虚拟化并管理 KVM 虚拟机,WSL 里虽然可以开 QEMU,但麻烦且性能受限;
- 对外提供服务且需要长期固定 IP,WSL2 默认 NAT 网络下 IP 每次重启都可能变,不适合做对外演示;
- 重度使用 Linux 图形桌面,WSLg 虽然能用,但和真正桌面环境还是有差距。
如果你的需求只是写脚本、编译代码、跑 Docker、做 CUDA 加速训练、临时起一个数据库服务,那 WSL2 的 Rocky Linux 完全够用,而且比虚拟机清爽太多。
1.3 我实际用下来的整体感受
这半年我把一个数据同步脚本和几个 CI 验证任务都放在 Rocky Linux 的 WSL 里,配合 Windows 宿主机上的 VSCode,体验非常顺。得益于 WSL2 动态内存回收,平时这个发行版只占几百 MB 内存,跑任务时才涨上去。文件互访也方便,Windows 的工程目录可以直接挂到 Linux 侧,两边改代码都是实时的。整体维护成本比虚拟机低一个量级。
2. 安装前的两件事:Windows 版本和虚拟化开关
2.1 先确认系统版本和功能组件
WSL2 要求 Windows 10 21H2 及以上,或者 Windows 11。Windows 11 的体验最省心,因为新版本的 WSL 管理命令、镜像网络模式这些特性都跟得上。检查方式很简单,Win + R 输入 winver 就能看到版本号。
然后需要确保两个 Windows 功能处于开启状态:适用于 Linux 的 Windows 子系统和虚拟机平台。用管理员权限打开 PowerShell,执行:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart如果这两条命令执行完提示重启,就重启一次再继续。另外一个容易被忽视的点是 BIOS 里的 CPU 虚拟化开关,Intel 叫 VT-x,AMD 叫 SVM。Windows 的"虚拟机平台"依赖这个硬件能力,没开的话后面启动 WSL 大概率报错。
2.2 把 WSL 本体更新到新版本
很多报错根本不是 Rocky Linux 的问题,而是 WSL 本体太老。命令是:
wsl --update --web-download如果提示版本已经最新,那就没问题。这一步建议在正式安装发行版之前做,否则后续配置 systemd、镜像网络时会遇到各种莫名其妙的问题。我之前在一台很久没更新的 Windows 10 上装 WSL,就出现过wsl: 检测到 localhost 代理配置这种奇奇怪怪的提示,更新 WSL 之后才正常。
2.3 顺手装个 Windows Terminal
这不是必须,但我强烈建议装。WSL 终端默认的窗口大小、配色、复制粘贴体验都比较原始,Windows Terminal 支持多标签、自定义快捷键,还能直接记住多个发行版的启动命令。装完以后,WSL 和 PowerShell 可以在一个窗口里切换,日常使用效率高很多。
3. 正式安装 Rocky Linux:在线一条命令,离线 rootfs 兜底
3.1 先看官方在线列表里有没有 Rocky Linux
新版本的 WSL 支持直接通过命令行安装发行版,不用去商店点按钮。先在 PowerShell 里看列表:
wsl --list --online如果输出里能看到Rocky Linux 9或类似的名字,直接安装就行:
wsl --install -d RockyLinux这条命令会帮你下载 rootfs、注册发行版、配置默认环境。装完以后你会直接以 root 用户进入一个最小化的 Rocky Linux 系统。在线安装最省事,后续的 systemd 配置和用户配置做完就能用。
3.2 在线列表没有,或下载失败,就用离线 rootfs 导入
我发现很多人第一次装 Rocky Linux 时,wsl --list --online里并没有显示 Rocky Linux,或者命令行下载到一半就卡住。这时候不要死磕在线安装,直接手动导入 rootfs 完全可行,而且过程也不算复杂。
第一步是搞到一个 base rootfs 的 tar 包。如果你机器上已经装了 Docker Desktop,最简单的办法是用容器镜像导出:
docker pull rockylinux:9 docker create --name rocky-tmp rockylinux:9 docker export rocky-tmp -o rockylinux9.tar如果没有 Docker,也可以去 Rocky Linux 官方镜像站找容器基础镜像的 tar 包。拿到 tar 文件后,在 Windows 侧准备一个存放发行版的目录,比如D:\WSL\RockyLinux,然后执行:
wsl --import RockyLinux D:\WSL\RockyLinux D:\download\rockylinux9.tar --version 2--version 2指定使用 WSL2。导入完成后启动:
wsl -d RockyLinux在线和离线两种方式各有适用场景,我整理了一个对比,方便你判断:
| 对比项 | 在线安装 | 离线 rootfs 导入 |
|---|---|---|
| 命令复杂度 | 低,一条命令 | 中,需要准备 tar 包 |
| 网络依赖 | 依赖微软和 Rocky 仓库 | 只要有 rootfs 文件就行 |
| 灵活性 | 一般,按官方默认配置 | 高,可以自己定制目录和名称 |
| 首次启动默认用户 | root | root |
| 适用场景 | 网络良好、在线列表能搜到 | 内网环境、离线列表没有、下载失败 |
3.3 第一次进入系统后:创建日常用户、配置 sudo
不管在线还是离线导入,首次进入都是 root。直接拿 root 跑日常操作不是好习惯,我每次都先建一个普通用户:
useradd -m -G wheel dev passwd dev然后把默认登录用户改成 dev。在/etc/wsl.conf文件(如果没有就新建)里写:
[user] default=dev以后每次wsl -d RockyLinux进入的就是 dev 用户,需要提权的时候用sudo。这比一直开 root 安全得多,尤其后面你要在 WSL 里跑服务、暴露端口的时候,root 账户的风险会被放大。
4. 启用 systemd:不配这个,Rocky Linux 等于半残
4.1 为什么默认 WSL 环境里没有 systemd
WSL2 最初的启动方式非常简单,它自己充当 init 进程,直接拉起你配置的命令或 shell,根本不会启动完整的 systemd。这对 Ubuntu 这种偏命令行的场景影响不大,但对 Rocky Linux 这种服务器发行版来说几乎是灾难,因为很多服务管理、日志系统、定时任务都依赖 systemd。
如果你没启用 systemd,就会遇到systemctl命令直接报错,或者安装 Nginx、Docker 后怎么都启动不了。我第一次在 WSL 里装 Rocky Linux 时也踩过这个坑,后来检查才发现/etc/wsl.conf里少了一行配置。
4.2 一行配置让 systemd 正常生效
打开/etc/wsl.conf,写入:
[boot] systemd=true保存后在 Windows PowerShell 里执行:
wsl --shutdown再重新进入 Rocky Linux,执行:
systemctl is-system-running如果输出running或者degraded,都说明 systemd 已经接管了系统。degraded表示有服务启动失败,但在多数情况下不影响基本使用,可以用systemctl --failed查看失败项。到这一步,你的 Rocky Linux 才算真正"活"过来了。
4.3 顺手配置时区和 DNS
Rocky Linux 的容器 rootfs 默认时区可能不是中国时区,执行:
timedatectl set-timezone Asia/ShanghaiDNS 方面,WSL 一般会自动生成/etc/resolv.conf并指向 Windows 的 DNS,但如果你启用 systemd 后 DNS 解析偶尔异常,可以检查这个文件里有没有有效 nameserver。实在不行就手动写一个:
echo "nameserver 223.5.5.5" > /etc/resolv.conf需要注意的是,这个文件默认由 WSL 自动管理,手动改之后可能重启被覆盖,必要时在/etc/wsl.conf里加一行[network] generateResolvConf = false关掉自动生成。
5. 网络和静态 IP:别死磕固定 IP,端口转发或镜像网络更实用
5.1 WSL2 默认 NAT 模式的坑
WSL2 默认使用 NAT 网络,每次启动时分配一个动态 IP 给发行版,所以你在 Rocky Linux 里用ip addr看到的 IP,下一次启动很可能就变了。网上有不少人纠结"怎么给 WSL 设置静态 IP",实际体验下来真没必要。因为 WSL 本身就是给开发环境用的,不是长期对外提供服务的服务器,追求固定 IP 往往是方向搞错了。
你需要解决的核心问题是:如何让 Windows 上的另一个程序访问 WSL 里跑的服务。比如你在 Rocky Linux 里启动了 Nginx,监听 80 端口,Windows 浏览器想直接访问http://localhost,这时候默认 NAT 是做不到的,因为 localhost 解析到的是 Windows 自己。
5.2 方案一:用 netsh 端口转发,最简单直接
端口转发的原理是:让 Windows 某个端口收到请求后,自动转发到 WSL 里某个 IP 的指定端口。先查一下 WSL 当前 IP:
hostname -I然后在管理员 PowerShell 里执行:
netsh interface portproxy add v4tov4 listenport=8080 listenaddress=127.0.0.1 connectport=80 connectaddress=172.x.x.xlistenport是 Windows 侧对外提供服务的端口,connectaddress是 WSL 的 IP,connectport是 Rocky Linux 里服务监听的端口。执行后,Windows 浏览器访问http://127.0.0.1:8080就能打到 WSL 里 Nginx 的 80 端口。
这个方案最大的缺点是:WSL 重启后 IP 变了,转发规则就失效了。我的做法是写一个小脚本,启动 WSL 后自动读取新 IP,然后删掉旧规则、添加新规则:
wsl -d RockyLinux hostname -I | ForEach-Object { $ip = ($_ -split '\s+')[0]; netsh interface portproxy delete v4tov4 listenport=8080 listenaddress=127.0.0.1; netsh interface portproxy add v4tov4 listenport=8080 listenaddress=127.0.0.1 connectport=80 connectaddress=$ip }5.3 方案二:Windows 11 的镜像网络模式,一步到位
如果你用的是 Windows 11 22H2 以上版本,强烈建议直接开镜像网络模式。它让 WSL 直接共享 Windows 的网络接口,WSL 里的服务和 Windows 共享同一个 IP,端口也不需要转发,直接就能访问。
在 Windows 用户目录下创建或编辑.wslconfig文件,内容如下:
[wsl2] networkingMode=mirrored然后执行wsl --shutdown重启 WSL,再进入 Rocky Linux。现在你直接监听 8080 端口,Windows 浏览器访问http://localhost:8080就能通。这个方案极大简化了日常开发的网络问题,尤其是你同时跑多个服务的时候,不用一条一条配端口转发。
5.4 我实际用下来更倾向哪个
个人体验是:能用镜像网络就用镜像网络,省心太多。但要注意,镜像网络模式需要相对新的 WSL 版本,如果执行wsl --version发现版本很老,先更新。如果公司电脑的 Windows 版本较旧无法开启镜像网络,netsh 端口转发依然是最可靠的选择。
另外,无论哪种方案,Windows 防火墙都可能在中间拦截。遇到转发成功后仍无法访问的情况,先检查防火墙规则,给对应的listenport加一条允许入站规则:
netsh advfirewall firewall add rule name="WSL Port 8080" dir=in action=allow protocol=TCP localport=80806. 磁盘空间和路径:默认装在 C 盘,搬家、瘦身有讲究
6.1 为什么 C 盘空间会越用越少
WSL 的整个文件系统都保存在一个 vhdx 虚拟磁盘文件里,默认路径在C:\Users\你的用户名\AppData\Local\wsl或者旧版本的发行版目录下。这个文件的特点是只增不减,你在 Rocky Linux 里安装软件、拉 Docker 镜像、编译代码,都会让这个文件变大。即使你后来删掉了大量文件,vhdx 文件也不会自动缩小。
我见过最夸张的情况是,一个同事在 WSL 里跑了几次容器构建,C 盘直接少了 40 多 GB。所以如果你打算长期使用 Rocky Linux 的 WSL,强烈建议从一开始就把发行版放在非系统盘。
6.2 把 Rocky Linux 整个迁到 D 盘
迁移操作并不复杂,核心就是导出、注销、导入三步。先把发行版导出成一个 tar 文件:
wsl --shutdown wsl --export RockyLinux D:\backup\rockylinux-backup.tar然后注销原来的发行版:
wsl --unregister RockyLinux注意这一步会删除原发行版的所有数据,但我们已经导出备份了,不用担心。接下来在目标位置新建目录并导入:
mkdir D:\WSL\RockyLinux wsl --import RockyLinux D:\WSL\RockyLinux D:\backup\rockylinux-backup.tar --version 2导入完成后重新进入 Rocky Linux,你会注意到默认用户变回了 root。这是wsl --import的常见行为,需要重新配置/etc/wsl.conf里的默认用户,方法前面已经讲过。迁移完成后,C:\Users\你的用户名\AppData\Local\wsl下的旧 vhdx 文件如果还在,可以手动删除。
6.3 vhdx 空间不释放的两种处理方式
如果你的发行版已经在 C 盘且用了一段时间,迁移时想顺便压缩,可以这样操作。
方式一:新版 WSL 自带的压缩命令。先执行:
wsl --manage RockyLinux --set-sparse true这个命令会把发行版磁盘设为稀疏文件,之后删除文件后系统会尽量自动释放空间。如果你执行时提示命令不支持,说明 WSL 版本太老,先更新再试。
方式二:使用 Hyper-V 的 Optimize-VHD 命令压缩。管理员 PowerShell 里执行:
wsl --shutdown Optimize-VHD -Path "C:\Users\你的用户名\AppData\Local\wsl\RockyLinux\ext4.vhdx" -Mode Full压缩的时机很重要,一定要先在 Rocky Linux 里删除无用文件,最好再执行一次零填充:
sudo dd if=/dev/zero of=/tmp/zero bs=1M status=progress sudo rm -f /tmp/zero这样 vhdx 里未使用的区块会被标记为零,压缩效果才明显。
7. 扩展场景:CUDA、Docker、LibreOffice、QEMU 和 VSCode
7.1 WSL 里启用 CUDA 加速
一台带 NVIDIA 显卡的 Windows 机器,想在 Rocky Linux 里跑 GPU 加速任务,很多人会绕远路去 Linux 侧装显卡驱动,这是完全没有必要的。WSL2 的 GPU 直通机制决定了:Windows 侧装好 NVIDIA 驱动,WSL 里直接用即可,Linux 侧不需要也不能再装驱动。
在 Rocky Linux 里验证 GPU 是否可见,直接运行:
nvidia-smi如果能正常显示显卡信息和驱动版本,说明 GPU 直通已经生效。CUDA Toolkit 在 WSL 里安装时,选择 WSL-Ubuntu 对应的版本即可,Rocky Linux 和 RHEL 系也能通过 NVIDIA 官方仓库安装。注意nvcc -V看到的是 CUDA 编译器版本,代表开发环境已就绪,而nvidia-smi显示的是驱动支持的最高 CUDA 版本,两者不一定要完全一致。
7.2 安装 Docker 并跑容器
启用 systemd 之后,Rocky Linux 里装 Docker 就顺理成章了。配置 Docker 官方仓库:
sudo dnf install -y dnf-plugins-core 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 sudo systemctl enable --now docker注意 Rocky Linux 9 默认的 dnf 仓库文件用centos路径其实没问题,因为 Docker 仓库的 RPM 依赖在 RHEL 系上是通用的,实测可以正常安装。装完以后,docker run hello-world跑通就算成功。
如果你不想在 Rocky Linux 内部直接装 Docker,也可以使用 Windows 侧的 Docker Desktop,在设置里把 Rocky Linux 这个 WSL 发行版加入集成列表,同样能在 Linux 内部直接使用docker命令。但这种方式会额外启动 Docker Desktop 的 Windows 服务,资源占用比纯 Linux 侧 Docker 高一些,我更倾向前者。
7.3 LibreOffice、binwalk、QEMU 这类小工具怎么装
搜索引擎里经常出现这些词,因为很多人装完 Rocky Linux 的 WSL 后就想把它当成一个工作环境。
LibreOffice 直接用 dnf 安装就行:
sudo dnf install -y libreoffice如果你从官网下载了 RPM 包,比如LibreOffice_7.4.7.2_Linux_x86-64_rpm,解压后不要用rpm -ivh直接装,因为依赖关系很难处理。放在同一目录下用 dnf 安装:
sudo dnf install -y ./RPMS/*.rpmbinwalk 是一个固件分析工具,安转很方便:
sudo dnf install -y binwalkQEMU 稍特殊。WSL2 里跑 QEMU 需要确认是否有/dev/kvm设备:
ls -l /dev/kvm新版本 WSL2 默认开启了嵌套虚拟化,如果找不到/dev/kvm,可以在.wslconfig里加:
[wsl2] nestedVirtualization=true然后wsl --shutdown再重进。没有 KVM 也不是不能用 QEMU,只是会退化成软件模拟,性能差很多。
7.4 VSCode 连接 WSL 的正确姿势
VSCode 连 WSL 是最舒服的开发方式。Windows 侧安装 VSCode 后,装一个Remote - WSL扩展,然后在 Rocky Linux 终端里直接运行:
code .VSCode 会自动在 Linux 侧下载一个 server 组件,然后在 Windows 打开窗口,看起来就像本地开发一样。这个 server 组件首次下载比较慢,耐心等一会儿就好。如果你开了镜像网络模式,code .的可靠性更高,因为 VSCode server 的端口访问不会被 NAT 隔离。
8. 高频报错排查记录:403、error_file_not_found、更新慢、卸载不干净
8.1 wsl --install 返回 403 已禁止怎么办
如果你执行wsl --install直接返回类似ps c:\users\...> wsl --install 已禁止(403),多半不是命令本身的问题,而是当前 Windows 环境无法访问微软的应用商店通道。常见的原因包括:公司电脑有网络策略拦截了商店域名、本地账户权限受限、商店组件损坏。
我的处理思路比较直接:不跟 403 死磕。既然在线安装走不通,就手动下载 WSL 安装包,或者使用前面讲的离线 rootfs 导入方案。先执行:
wsl --update --web-download如果这样还不行,说明当前 WSL 本体已经可用或者更新被限制,那就直接跳过在线安装发行版,手动导入 Rocky Linux rootfs。需要注意的是,403 可能只影响发行版的下载,不影响你已经安装好的 WSL 功能。
8.2 错误代码 wsl/service/createinstance/createvm/hcs/error_file_not_found
这个报错算 WSL 里的经典疑难杂症了,很多人更新完 Windows 后突然遇到。它的字面意思是创建 WSL 实例时找不到某个文件,但实际原因可能是多方面的。完整排查链路如下:
- 先执行
wsl --shutdown,等几秒再进入发行版,看问题是否复现。 - 用管理员 PowerShell 检查虚拟化相关功能:
systeminfo看 Hyper-V 要求那几行是否全是"是"。如果显示"虚拟化已启用,但固件中未启用",那就是 BIOS 里没开 VT-x/SVM。 3. 检查 Hypervisor 启动类型:
bcdedit /set hypervisorlaunchtype auto然后重启。这个命令能解决一部分 WSL 无法创建虚拟机的问题。 4. 如果还不行,就修复 WSL 组件,用之前提到的dism.exe命令关闭再重新开启"虚拟机平台"功能,重启后生效。 5. 最后一步,尝试wsl --update --web-download升级 WSL 本体,很多新版本已经修复了 vhdx 路径变化导致的error_file_not_found。
从实际经验看,90% 的情况集中在第二步和第三步,先检查虚拟化,再设置 hypervisorlaunchtype。
8.3 wsl --update 下载很慢,甚至卡住
wsl --update下载慢是很多人的痛点,尤其默认从商店下载时,进度条可能半天不动。我的解决方法很简单,加参数走 Web 下载:
wsl --update --web-download这个参数会让 WSL 直接从微软官方服务器下载安装包,而不是走商店通道,实测速度提升非常明显。如果还是慢,换个网络环境再试,比如用手机热点临时更新一次,之后就一劳永逸了。
8.4 卸载 Rocky Linux 并清理干净
想彻底卸载 WSL 里的 Rocky Linux,不是直接在 Windows 设置里删应用,那样很可能留下虚拟磁盘文件占用空间。正确方法是先注销发行版:
wsl --unregister RockyLinux这条命令会删除该发行版的全部数据和虚拟磁盘文件。再用wsl -l -v确认列表里已经消失。如果你连 WSL 本身都不想要了,可以在"启用或关闭 Windows 功能"里关闭"适用于 Linux 的 Windows 子系统"和"虚拟机平台",重启后即完全关闭。注意这不会自动删除已有的 vhdx 文件,需要手动清理C:\Users\你的用户名\AppData\Local\wsl目录下残留的发行版文件夹。
如果你卸载后发现 WSL 相关服务仍然在后台运行,可以顺手清理一下计划任务里关于 WSL 的条目,但绝大多数情况下,wsl --unregister加功能关闭两步就已经很干净了。
我在实际测试中发现,Rocky Linux 在 WSL 里的稳定程度相当高,比某些桌面发行版更不容易出幺蛾子。不过从安装到日常使用,最核心的其实就几条:选对安装方式、配好 systemd、解决网络访问、把磁盘位置提前安排好。这些前置工作做扎实了,后面跑什么任务都顺畅。