资讯详情

资讯详情

WSL 2 中安装 Rocky Linux 完整指南:自定义 rootfs 导入与配置

WSL这个东西很多人把它当成“在Windows里开一个Ubuntu终端”来用。确实微软商店里默认能搜到的就是Ubuntu、Debian这些但WSL从来不是只能装这几家。前段时间要在本机复现一个RHEL系的环境手头正好只剩Windows又不想开虚拟机就把Rocky Linux塞进了WSL里。整个过程折腾下来其实不算难但网上资料很零散有的说要先装Docker有的干脆推给你一个GitHub脚本。这篇文章把我踩过的坑和最终跑通的完整流程写清楚包括怎么自己打包rootfs、导入后怎么配systemd和用户、怎么解决静态IP和空间不释放的问题。适合需要在Windows上开发、又要保持RHEL系环境一致性的朋友参考。1. 环境准备先把WSL底子打好1.1 检查Windows版本和WSL状态在开始之前先确认你用的是Windows 10 2004build 19041以上版本或者Windows 11。WSL2依赖Hyper-V虚拟化平台老版本Win10跑不动。查看版本很简单按下Win R输入winver回车弹出来的窗口里会写明系统版本和内部版本号。然后检查WSL本身的状态。打开PowerShell或Windows Terminal执行wsl --status如果系统提示“默认版本2”后面还带一串内核信息说明WSL已经装好并且正常。如果提示“适用于 Linux 的 Windows 子系统没有已安装的分发版”说明内核服务在但还缺一个发行版注册信息这不影响后续操作。再执行一下wsl --version能输出版本号的最好说明你用的是新版WSL应用商店版。如果你什么输出都没有或者提示“WSL needs updating”那就得先升级WSL再往下走。1.2 安装或更新WSL全新安装WSL很简单管理员身份打开PowerShell执行wsl --install --no-distribution--no-distribution这参数很关键意思是只装WSL本体不默认安装Ubuntu免得后面多一个用不上的发行版。如果这条命令因为网络或商店策略问题报错比如403试试wsl --update --web-download--web-download会跳过微软商店通道直接从网络分发端点下载最新WSL包。若你已经装了旧版WSL但版本太老同样可以用这条命令升级。装完以后先确认虚拟化平台功能是开着的。在管理员PowerShell里执行dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart两条都显示操作成功之后重启电脑。重启回来再设置WSL 2为默认版本wsl --set-default-version 2到这里WSL本身的底子就打好了任何发行版在这上面跑都行。1.3 确认虚拟化和BIOS设置有时候WSL启动报错不是软件问题而是BIOS里虚拟化没开。重启进BIOS开机按Del或F2具体看主板找到Intel VT-x或AMD SVM的选项确认是Enabled状态。Windows任务管理器里也能看到——在“性能”选项卡下面找“虚拟化”这一行如果是“已启用”那就没问题。另外Windows安全中心的“内核隔离”和“内存完整性”功能在某些机器上会和WSL2冲突如果后续启动发行版莫名其妙卡死可以试着关掉这两个安全选项。不过大部分情况下默认开启也没事不用提前动。2. 为什么没有现成的Rocky Linux以及方案怎么选2.1 微软商店不提供Rocky Linux用wsl --install -d可以安装的发行版列表里常见的是Ubuntu、Debian、Kali、openSUSE、SLES、Oracle Linux这些没有Rocky Linux也没有AlmaLinux。这是很正常的现象因为微软集成的发行版需要官方和微软两边做认证和打包Rocky Linux团队虽然一直在推进但目前还没有进入官方商店列表。所以别浪费时间在商店或--install -d上找Rocky换条路走。2.2 几种可行方案对比既然商店不直接提供社区里常见的做法有三类方案优点缺点推荐程度从Docker镜像导出rootfs再导入镜像维护规范干净可控一条命令导出本机得有Docker或者能在别的机器上先做好tar包高在物理机/虚拟机里打包根文件系统可定制程度最高能提前装好软件需要一台Rocky环境准备工作重中用第三方工具导入如LxRunOffline、wsl-distro一条命令完成适合懒人工具维护参差不齐存在安全风险低我基本不推荐第三种。WSL的配置方式每一年都在变很多第三方工具已经停止维护导入完可能默认用户和systemd配置都不对踩完坑的功夫还不如自己学会rootfs导入。2.3 为什么rootfs导入这条路最靠谱WSL支持把一个Linux发行版打包成tar格式的根文件系统然后通过wsl --import命令导入。本质上WSL不关心你是Ubuntu还是Rocky它只在乎你有没有一个完整的根目录结构以及这个结构里有没有一个能对接WSL内核的init流程。Rocky Linux官方Docker镜像本身就是一份完整的rootfs质量有保证所以从镜像导出、再导入WSL是最省事也最稳妥的路线。这条路还有个好处你可以把做好的tar包留档以后环境坏了随时重新导入不用再从头配置。3. 核心实操制作并导入Rocky Linux根文件系统3.1 方案A用Docker导出rootfs先确认本机有Docker环境Docker Desktop就行。然后在终端里执行docker pull rockylinux:9拉取的是Rocky Linux 9的官方镜像。如果你的部署环境是Rocky 8可以改成rockylinux:8下面命令里的镜像名对应换掉就行。拉完以后创建一个容器并保持它运行一会儿docker run -d --name rocky9 rockylinux:9 sleep infinitysleep infinity就是让容器进程常驻后台这样容器状态是up的导出文件系统时最稳妥。然后导出docker export rocky9 -o rocky9.tar导出完成后清理容器docker rm rocky9重点提醒这里用的是docker export不是docker save。export导出的是容器的文件系统层解出来就是一个Linux根目录save保存的是镜像的元数据和分层WSL不认识那种格式。这两个命令长得像实际用途完全不同。如果想在导出前往系统里塞一些基础包可以在Docker里先装好再导出docker run -it --name rocky9 rockylinux:9 bash进入容器后先执行dnf update -y装更新再装自己需要的包完成后exit退出继续用docker export rocky9 -o rocky9-custom.tar导出。这种方式适合需要“定制版”系统镜像的场景。3.2 方案B在临时Linux中压缩打包没有Docker环境的话只要手头有一台能用的Rocky Linux虚拟机或者云主机也可以自己打包。用rsync把整个根目录同步到一个临时文件夹mkdir /rocky-root rsync -aAXv --exclude{/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/mnt/*,/media/*,/lostfound} / /rocky-root/同步完以后打包这个临时文件夹tar -czf /tmp/rocky9-rootfs.tar.gz -C /rocky-root .没有rsync的话直接用tar带exclude参数也行sudo tar --exclude/dev --exclude/proc --exclude/sys --exclude/tmp --exclude/run --exclude/mnt --exclude/media --exclude/lostfound -czf /tmp/rocky9-rootfs.tar.gz /但要注意方案B打包出来的tar包解压后目录层级很容易出错。建议打包和解包都用-C参数指定根目录避免多套一层目录。注意方案B打包前务必先清理宿主机上跟本身无关的服务和配置尤其是/etc/fstab。WSL不需要挂载宿主机的物理磁盘如果你把原机器的fstab照搬过去导入后启动很可能会报磁盘挂载错误。3.3 把rootfs导入WSL拿到tar包后放到Windows侧一个方便管理的目录。假设文件名是rocky9.tar放在D:\WSL\下面。然后新建一个目录用于存放这个发行版的虚拟磁盘文件mkdir D:\WSL\Rocky9执行导入命令wsl --import Rocky9 D:\WSL\Rocky9 D:\WSL\rocky9.tar --version 2参数一个一个解释Rocky9发行版的名称以后执行wsl -d Rocky9进入系统都要用这个名字。D:\WSL\Rocky9VHDX虚拟磁盘文件存放目录WSL导入的时候会在这个目录下生成一个ext4.vhdx文件。D:\WSL\rocky9.tar刚才导出的tar包路径。--version 2强制使用WSL 2。WSL 1的性能、兼容性都差太多不建议用。导入完成后启动wsl -d Rocky9不出意外的话你会直接进入root用户的shell提示符前缀显示类似[root主机名 /]#。这是因为tar包里没有配置默认普通用户WSL就默认以root身份进入只要root密码未设置就直接放行。3.4 自定义默认用户和systemd进来是root但日常开发不能用root得建一个普通用户。在Rocky的shell里执行echo root:root123 | chpasswd useradd -m -G wheel dev echo dev:dev123 | chpasswd第一条给root设置密码避免某些工具因为空密码拒绝执行sudo第二条新建一个叫dev的用户并加入wheel组sudo权限组第三条设置dev的密码。然后写WSL配置文件/etc/wsl.confcat /etc/wsl.conf EOF [user] defaultdev [boot] systemdtrue EOF这里面两个配置项都重要。[user] defaultdev的意思是以后进入WSL默认身份是dev不再是root[boot] systemdtrue是让WSL启动时自动拉起systemd守护进程没有这一项Rocky里的systemctl命令基本没法用很多服务管理功能都会失效。保存后回到Windows PowerShell重启WSL让配置生效wsl --shutdown wsl -d Rocky9再次进入后执行验证whoami systemctl statuswhoami应该输出devsystemctl status应该显示当前系统的systemd在运行没有报错。如果systemctl status提示“System has not been booted with systemd”大概率是wsl.conf没生效或者WSL版本太旧回去确认[boot] systemdtrue的拼写和位置。4. 落地配置把Rocky Linux调成日常顺手的状态4.1 DNF源与基础工具干净的Rocky导入后第一件事是配软件源。官方源在某些网络环境下访问比较慢建议换成国内镜像站。以清华镜像源为例修改Rocky的repo文件sed -e s|^mirrorlist|#mirrorlist|g \ -e s|^#baseurlhttp://dl.rockylinux.org/$contentdir|baseurlhttps://mirrors.tuna.tsinghua.edu.cn/rocky|g \ -i.bak \ /etc/yum.repos.d/Rocky-*.repo这个sed命令做的事很简单把mirrorlist那行注释掉把#baseurl那行取消注释并替换成清华镜像地址。-i.bak会在修改时生成.bak备份文件万一改错可以恢复。然后重建缓存dnf clean all dnf makecache验证当前仓库是否正常dnf repolist能看到BaseOS、AppStream这些仓库就说明源OK。这里有个小知识Rocky 9默认有些软件包放在CRB仓库里比如部分开发库如果需要可以提前启用dnf config-manager --set-enabled crb接下来更新系统和安装基础工具dnf update -y dnf install -y vim git wget curl tar unzip net-tools bind-utilsbind-utils里的dig、nslookup排网络问题的时候很好用net-tools提供了ifconfig、netstat这些老命令很多人习惯了它们装上不亏。4.2 安装LibreOffice等RPM软件包的两种方式如果要在Rocky里装LibreOffice常见思路有两条。第一条直接从软件源装。Rocky的AppStream仓库里带LibreOffice执行dnf install -y libreoffice这个包比较大可能要下载几百MB耐心等就行。如果机器配置一般也可以只装核心组件按需选择更灵活。第二条官网下载RPM包手动安装。假设你在Linux x86-64机器上下载了LibreOffice 7.4.7.2的RPM压缩包解压tar -xvf LibreOffice_7.4.7.2_Linux_x86-64_rpm.tar.gz cd LibreOffice_7.4.7.2_Linux_x86-64_rpm/RPMS然后执行dnf install -y ./libreoffice*.rpm注意这里一定用dnf install 本地路径/*.rpm不要用rpm -ivh *.rpm。dnf会自动解析并安装依赖rpm不会。当年我图省事直接rpm装结果少了七八个依赖一个个手动补包补到怀疑人生。装好以后即使WSL里没有图形界面也不影响使用LibreOffice的无头模式比如把docx转pdflibreoffice --headless --convert-to pdf test.docx需要图形界面的话新版WSL自带WSLgWindows 11或者Windows 10 21H2以上版本都支持直接运行libreoffice --writer就能弹出图形窗口。4.3 静态IP与端口转发说一个实际情况WSL2默认走NAT网络发行版每次重启IP都可能变真正意义上的“固定IP”在经典NAT模式下很难实现。但有两种主流解法。第一种解法镜像网络模式。如果你用的是Windows 11 22H2以上版本并且WSL已经升级到较新版本可以在Windows侧编辑C:\Users\你的用户名\.wslconfig[wsl2] networkingModemirrored保存后执行wsl --shutdown再重新进入。这种模式下WSL共享Windows的IP地址外面访问WSL监听的端口就等于访问Windows本机端口不需要额外做端口转发。实测下来本地开发和调用服务都非常顺手推荐有条件的人用这个。第二种解法端口转发适用于Windows 10或不想改镜像模式的场景。先在WSL里确认IPip addr show eth0 | grep inet拿到WSL的IP地址后在Windows管理员PowerShell里执行netsh interface portproxy add v4tov4 listenport8080 listenaddress0.0.0.0 connectport8080 connectaddressWSL的IP这句话的意思是Windows的8080端口收到的流量全部转发给WSL里的8080端口。缺点前面说了WSL重启后IP会变转发规则里的connectaddress也得跟着更新。不太适合长期用开发环境临时顶一下可以。另外如果只想在Windows本地访问WSL里的服务比如浏览器打开http://localhost:8080访问WSL里的Nginx那什么都不用配WSL2默认支持Windows到WSL的localhost转发。4.4 接入VSCode在WSL里做开发VSCode是绕不开的搭档。先在Windows侧安装VSCode然后安装微软官方的“WSL”扩展。装好扩展后在WSL终端里进入项目目录执行code .第一次运行会在WSL侧自动安装VSCode Server这个过程需要下载一些文件耐心等一下。装完以后VSCode窗口左下角会显示“WSL: Rocky9”表示你当前已经无缝连接到了WSL环境。终端、调试、远程文件浏览都能直接用体验非常接近原生Linux开发。如果执行code提示找不到命令手动把VSCode的bin目录加进PATHexport PATH$PATH:/mnt/c/Users/你的用户名/AppData/Local/Programs/Microsoft\ VS\ Code/bin建议把这一行追加到~/.bashrc里免得每次重开终端都要再设一次。4.5 开启CUDA和GPU能力WSL2支持CUDA加速宿主Windows只需要装好NVIDIA显卡驱动WSL内部就能调用GPU。要注意一个关键点在WSL里不要装NVIDIA显卡驱动驱动是Windows侧提供的在Linux里只需装CUDA Toolkit和配套库。Rocky Linux 9对应rhel9仓库执行dnf config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel9/x86_64/cuda-rhel9.repo dnf clean expire-cache dnf install -y cuda-toolkit安装完成后验证nvidia-smi nvcc --versionnvidia-smi能看到GPU信息说明驱动链路是通的nvcc输出了版本号说明Toolkit装好。有一点要记住nvidia-smi显示的是Windows宿主的驱动版本不代表Linux侧Toolkit必须和它一致只要驱动版本满足Toolkit的最低要求就行。装完CUDAPyTorch这类深度学习框架也能直接用GPU。安装PyTorch时用带CUDA的源pip install torch --index-url https://download.pytorch.org/whl/cu121然后跑一段简单代码确认GPU可用import torch print(torch.cuda.is_available())输出True就说明你的Windows-Linux混合环境已经有完整的GPU加速能力了。5. 高频故障与排查速查表5.1 wsl --install报403典型提示是已禁止(403)。这多半是Windows商店或系统网络策略限制导致的不是WSL本身坏了。解决办法优先用--web-download绕开商店通道wsl --update --web-download如果还不行直接到微软官方WSL的GitHub Releases页面手动下载最新的.msi安装包双击安装即可。这里我不放具体链接因为版本更新很快去项目Releases页面看最新的就是。5.2 WSL更新非常慢遇到wsl --update卡半天的情况通常是默认下载通道在部分网络环境下不稳定。可以加参数强制走Web通道wsl --update --web-download --no-progress如果依然很慢绕开更新命令手动下载msi包安装。注意更新过程中不要频繁中断WSL本体状态不一致后面各种报错会让你更头疼。5.3 删除文件后磁盘空间不释放WSL2的发行版数据都存在一个ext4.vhdx虚拟磁盘文件里。这个文件会不断增长但你在Linux里删除文件后它不会自动缩小。我遇到过删了30GB编译缓存Windows硬盘一点没少的情况。解决办法是手动压缩vhdx。第一步关闭所有WSL会话wsl --shutdown第二步找到对应的vhdx文件路径。如果导入时指定了目录比如本文里的D:\WSL\Rocky9\ext4.vhdx直接进去就能看到。如果是默认安装的发行版一般在C:\Users\你的用户名\AppData\Local\Packages\下面找起来比较费劲建议以后导入都指定目录。第三步用diskpart压缩diskpart select vdisk fileD:\WSL\Rocky9\ext4.vhdx attach vdisk readonly compact vdisk detach vdisk exit压缩完成后去资源管理器里看vhdx文件大小会明显缩小。注意压缩前确认没有WSL进程在运行vhdx文件也没被锁定。5.4 启动报error_file_not_found这个报错代码挺吓人WSL/service/createinstance/createvm/hcs/error_file_not_found但通常原因并不复杂最常见的是vhdx文件路径变了、或者Windows虚拟化功能被关闭、或者是WSL内部状态错乱。排查顺序是wsl --shutdown关闭所有WSL实例。检查D:\WSL\Rocky9\ext4.vhdx文件是否还在原位置路径有没有改动。检查VirtualMachinePlatform功能是否被关闭dism.exe /online /get-featureinfo /featurename:VirtualMachinePlatform如果上面都正常但依然报错还是重启Windows再试。实在不行就注销重装。这里再次强调前面导入用的tar包一定要留好遇到无法解决的问题时直接执行wsl --unregister Rocky9 wsl --import Rocky9 D:\WSL\Rocky9 D:\WSL\rocky9.tar --version 2重新导入再按第3章配置一遍wsl.conf就行。tar包是救命稻草别删。5.5 常见问题快速定位下面这个表格是我实际排障过程中的经验总结遇到类似提示可以直接照着排查现象大概率原因快速处理无法进入WSL提示Error code 403商店/网络策略限制用wsl --update --web-download或手动装msisystemctl不可用wsl.conf没生效或WSL太旧检查[boot] systemdtrue升级WSL默认用户不生效wsl.conf语法错误确保[user]段在文件顶部重启WSL跨文件系统操作极慢代码放在/mnt/c下把项目和缓存移到Linux侧目录无法访问Windows的共享目录挂载异常wsl --shutdown后重启检查/mnt下挂载CUDA不可用没装CUDA Toolkit或驱动太旧更新Windows侧NVIDIA驱动再装cuda-toolkit6. 实际使用的体会与进阶建议6.1 为什么最终选了Rocky LinuxCentOS停更以后Rocky Linux是社区接盘最成功的RHEL兼容发行版之一。如果你日常工作要跟RHEL系的服务器环境对齐用Rocky比用Ubuntu省心很多。尤其是写Shell脚本、配systemd服务、做CI/CD流水线的时候行为一致性会大大降低“本地能跑服务器不能用”的尴尬。而WSL作为贴身开发环境刚好能补上Windows生态和Linux生态之间的缝隙比开虚拟机轻量太多开机秒进磁盘占用也小。6.2 性能体验和文件存放位置WSL2本质是在虚拟机里跑一个完整Linux内核I/O性能在本地磁盘操作时还不错但跨文件系统混用会拖垮速度。我实测过在/mnt/c目录下执行npm install、编译C、构建Docker镜像速度比在Linux原生目录慢不少。原因在于跨文件系统的文件事件同步和权限转换都有额外开销。所以我的习惯是项目代码全部放在WSL内部的~/work目录Windows侧只放文档和资料需要交换文件时再复制。这样既保证Linux侧性能又不浪费Windows的文件管理便利性。6.3 备份和多环境并存的思路配好一套顺手的开发环境不容易建议定期用wsl --export导出整个发行版作为快照。比如把当前环境导出成文件wsl --export Rocky9 D:\backup\rocky9-env.tar以后环境坏了、改乱了直接wsl --unregister Rocky9注销再wsl --import导回来几分钟还原。还有一个思路是同时创建多个WSL发行版当作独立的环境模板。比如保留一个不带CUDA的干净Rocky 9用于发布验证一个带CUDA和深度学习框架的用于算法开发一个Ubuntu用于日常工具类脚本。环境之间互不污染切换也只需要敲一条命令。这种玩法WSL的生态支持得非常好比传统虚拟机灵活太多。最后再分享一个小经验刚导入完Rocky顺手把系统时区改一下不然容器默认UTC时区构建日志里的时间全是错的排查问题时会很烦躁timedatectl set-timezone Asia/Shanghai如果提示timedatectl不可用多半是systemd没起来回头检查wsl.conf的[boot] systemdtrue这一段。这套流程我前前后后跑了三遍每次都在不同的细节上踩坑写出来希望能帮你一次全部避开。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →