资讯动态

WSL2迁移到F盘并配置ROS Noetic完整指南

发布时间:2026/10/9 3:10:03 来源:尧图企业网站定制
上个月帮同学配机器人开发环境打开笔记本一看C盘只剩不到40GWindows更新和VS Code缓存早就把256G的SSD塞得差不多了。这种情况如果还按传统装法把WSL2放在默认路径Ubuntu 20.04加上ROS Noetic Desktop-Full再算上后续catkin编译生成的build和devel目录、Gazebo模型缓存C盘很快就会红得发紫。所以这次我干脆直接把WSL2整个实例迁到F盘再在里边把ROS Noetic一次配好。这篇记录适合正在折腾WSL2、想装ROS Noetic、又不想让C盘被榨干的朋友也适合已经按默认路径装完WSL2、打算抢救C盘空间的人。我把完整过程分成了“装WSL2、迁F盘、装ROS、调Windows侧性能”几个相对独立的阶段每个阶段都附上了我实际踩过的坑和对应解法。尤其像“wsl2尚未准备就绪”“下载慢”“set-version转换卡死”这类高频问题我会在最后一章给出一套可复现的排查链路而不是只丢给你一句“重装试试”。1. 为什么ROS这套环境一定要装在WSL2“里面”不可1.1 WSL2默认装在C盘ROS的“体积账”一开始就要算清WSL2看起来是命令行窗口实际上是一个轻量虚拟机。每个发行版在Windows侧对应一个ext4.vhdx虚拟磁盘文件默认放在%LOCALAPPDATA%\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_...\LocalState\ext4.vhdx。这个文件不是“安装时多大就一直多大”它会随着你在Linux侧写文件、装软件、编译代码持续增长而且默认不会自动缩回去。ROS Noetic是ROS1的最终版本官方支持的是Ubuntu 20.04 Focal。装一个ros-noetic-desktop-full包本身加依赖通常要占4到6GB可真正吃空间的是后续开发过程catkin_make/catkin build的中间文件动辄几个GBGazebo模型库、rviz配置、bag文件、pip缓存、apt缓存全是隐形杀手。如果系统在C盘这些全都要算到C盘头上。所以核心思路很简单让这个vhdx文件落在F盘C盘只保留WSL2内核和少量系统组件。这个思路和“把游戏从C盘挪到D盘”很像但操作方式完全不同因为WSL2没有图形化的“修改安装位置”选项。1.2 虚拟机和WSL2该怎么选连启动速度一起算有人会问既然都要占空间为什么不用VirtualBox或者VMware直接装一整个Ubuntu 20.04这个我做过对比。传统虚拟机有完整内核、完整桌面、完整的虚拟化开销跑Gazebo当然没问题但那意味着每次开机都得先打开虚拟机软件内存占用按GB算Windows这边再干别的就可能卡。而且虚拟机的磁盘镜像通常比WSL2的vhdx还要膨胀得更快。WSL2在体验上是“命令行的即时感”启动秒级和Windows共享网络和剪贴板还能直接用VS Code Remote连进去。ROS开发的大部分操作本来就在终端里完成rviz和Gazebo的窗口可以通过WSLg直接显示到Windows桌面效果和原生应用基本没差别。缺点是跨Windows目录读写文件时会慢这个我后面专门讲属于“知道边界就能绕开”的问题。1.3 迁移方案的底层逻辑export/import才是正道WSL2的发行版迁移官方支持的命令就是wsl --export和wsl --import。原理是把整个根文件系统打包导出成一个tar文件然后从tar恢复到另一个位置。这比“拷贝vhdx文件”更稳因为export时WSL会做一致性快照避免直接拷贝时文件系统处于不一致状态。在我的方案里先让WSL2默认装在C盘然后export成tar再import到F盘最后把C盘的原实例删掉。这样整个过程对数据最安全也保留了原来的所有用户配置和已装环境。后面我会把每一步命令写清楚包括那一步容易被忽略的“删除原实例前一定先验证新实例能跑”。2. 第一阶段把WSL2本体和Ubuntu 20.04落起来2.1 开启虚拟化与两个Windows功能这步的坑最多WSL2不是纯软件模拟它依赖Windows的虚拟机平台。很多人执行wsl --install后提示“wsl2无法启动因为此计算机上未启用虚拟化”根子就在两个地方要么BIOS里没开虚拟化要么Windows功能没装全。先看BIOS。Intel平台对应VT-xAMD平台对应SVM不同主板叫法不一样但目标都是把CPU虚拟化打开。开机进BIOS找到“Intel Virtualization Technology”“SVM Mode”“Secure Virtual Machine”这一类的选项设置为Enabled。这一步不做好后面装什么都没用。然后在Windows里启用两个功能项。以管理员身份运行PowerShell逐条执行dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart执行完重启电脑。这里注意很多教程只说“开启WSL”漏了VirtualMachinePlatform结果就是发行版能装、版本却只能停在WSL1或者wsl --set-version时一直失败。记住VirtualMachinePlatform才是WSL2的底层依赖。重启之后用任务管理器验证一下CtrlShiftEsc打开任务管理器切到“性能”页看CPU节点右下角有没有“虚拟化已启用”。如果显示“已启用但未使用”或直接没有去BIOS再检查一遍。2.2 用命令安装WSL2下载慢时的两条替代路径新版Windows支持直接执行wsl --install这个命令会根据当前系统默认装WSL2并安装一个默认发行版。如果只想装Ubuntu 20.04可以加参数wsl --install -d Ubuntu-20.04但这里有几个现实问题。第一wsl --list --online列出的发行版不一定包含Ubuntu-20.04新版WSL经常把20.04砍掉或者藏起来默认推Ubuntu-24.04。第二下载过程走微软CDN国内网络经常卡在某个百分比不动这就是热词里反复出现的“wsl2下载慢”。我实际用的方法是分两条路绕开下载瓶颈内核更新包离线装。访问微软官方下载中心搜索“WSL2 Linux kernel update package for x64 machines”下载MSI文件手动安装。这一步基本秒完装完内核再执行wsl --set-default-version 2。发行版用商店离线包。如果wsl --install -d Ubuntu-20.04一直卡在下载就直接去微软商店页面下载Ubuntu 20.04的离线安装包后缀一般是.appx或.msixbundle下载后放到本地管理员PowerShell里执行Add-AppxPackage -Path 文件路径完成安装。这两条路合起来能躲开大部分“WSL下载慢”问题而且不依赖第三方脚本稳妥。2.3 精确落地Ubuntu 20.04而不是最新版为什么必须强调20.04因为ROS Noetic的二进制包只对focal20.04做完整适配。硬要在Ubuntu 22.04或24.04上装Noetic你得自己源码编译一堆依赖遇到APRIL版本不兼容、Boost版本冲突的概率极高折腾一轮下来比搬家还累。装完Ubuntu 20.04后第一次启动会要求创建用户名和密码。这里我建议用户名用简单全小写的英文比如ros、dev不要带大写和中划线。后面导入导出时这个用户名会涉及到默认用户恢复逻辑名字越简单越不容易在配置里写错。启动命令wsl -d Ubuntu-20.04进系统后先更新一遍sudo apt update sudo apt upgrade -y这一步可以提前把基础依赖拉下来也能顺便确认网络、apt源、系统完整性都没有问题。2.4 验证WSL2状态给后续迁移留个检查点打开PowerShell执行wsl -l -v正常情况下应该看到类似“Ubuntu-20.04 WSL 2 2”这种结果。Version列必须是2如果显示1执行wsl --set-version Ubuntu-20.04 2把它转成WSL2。转换过程可能会花几分钟期间勿关闭电脑。还有一个容易忽略的点如果没有设置过默认发行版wsl命令进入的可能是别的实例。建议最开始就执行wsl -s Ubuntu-20.04把Ubuntu 20.04设为默认发行版。这一步能避免后面命令串了实例尤其是你已经装过多个发行版的时候。3. 第二阶段把整套系统从C盘搬到F盘3.1 为什么不直接改安装路径而要export再import有人会尝试直接把LocalState文件夹里的ext4.vhdx剪切到F盘然后改注册表路径。这个方法理论可行但风险很高vhdx被复制时如果WSL还在运行文件处于占用和写状态容易损坏而且手动改注册表匹配新旧路径一个GUID写错就找不到发行版。稳妥做法永远是wsl --export导出tar再wsl --import恢复。这个流程把整个文件系统的状态固化下来跨盘迁移只是“打包-搬家-解包”的等价过程不会出现文件系统损坏的幺蛾子。另外这个过程还可以顺便备份环境好处后面会体现。3.2 导出前的清理与导出命令导出前先做一次清理省得把垃圾也打包进tar。在WSL终端里执行sudo apt clean pip cache purge sudo rm -rf /tmp/*然后退出WSL回到PowerShellwsl --shutdown这一步很重要。wsl --shutdown会把所有WSL实例彻底停掉让vhdx保持一致状态。接下来导出wsl --export Ubuntu-20.04 D:\wsl_backup\ubuntu20.tartar文件会非常大正常情况至少几个GB如果已经装了不少东西可能到十几GB。D盘的空间要提前确认够用。导出期间屏幕不会有进度条耐心等它执行完如果导出卡住不动超过十几分钟多半是D盘空间不足或者磁盘IO满了。3.3 导入到F盘并注册新实例先在F盘建好目标目录然后执行mkdir F:\WSL\Ubuntu20 wsl --import Ubuntu-20.04-F F:\WSL\Ubuntu20 D:\wsl_backup\ubuntu20.tar --version 2执行完F盘的目标目录里会出现一个ext4.vhdx文件这就是新的系统盘。注意这里我把实例名称改成了Ubuntu-20.04-F目的是和C盘原实例区分开避免后面误操作。实例名可以随便起不影响系统内部配置。导入后验证一下wsl -l -v wsl -d Ubuntu-20.04-F能看到实例出现在列表里版本是2就说明迁移成功了。3.4 导出后默认变root的修复wsl.conf与UID这一步是很多人迁移完F盘后蒙圈的地方新实例打开后居然是root之前创建的用户不见了。其实用户和home目录都还在文件系统里只是Windows侧丢失了“默认用户”的元数据。wsl --export/--import只打包Linux根文件系统不负责保存Windows注册表里那条默认用户配置。最简单的修复方法是在Linux侧写配置。以root身份进入系统后编辑/etc/wsl.confsudo nano /etc/wsl.conf写入内容[user] defaultjohndoe [network] hostnameubuntu2004 [boot] systemdtrue把johndoe换成你自己的用户名然后退出系统PowerShell里执行wsl --shutdown再重新进入就会恢复成普通用户登录。systemdtrue这行我建议顺手加上ROS生态里有些服务会用到systemd开启后能少很多麻烦。如果导出前系统里压根没建过普通用户那就root进去手动建useradd -m -s /bin/bash johndoe passwd johndoe usermod -aG sudo johndoe把johndoe替换成你要的用户名再回到上面配置wsl.conf的流程。3.5 清理旧实例并处理vhdx膨胀问题F盘新实例验证能正常登录、能开终端之后再回头删C盘旧实例wsl --unregister Ubuntu-20.04这个命令会把原实例的vhdx整个删掉释放C盘空间。执行前请再一次确认wsl -d Ubuntu-20.04-F能正常进系统、home目录文件都在。删错了没有后悔药。关于vhdx膨胀还有两个实用技巧。新版WSL支持wsl --manage Ubuntu-20.04-F --set-sparse true开了稀疏文件功能vhdx不再“占位即占满”理论上体积控制更稳。如果以后发现vhdx变得异常大先wsl --shutdown然后管理员命令行里用diskpart压缩diskpart select vdisk fileF:\WSL\Ubuntu20\ext4.vhdx attach vdisk readonly compact vdisk detach vdisk exit压缩的时间取决于磁盘占用量一般几分钟。这是治标的办法平时注意不要把大文件堆在Linux侧就够用了。4. 第三阶段在F盘的Ubuntu 20.04里完整部署ROS Noetic4.1 换源这件事先换apt再做ROS源才不会返工系统刚从tar恢复过来apt源还是Ubuntu官方源。国内网络连官方源的速度时好时坏尤其apt upgrade拉几百MB包的时候慢到你想砸键盘。先把/etc/apt/sources.list换掉sudo sed -i s//archive.ubuntu.com//mirrors.tuna.tsinghua.edu.cng /etc/apt/sources.list sudo sed -i s//security.ubuntu.com//mirrors.tuna.tsinghua.edu.cng /etc/apt/sources.list sudo apt update不想用清华源换成阿里云镜像也一样把域名整体替换就行。换完源注意看输出有没有报错有些老系统里源格式不一样需要手动打开文件核对。4.2 建立包管理源安装ROS Noetic Desktop-FullROS Noetic没有官方PPA而是专门维护了一个apt源。先加keysudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654再用lsb_release -sc自动识别版本添加到源sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list这里有个小坑packages.ros.org在国内偶尔连接不畅。如果apt update时ROS源明显超时可以把源地址换成国内镜像例如一些高校和云厂商提供的ros镜像格式保持一致deb http://mirrors.ustc.edu.cn/ros/ubuntu focal main换镜像后key不变重跑sudo apt update即可。下一步安装系统工具链和ROS本体sudo apt update sudo apt install -y curl wget git build-essential python3-pip python3-rosdep python3-rosinstall python3-catkin-tools sudo apt install -y ros-noetic-desktop-fullros-noetic-desktop-full包含ros核心、rviz、gazebo、tf、nav、moveit相关组件是ROS开发者最常用的全家桶套餐。不要贪便宜只装ros-noetic-ros-base后期你会发现每个功能包都要单独补依赖来回配源很烦躁。安装过程会持续一段时间下载量比较大网速一般的话可以先去干点别的。装完后先把环境变量写进bashrcecho source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc验证一下roscore能启动看到started core serviceROS本体就通了。4.3 rosdep init/update的网络问题与绕过接下来是ROS安装最经典的一道坎sudo rosdep init和rosdep update。rosdep是ROS的依赖管理工具编译功能包时会根据package.xml里的依赖声明自动安装系统依赖。问题在于它默认从raw.githubusercontent.com拉数据国内网络经常失败报错信息通常让你以为命令写错了。我的处理顺序是这样。先正常执行sudo rosdep init rosdep update如果一次通过恭喜你跳过下面所有内容。如果卡住或者报网络错就手动绕开。思路很简单把rosdep需要的yaml数据下载到本地让它从本地读不再访问外网。之前提到我在C盘第一次装好的系统里把整个rosdistro仓库克隆了下来。对当前F盘实例可以这样操作git clone https://github.com/ros/rosdistro.git ~/rosdistro sudo mkdir -p /etc/ros/rosdep/sources.list.d/ sudo tee /etc/ros/rosdep/sources.list.d/20-default.list EOF yaml file:///home/$USER/rosdistro/rosdep/osx-homebrew.yaml osx yaml file:///home/$USER/rosdistro/rosdep/base.yaml yaml file:///home/$USER/rosdistro/rosdep/python.yaml yaml file:///home/$USER/rosdistro/rosdep/ruby.yaml gpg file:///home/$USER/rosdistro/rosdep/rosdep.key EOF rosdep update这里有个细节file:///home/$USER/...中$USER在sudo的tee命令里可能会变成root导致路径变成/home/root/rosdistro。我建议先用普通用户操作或者把路径写死成你真实的home目录比如yaml file:///home/johndoe/rosdistro/rosdep/base.yaml然后继续执行rosdep update。如果提示缺少某个yaml路径打开/etc/ros/rosdep/sources.list.d/20-default.list对比一下 rosdistro仓库里实际存在的文件补一下即可。这个方法的本质是把rosdep从“联网拉数据”变成“读本地数据”和源换到哪、网络怎么抖都没关系。4.4 环境变量、catkin工作空间与烟雾测试ROS装完建一个标准工作空间mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_init_workspace cd ~/catkin_ws catkin_make首次编译会在~/catkin_ws下生成build和devel目录同时把工作空间的环境自动被后续的setup.bash接管。把工作空间的setup也写进bashrcecho source ~/catkin_ws/devel/setup.bash ~/.bashrc source ~/.bashrc然后做三个烟雾测试分别验证核心调度、可视化、仿真器roscore rviz gazebo三个窗口能各自正常弹出说明ROS和GUI侧都通了。如果rviz或gazebo弹出报错说“cannot connect to display”先不要慌检查WSL版本和Windows侧是否满足WSLg条件这部分我下一章展开。5. 第四阶段Windows侧的工具对接与性能调优5.1 VS Code Remote-WSL代码就放Linux侧里写Windows和Linux之间交换文件很多人喜欢直接在资源管理器里拖来拖去这个习惯在WSL2上要改掉。正确的开发姿势是把代码放在Linux侧用VS Code Remote-WSL连进去写。做法Windows侧装好VS Code扩展商店里装“Remote Development”扩展包。然后在WSL终端里进入项目目录cd ~/catkin_ws code .这个命令会自动拉起Windows的VS Code并通过Remote方式连接到WSL。第一次连接会在Linux侧自动部署一个server组件需要一点时间之后就非常顺滑。终端、调试、Git都能无缝工作而且代码读写都发生在ext4文件系统上速度有保证。5.2 别在/mnt/f下编译ROS包IO慢不是错觉很多人在标题里看到“F盘”会下意识想把ROS工作空间也建在F盘下让“文件好找”。我在第一次用WSL2时就这么干过结果catkin_make慢到让我怀疑电脑坏了。原因在于WSL2访问/mnt/f这类Windows挂载路径走的是9P协议每读一个小文件都要在Windows和Linux上下文之间往返。catkin这种小文件密集型编译任务在Linux侧/home/user/catkin_ws编译可能只要3分钟放到/mnt/f/...下能拖到20分钟甚至更久。明确结论F盘只放vhdx系统盘ROS代码和工程文件仍然放Linux侧home目录。如果你想在Windows侧快速浏览工程文件用资源管理器地址栏输入\\wsl$\Ubuntu-20.04-F\home\johndoe\catkin_ws这走的是WSL内置的共享机制比/mnt/f跨协议来回倒腾舒服多了。5.3 WSLg、rviz/gazebo显示与CUDA直通的前提现在Windows 11以及较新的Windows 10 21H2都内置了WSLg。WSLg的作用是让Linux GUI程序直接弹到Windows桌面上不需要额外配置X Server。rviz、Gazebo、rqt这类应用只要系统版本够新、WSL版本够新打开就能显示。如果弹不出来依次排查三件事Windows里执行wsl --update更新到最新WSL显卡驱动更新到支持WSLg的版本确认wsl -l -v里实例的版本是2。零基础用户不要一开始就走VcXsrv配置DISPLAY那条老路WSLg已经把它替代掉了。关于CUDA搭配热词“wsl2安装cuda”说一点WSL2支持GPU直通但前提是Windows侧安装了支持WSL2的NVIDIA驱动不是传统桌面驱动那套逻辑然后Linux侧正常安装CUDA Toolkit。ROS生态里做视觉、深度学习仿真时这个直通能力非常关键rviz渲染点云也会受益。这一步不是必须建议先把ROS跑通再加。5.4 用.wslconfig控制内存和CPU防止Windows被卡爆WSL2默认最多占宿主机内存的50%在16G内存的笔记本上这个数字很吓人。Gazebo刚启动Windows侧再开浏览器整个系统就明显变卡。解决办法是在Windows用户目录下创建.wslconfig文件[wsl2] memory8GB processors4 swap4GB localhostForwardingtrue [experimental] autoMemoryReclaimgradual sparseVhdtruememory按你电脑总内存的40%到50%设processors按逻辑核心数减半。改完执行wsl --shutdown再重新进入WSL生效。注意.wslconfig是放在Windows用户目录不是WSL系统里很多人在Linux侧找不到文件就以为配置没生效。autoMemoryReclaim这项在新版WSL里很实用它会让WSL在空闲时自动把内存归还给Windows。配合之前提到的--set-sparse true长期跑下来C盘和内存压力都会小很多。6. 实测中反复踩过的坑与排查链路6.1 “尚未准备就绪”“无法启动”的排查三步把几个高频报错集中到一条排查链路里按顺序走不再碰运气。报错/现象最常见原因验证/解决“wsl2尚未准备就绪”VirtualMachinePlatform未启用管理员PowerShell里dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart重启。“wsl2无法启动因为此计算机上未启用虚拟化”BIOS虚拟化关闭进BIOS开启VT-x/SVM任务管理器确认“虚拟化已启用”。发行版装完后Version列是1WSL2内核更新包缺失微软官网下载WSL2内核安装包执行wsl --set-default-version 2。wsl命令行直接报“未安装”旧版本残余冲突或者安装中断先wsl --update再wsl --install -d Ubuntu-20.04不行就卸载WSL相关功能后重来。核心原则不要只盯着一行报错就重装。先确认硬件虚拟化、再确认Windows功能、最后才怀疑内核包。6.2 下载慢到想放弃时的离线安装路线如果wsl --install卡在下载、商店页面转半天加载不出来不必硬扛。离线路线分两段第一段WSL2内核MSI包手动安装。去微软官方下载中心找“WSL2 Linux kernel update package for x64 machines”执行后WSL2内核就有了。第二段发行版离线包。商店里找到Ubuntu 20.04的下载链接拿到.appx或.msixbundle文件后管理员PowerShell执行Add-AppxPackage -Path 完整路径。装完开始菜单里就会出现Ubuntu图标。这个组合适合内网环境、办公室带宽受限、或者网络协议被干扰的场景。我也不建议多线程下载软件硬拉微软服务器的文件容易导致包损坏签名校验失败后又白折腾一遍。6.3 版本转换卡死为什么我直接用--version 2wsl --set-version Ubuntu-20.04 2是把WSL1实例转换成WSL2的命令。转换的原理是把现有的文件系统完整拷贝到新的vhdx里再通过wsl --shutdown完成切换。问题在于这个过程对磁盘空间和磁盘性能要求很高C盘剩余空间不足时它会卡在“正在进行转换这可能需要几分钟”几个小时不动。我的建议是不用这个命令折腾老实例。直接走“最终版迁移法”也就是标题这套流程——在WSL1实例里导出tarimport时直接带--version 2一步到位到WSL2。这个命令在目标盘空间足够时比原地转换稳定得多而且天然满足“搬到F盘”的需求。一个操作解决两个问题。6.4 从Win10到Win11的差异与备份习惯最后说两个环境层面的差异。Windows 11对WSL2的支持是默认且完整的WSLg、GPU直通、系统d支持都是开箱即用体验比Windows 10顺滑很多。如果你的电脑能升Win11WSL2相关的坑会少一截。我自己的备份习惯是环境稳定后每个月wsl --export一次tar文件放到移动硬盘或者网盘。这个习惯救过我一次——某次手动更新内核后WSL起不来我不重新折腾直接导入上个月的备份花十分钟恢复原状。还有就是别在迁移成功后删旧的tar文件。tar文件虽然大但在你完全确认新环境稳定性前它就是你的保险丝。确认跑完一周、功能包都正常之后再决定是保留还是删除。最后分享点个人体会。这套“WSL2迁F盘ROS Noetic”的组合天然适合机器人和自动驾驶方向的工作流Windows侧做文档、走日常办公Linux侧做编译、跑仿真两边互不干扰。而且export/import迁移法通用性很强你甚至可以把这套环境从家里电脑同步到实验室电脑先把系统装好做一次全量导出到新机器上直接导入ROS环境一分不差。配环境这件事最怕的不是出问题而是出了问题每次都从头再来。只要把“导出备份”这个概念刻在脑子里WSL2出任何幺蛾子都能快速回血。这篇过程写下来也是希望你不要把时间浪费在我踩过的那些坑上直接从一份稳定可复用的环境开始。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑