ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

在WSL中安装Rocky Linux:从零到生产级环境的完整实践指南

在WSL中安装Rocky Linux:从零到生产级环境的完整实践指南 如果你平时主要待在 Windows 桌面又偏偏需要在本地维护一套和生产环境一致的 Linux 环境那在 WSL 里装 Rocky Linux 这件事大概率会从图省事变成真香。我最近给一台跑测试任务的 Windows 笔记本装 Rocky Linux最初也想着开个虚拟机省心结果光内存占用和文件共享就让人头疼最后老老实实切回 WSL。用下来的体会是WSL 下的 Rocky Linux 装得好不好关键是前置检查、systemd、网络和磁盘这几件事有没有一次弄对。这篇文章就把我从零开始装到日常用的完整过程写出来包含在线安装、离线导入、常见报错排查和几个高频扩展场景希望给你省掉弯路。1. 为什么不在虚拟机里装偏要在 WSL 里跑 Rocky Linux1.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但麻烦且性能受限对外提供服务且需要长期固定 IPWSL2 默认 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-xAMD 叫 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] defaultdev以后每次wsl -d RockyLinux进入的就是 dev 用户需要提权的时候用sudo。这比一直开 root 安全得多尤其后面你要在 WSL 里跑服务、暴露端口的时候root 账户的风险会被放大。4. 启用 systemd不配这个Rocky Linux 等于半残4.1 为什么默认 WSL 环境里没有 systemdWSL2 最初的启动方式非常简单它自己充当 init 进程直接拉起你配置的命令或 shell根本不会启动完整的 systemd。这对 Ubuntu 这种偏命令行的场景影响不大但对 Rocky Linux 这种服务器发行版来说几乎是灾难因为很多服务管理、日志系统、定时任务都依赖 systemd。如果你没启用 systemd就会遇到systemctl命令直接报错或者安装 Nginx、Docker 后怎么都启动不了。我第一次在 WSL 里装 Rocky Linux 时也踩过这个坑后来检查才发现/etc/wsl.conf里少了一行配置。4.2 一行配置让 systemd 正常生效打开/etc/wsl.conf写入[boot] systemdtrue保存后在 Windows PowerShell 里执行wsl --shutdown再重新进入 Rocky Linux执行systemctl is-system-running如果输出running或者degraded都说明 systemd 已经接管了系统。degraded表示有服务启动失败但在多数情况下不影响基本使用可以用systemctl --failed查看失败项。到这一步你的 Rocky Linux 才算真正活过来了。4.3 顺手配置时区和 DNSRocky 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 当前 IPhostname -I然后在管理员 PowerShell 里执行netsh interface portproxy add v4tov4 listenport8080 listenaddress127.0.0.1 connectport80 connectaddress172.x.x.xlistenport是 Windows 侧对外提供服务的端口connectaddress是 WSL 的 IPconnectport是 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 listenport8080 listenaddress127.0.0.1; netsh interface portproxy add v4tov4 listenport8080 listenaddress127.0.0.1 connectport80 connectaddress$ip }5.3 方案二Windows 11 的镜像网络模式一步到位如果你用的是 Windows 11 22H2 以上版本强烈建议直接开镜像网络模式。它让 WSL 直接共享 Windows 的网络接口WSL 里的服务和 Windows 共享同一个 IP端口也不需要转发直接就能访问。在 Windows 用户目录下创建或编辑.wslconfig文件内容如下[wsl2] networkingModemirrored然后执行wsl --shutdown重启 WSL再进入 Rocky Linux。现在你直接监听 8080 端口Windows 浏览器访问http://localhost:8080就能通。这个方案极大简化了日常开发的网络问题尤其是你同时跑多个服务的时候不用一条一条配端口转发。5.4 我实际用下来更倾向哪个个人体验是能用镜像网络就用镜像网络省心太多。但要注意镜像网络模式需要相对新的 WSL 版本如果执行wsl --version发现版本很老先更新。如果公司电脑的 Windows 版本较旧无法开启镜像网络netsh 端口转发依然是最可靠的选择。另外无论哪种方案Windows 防火墙都可能在中间拦截。遇到转发成功后仍无法访问的情况先检查防火墙规则给对应的listenport加一条允许入站规则netsh advfirewall firewall add rule nameWSL Port 8080 dirin actionallow protocolTCP localport80806. 磁盘空间和路径默认装在 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 bs1M statusprogress sudo rm -f /tmp/zero这样 vhdx 里未使用的区块会被标记为零压缩效果才明显。7. 扩展场景CUDA、Docker、LibreOffice、QEMU 和 VSCode7.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] nestedVirtualizationtrue然后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、解决网络访问、把磁盘位置提前安排好。这些前置工作做扎实了后面跑什么任务都顺畅。
返回列表