ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

在WSL2中安装Rocky Linux:从rootfs导入到Docker配置完整指南

2026/9/16 9:44:35 拓冰建站 浏览量
在WSL2中安装Rocky Linux:从rootfs导入到Docker配置完整指南 前两天有朋友问我能不能在Windows自带的WSL里跑Rocky Linux。他的处境很典型公司统一发的办公机是Windows但测试和生产环境全是RHEL系LinuxCentOS停更之后他们切到了Rocky Linux 9。每天靠VirtualBox开个虚拟机做实验内存占用大启动还慢开个容器更是一顿折腾。我听完直接告诉他这条路完全走得通而且比虚拟机顺手太多。这篇就把我在WSL上安装Rocky Linux的完整步骤、踩过的坑以及最后沉淀下来的配置方案一次性说清楚。先说结论Rocky Linux确实不在wsl --install -d的官方发行版列表里但WSL本来就不是只能装商店里那几款系统。只要你能拿到一份Rocky Linux的rootfs也就是根文件系统用wsl --import就能把它注册成一个WSL发行版。日常开发、跑Docker、连VSCode、调CUDA跟Ubuntu在WSL里的体验不会有本质差别。这套流程对国内网络环境尤其友好可以绕开微软商店下载慢、更新慢的毛病。适合谁看在Windows办公机上做Linux开发、又要跟RHEL系服务器保持环境一致的人以及想给机器减负、不想再开重型虚拟机的人。1. 方案选型为什么用WSL2跑Rocky Linux这条路走得通1.1 官方列表里没有Rocky但WSL的设计留了后门wsl --list --online输出的发行版来自微软商店的预集成比如Ubuntu、Debian、Kali、openSUSE这些。Rocky Linux没有跟微软做商店层面的集成但不代表不能装。WSL的底层机制就是在Windows上加载一个Linux根文件系统本质上它只认两类东西一个tar包或者一块ext4虚拟磁盘。wsl --import就是官方开放的自定义发行版入口你把任意一个能正常启动的Linux rootfs喂进去它就能被注册成一个新的WSL发行版。用生活类比解释一下商店里的Ubuntu是品牌整机自己import进来的Rocky是DIY装机。品牌机到手即用DIY多两步组装但核心部件没有差别。其实不只是RockyCentOS Stream、AlmaLinux、Fedora、甚至某些最小化的定制系统都能走这条路。所以别被商店里没有劝退WSL的设计从一开始就给折腾留了门。1.2 为什么偏偏是Rocky LinuxCentOS Linux停更后很多团队把生产环境切到了Rocky Linux因为它是RHEL的下游重建版本rpm包格式、dnf仓库、systemd服务管理、firewalld防火墙这些操作习惯跟RHEL高度一致。开发机上跑Rocky意味着你本地遇到的所有坑在生产环境上大概率也能复现、能对齐依赖版本几乎不会出现我电脑上好好的这类玄学问题。Rocky 8对应RHEL 8基线Rocky 9对应RHEL 9基线选型主要看生产环境用的哪版。我这边以Rocky Linux 9为例8的下载和导入方式完全一样区别只在软件源路径和某些包名细节。如果你所在团队做的是传统企业级项目大概率也是RHEL 9系那看这篇的参考价值最大。1.3 WSL2相对虚拟机的优势与边界WSL2并不是传统意义的模拟器它是基于Hyper-V平台跑的一个轻量Linux虚拟机但微软做了大量集成localhost端口自动转发、文件系统互访比如/mnt/c就是C盘、剪贴板共享、VSCode无缝接入。启动速度以秒计算内存可以动态释放不像VirtualBox那样开机先占你2GB内存。但WSL2也不是万能的。它的默认网络模型是NATWSL里的IP不是Windows局域网IP外网设备不能直接访问WSL里的服务如果需要完整桌面图形环境别指望WSLg能完全替代真桌面嵌套虚拟化场景也会受限。所以我的建议是纯开发、跑服务、做实验直接WSL2需要给局域网提供稳定服务、需要完整GUI、需要内核级调试再考虑虚拟机。先把边界划清楚后面的配置方向才不会跑偏。2. 装之前先把WSL底座伺候好2.1 版本与功能检查WSL2是有系统门槛的Windows 10 2004build 19041及以上版本或Windows 11这是个硬性条件。先在管理员PowerShell里看下当前WSL状态wsl --status wsl --version如果没有WSL或提示不支持按顺序启用两个Windows功能dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart执行完重启系统。顺便打开任务管理器在性能 - CPU里看一眼虚拟化功能是否已启用。如果显示已禁用需要进BIOS打开VT-xIntel或AMD-VAMD这个步骤经常被忽略很多人后面跑起来报错回头查才发现是这层问题。2.2 下载太慢、403的应对策略热搜里wsl --install太慢wsl --update下载很慢已禁止(403)这类问题根源大多是WSL从微软商店或Windows Update接口拉资源时被网络策略、DNS或代理干扰。我实际用下来这几个办法都比较能解决问题现象常见原因处理方式wsl --install报403商店接口被网络策略或代理拦截改用wsl --install --web-download绕开商店wsl --update卡住或慢从Windows Update拉取资源异常手动下载WSL2内核MSI安装包或加--web-download系统时间不对导致失败证书和签名校验不过先确认系统时间同步正常公司电脑装不了组策略禁用了商店直接走手动安装内核包手动导入rootfs方案这里专门提醒一句wsl --update走的下载通道不一定稳定手动下载WSL2内核MSI是最省心的兜底方案。微软官网有独立的WSL2内核更新包页面下载下来双击安装装完再wsl --set-default-version 2效果一样。离线环境就更直接了在一台能联网的机器上把MSI和rootfs包都下好拷贝过去安装就行。2.3 设置默认版本并验证WSL2可用wsl --set-default-version 2把后续所有导入的发行版默认设为WSL2。如果这步提示需要启用虚拟机平台说明前面功能没开全回去补。验证方法很简单随便导入一个系统后执行wsl -l -vVERSION列显示2就说明WSL2已经正常工作。我见过有人在旧项目里一直用WSL1跑Rocky之后发现systemd起不来、Docker也不行最后排查出是WSL1的锅。WSL1和WSL2是两套完全不同的架构前者通过系统调用翻译层模拟Linux后者是轻量虚拟机RHEL系发行版尽量用WSL2别在WSL1上浪费时间。2.4 规划安装目录WSL2的每个发行版都对应一个ext4.vhdx虚拟磁盘文件。官方商店版默认放在%LOCALAPPDATA%\Packages\目录下路径很深C盘压力极大。自定义导入时可以直接指定目录比如D:\WSL\RockyLinux这个目录建议放在SSD剩余空间充足的分区。因为后续装Docker、编译源码时虚拟磁盘可能会涨到10GB以上。提前把磁盘规划好比装到一半发现C盘爆了再迁移要舒服得多。3. 获取Rocky Linux的RootFS三种路子任选3.1 方法一从Docker镜像导出最推荐前提条件是本机有任何能运行docker的环境Windows上的Docker Desktop或者另一台Linux都行。操作步骤docker pull rockylinux:9 docker create --name rocky-tmp rockylinux:9 docker export rocky-tmp -o rocky9-rootfs.tar docker rm rocky-tmp这里关键点在docker export它把容器文件系统拍平成一份纯rootfswsl --import需要的就是这种格式。千万别用docker savesave保留的是镜像分层结构WSL不认。导出的tar解压后大概两三百MB里面是Rocky最小系统、dnf包管理器和基础文件结构这就已经够系统启动了。我在第一次尝试时走了弯路去下载ISO再手动解压rootfs折腾了大半天。后来发现容器导出这条路又快又干净派生的rootfs不需要处理内核、引导、固件因为WSL2本身就带着Linux内核发行版只管用户态的东西。3.2 方法二下载社区WSL发行版包GitHub上有人维护现成的Rocky Linux WSL包release里直接提供tar.gz下载后用wsl --import导入即可。好处是省事有些包甚至内置了创建用户的脚本导入完直接就有普通用户可用。坏处是你不知道包里面到底改过什么出于安全考虑生产开发机不建议用网上不明来源的rootfs。如果只是在虚拟机里临时测试想快速看看Rocky长什么样那用社区包没问题。但你既然要装到自己日常工作的机器上建议还是花十分钟从官方镜像导出一份安全这事赌不起。3.3 方法三离线环境下用dnf --installroot组装假设你手头只有一台能联网的Linux又不想装Docker可以走dnf --installroot方式组装rootfs。我用这类方法做过最小化系统思路和debootstrap类似sudo dnf --installroot/tmp/rocky-rootfs --releasever9 install -y \ bash coreutils dnf systemd passwd shadow-utils sudo procps-ng装完后再chroot进去配置时区、语言、resolv.conf最后打包sudo tar --numeric-owner -czf rocky-rootfs.tar.gz -C /tmp/rocky-rootfs .这个方法理解门槛比较高还得处理chroot后的一系列初始化问题。没有特殊限制的话还是推荐Docker导出路径。另外强调一下无论用哪种方式拿到rootfs之后可以先在临时环境里看一眼/etc/os-release确认系统版本和架构是对的避免导入一个arm64包放到x86机器上。4. 从tar包到能跑的系统导入与首次配置4.1 wsl --import 的正确打开姿势管理员或普通PowerShell都能执行wsl --import RockyLinux D:\WSL\RockyLinux D:\downloads\rocky9-rootfs.tar --version 2参数拆开说RockyLinux是注册名后续wsl -d RockyLinux就用这个名字D:\WSL\RockyLinux是虚拟磁盘存放目录这个目录必须已经存在WSL不会自动创建D:\downloads\rocky9-rootfs.tar是上一步导出的tar包路径--version 2明确指定使用WSL2。导入过程需要等几分钟期间看起来像是卡住了千万不要CtrlC。完成后wsl -l -v能看到记录。如果报指定的文件不是虚拟磁盘多半是把某个vhdx文件或ISO错当成了tar包检查文件格式就好。注意导入成功后先别急着删tar包后续出问题还能重新导入等系统完全配置好有备份了再清理不迟。4.2 第一次进系统root登录与基础工具wsl -d RockyLinux此时默认登录用户是root。老规矩先把基础工具补齐dnf install -y sudo passwd procps-ng dnf-plugins-core dnf update -y然后创建普通开发用户useradd -G wheel -m alice passwd alice我的习惯是创建一个自己名字的普通用户日常开发都用它只有系统级操作才sudo。给sudo权限前先确认wheel组在sudoers里可用grep -E ^%wheel /etc/sudoersRocky默认通常已经有一条%wheel ALL(ALL) ALL没有的话就新建独立配置echo %wheel ALL(ALL) ALL /etc/sudoers.d/wheel chmod 440 /etc/sudoers.d/wheel不要直接去改/etc/sudoers主文件容易改错导致sudo整个坏掉。用/etc/sudoers.d下面放独立文件是标准做法出问题也容易排查。4.3 设置默认登录用户WSL默认用root登录每次都手动切用户有点烦。创建/etc/wsl.conf[user] defaultalice保存后退出在PowerShell里重启发行版wsl --terminate RockyLinux wsl -d RockyLinux再次进入就会直接以alice身份登录。这里有个常见的坑如果wsl.conf里写的用户名不存在或拼写错误WSL会报找不到用户或者干脆退回root一脸懵。配置前先id alice确认用户存在。wsl --terminate和wsl --shutdown的区别要分清。前者只关闭指定发行版后者会把所有WSL实例全部关掉。大部分配置生效场景用--terminate就够动作小、影响面可控。4.4 配置软件源与系统基础信息国内直接访问Rocky默认软件源速度时常不理想。我一般会把/etc/yum.repos.d/下的Rocky源替换为国内镜像站的rockylinux目录具体镜像域名有很多挑一个可用的换上。改完执行dnf clean all dnf makecache顺手配置时区和语言环境sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime到这里系统已经能正常使用了。剩下的都是更好用层面的优化包括网络、systemd和Docker这也是接下来大家遇到问题最多的地方。5. WSL网络与开发环境静态IP、systemd、Docker5.1 静态IP这个话题要掰开揉碎热搜里有rocky linux设置静态ip这个需求在WSL2里得分情况讨论。默认WSL2是NAT网络WSL内IP由Hyper-V动态分配每次冷启动都可能变。如果只是想在Windows这边访问WSL里的服务完全不用管IP因为WSL2自动做了localhost端口转发WSL里监听某端口Windows直接用localhost:端口就能访问。真正需要固定IP的场景一般是WSL和另一台虚拟机通信、服务端配置了IP白名单、或者局域网其他设备要直接访问WSL服务。解决方案有这么几条路方案A镜像网络模式推荐Windows 11 22H2在C:\Users\用户名\.wslconfig里写[wsl2] networkingModemirrored然后wsl --shutdown再重新进入WSL的IP变成和Windows一样天然就是静态的而且局域网内其他设备可以直接访问WSL服务。这个模式要求WSL版本足够新老版本不认这个字段所以要先把wsl --update做一下。方案B启动脚本固定IP写个systemd服务或者放在rc.local里做ip addr add原理是在WSL启动后往eth0上补一个静态地址。问题在于WSL网络初始化时机很特殊脚本时机没踩准就会提示设备不存在然后还要重试。我试过几次后放弃了日常开发真用不到。方案C换成WSL1共享网络把发行版设成WSL1网络直接复用WindowsIP永远是Windows的IP。但WSL1模拟系统调用的机制对RHEL系兼容性不好systemd等组件跑起来很别扭不推荐拿Rocky做这个实验。结论先给出来大多数情况下默认NAT加localhost转发完全够用真需要静态IP这个结果镜像网络是正解。别为了一个IP费半天劲去写脚本不划算。5.2 开启systemd不开启systemd的话你会发现systemctl start sshd直接报错Docker也起不来。从WSL 0.67.6版本开始官方支持在/etc/wsl.conf里直接开启systemd。在wsl.conf文件中补上[boot] systemdtrue然后wsl --terminate RockyLinux或wsl --shutdown后重新进入。用systemctl is-system-running验证能看到running或degraded都说明PID 1已经是systemd了。开启systemd之后整个Rocky Linux的管理方式就跟生产环境完全对齐了。装什么服务、开什么开机自启都是标准Linux操作再也碰不到WSL特有的系统管理器报错之类问题。这一步是让WSL里的Rocky变成正经系统的关键一步。5.3 在Rocky Linux里装DockerRocky仓库自带的docker包其实是podman-docker的兼容层真要装Docker CE得用官方源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 docker version因为Rocky没有单独的docker-ce仓库官方源里对应的是RHEL兼容的CentOS仓库Rocky可以直接套用。装完后跑docker run --rm hello-world测试一下。如果镜像下载慢可以在/etc/docker/daemon.json里配置国内镜像加速器挑一个就近的地址填上重启dockersudo systemctl restart docker这里有个心得Docker Desktop和WSL内部直接跑docker守护进程是两条路线。在Rocky里直接装Docker CE内存占用更小、行为更接近生产环境如果你还需要Windows侧的管理界面那就用Docker Desktop并开启WSL集成。我自己的选择是WSL内部直装开发体验更纯粹。5.4 让Windows侧开发工具无缝接进来VSCode在Windows上安装WSL扩展后在WSL的目录里执行code .VSCode会自动在WSL内部署server然后弹出图形界面。偶尔会遇到server下载慢或失败可以先dnf install -y wget curl tar gzip再手动把server包解压到~/.vscode-server下这个问题基本就解决了。PyCharm方面较新版本直接在Project Interpreter里选WSL解释器指定Rocky里的/usr/bin/python3即可不需要在WSL里额外装桌面环境。其他常用工具也顺手提一下binwalk、qemu、CUDA工具包都是在WSL2里能跑的。尤其CUDAWSL2支持GPU透传但前提是Windows侧先装好支持WSL的NVIDIA驱动Rocky里再装CUDA Toolkit。这条链路踩的人不多等你需要跑深度学习实验时就会发现真香。6. 高频问题排查实录6.1 wsl --install 报403或下载太慢先别反复重试想一下接口是被谁拦了。403最常见的原因是商店接口被网络策略或代理干扰。直接改用wsl --install --web-download换条下载通道还不行就手动拿WSL2内核MSI和rootfs包离线装。如果是在公司网络环境必须走代理先在系统设置里把代理配好再执行让终端和应用层代理保持一致。我遇到过一台电脑wsl --install始终提示已禁止(403)最后发现是公司组策略把微软商店整个禁用了。当时就是靠手动下载内核MSI加wsl --import硬装成功的所以这条路径值得每个人掌握。6.2 错误代码 error_file_not_found这个错误出镜率极高wsl/service/createinstance/createvm/hcs/error_file_not_found。排查顺序很有讲究执行wsl --update升级到最新内核wsl --shutdown后重新打开检查.wslconfig里的配置项尤其是写了kernel路径但文件不存在的情况检查虚拟机平台功能是否被安全软件或组策略关闭用之前的dism命令重新启用还不行就wsl --unregister 发行版名重新导入这个报错多数是WSL组件层面问题不代表发行版数据损坏所以重置发行版通常不是第一选择。先把2、3、4走一遍大概率能解决。只有确认发行版本身起不来时才考虑重新导入。6.3 WSL里删了文件磁盘空间没释放WSL的ext4.vhdx只增不减删掉大文件后空间不会自动还给宿主机。想回收空间先wsl --shutdown确保所有WSL实例关闭然后管理员PowerShell执行diskpart select vdisk fileD:\WSL\RockyLinux\ext4.vhdx attach vdisk readonly compact vdisk detach vdisk exitcompact vdisk会整理虚拟磁盘并释放未使用空间。注意一定要先完全关停WSL否则磁盘被占用压缩会失败。我每次清完大项目就顺手跑一遍这条命令C盘能省好几个G。如果是默认安装路径file参数换成%LOCALAPPDATA%下对应的ext4.vhdx路径即可。6.4 WSL的磁盘镜像在哪、如何迁移商店版发行版的ext4.vhdx藏在%LOCALAPPDATA%\Packages\下面很深的目录里找起来烦人。自定义导入的发行版就在你指定的目录一眼就能看到。迁移方案是导出再导入wsl --export RockyLinux D:\backup\rocky-backup.tar wsl --unregister RockyLinux wsl --import RockyLinux D:\WSL\RockyLinux D:\backup\rocky-backup.tar --version 2导出的tar会把当前系统、用户、软件、配置全部打包体积是磁盘实际占用大小不是vhdx膨胀后的大小。如果你看到热搜里linux rocky 8.10镜像位置是想找Rocky 8的ISO镜像那是另一回事去官方镜像站下载ISO后挂载使用即可和WSL用的rootfs tar包不是同一个东西。6.5 如何把WSL卸载干净很多教程让你直接禁用Windows功能我建议按顺序来列出所有发行版wsl -l -v逐个用wsl --unregister 发行版名删除这步会删光对应发行版的所有数据需要彻底移除WSL运行时在设置或PowerShell里卸载Windows Subsystem for Linux应用最后再考虑用dism关闭两个Windows功能顺序反了容易残留目录因为Windows功能一旦被禁用某些清理操作就找不到目标了。另外wsl --unregister是彻底删除没有回收站操作前先想想是不是要做备份。提醒一句如果后面还要继续用WSL就没必要走到第4步保留WSL运行时只删自己不要的发行版就够了。6.6 其他高频词快速过一遍我把这些年被问得最多、热搜里也反复出现的词条汇总一下基本都能在WSL里解决需求快速处理方法wsl --update很慢加--web-download或手动下载内核MSI安装WSL里用binwalk加EPEL源后dnf install binwalk还需要python3-pip装依赖WSL里跑QEMUdnf install qemu-system-x86图形界面依赖WSLg或外部X serverWSL里装CUDAWindows侧先装支持WSL的NVIDIA驱动Rocky里再装CUDA ToolkitPyCharm连WSL新版PyCharm原生支持WSL解释器直接添加即可官方发行版快速安装wsl --install -d ubuntu-24.04但Rocky不在此列多提一句搜wsl --install -d ubuntu-24.04热搜词的人大概率是刚接触WSL想装Ubuntu但发现列表里没有Rocky。这篇文章的思路完全可以迁移到Ubuntu上只是Ubuntu有更简单的官方路径Rocky才需要走导入流程。等我把这些流程全摸透之后最大的体会是WSL跑Rocky Linux这件事核心不是能不能装而是装完之后能不能像普通Linux一样管理。很多人卡在导入、用户、systemd、Docker这几关本质上是没理解WSL的初始化流程和传统Linux启动流程的区别。多说一句导入完Rocky Linux后第一时间记得做一次备份把wsl --export的tar包放一份到移动硬盘。后面不管把系统折腾坏成什么样十分钟就能回到初始状态。我自己现在开发机上Rocky和Ubuntu各跑一个WSL实例分工明确几乎不再开虚拟机了。