在WSL中安装Rocky Linux:从零到生产级环境的完整实践指南
2026/9/16 6:10:35 网站建设 项目流程

如果你平时主要待在 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 文件就行
灵活性一般,按官方默认配置高,可以自己定制目录和名称
首次启动默认用户rootroot
适用场景网络良好、在线列表能搜到内网环境、离线列表没有、下载失败

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/Shanghai

DNS 方面,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.x

listenport是 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=8080

6. 磁盘空间和路径:默认装在 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/*.rpm

binwalk 是一个固件分析工具,安转很方便:

sudo dnf install -y binwalk

QEMU 稍特殊。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 实例时找不到某个文件,但实际原因可能是多方面的。完整排查链路如下:

  1. 先执行wsl --shutdown,等几秒再进入发行版,看问题是否复现。
  2. 用管理员 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、解决网络访问、把磁盘位置提前安排好。这些前置工作做扎实了,后面跑什么任务都顺畅。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询