ARTICLE DETAIL

资讯详情

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

WSL2安装Ubuntu到D盘:--location参数与迁移实战

WSL2安装Ubuntu到D盘:--location参数与迁移实战 做开发这些年前前后后给不下十台机器装过WSL2每次都有同事跑来说我的C盘怎么又满了十有八九就是WSL2的虚拟磁盘在悄悄膨胀。WSL2确实好用但默认装完会把整个Ubuntu发行版塞进C盘用户目录下的AppData里随便跑点Docker、编译几个项目一两个月就能吃你二三十GB。所以这次整理一套完整的WSL2安装Ubuntu 自定义安装目录到D盘流程核心就是 --location 参数一条命令把发行版直接装到指定位置。老版本WSL没有这个参数的朋友也别急配套的迁移方案我会一起写清楚。这篇内容适合刚接触WSL2的大学生、在公司电脑做开发的工程师以及所有C盘常年爆红的用户。不需要太深的Linux基础照着命令敲就行每个参数我都会解释为什么这么写。装完之后的中文输入法、磁盘瘦身、CUDA接入这些高频问题也会一并处理完整走一遍之后你就拥有一套不占C盘、用着舒心的WSL2开发环境。1. 为什么安装WSL2一定要关注安装目录1.1 WSL2到底把文件放在哪里先把原理讲清楚理解了这一节后面所有操作都能举一反三。WSL2跟WSL1最大区别是它跑在一个轻量级虚拟机里使用完整的Linux内核和Windows之间通过虚拟化技术隔离。这个虚拟机没有窗口界面后台由 vmmemWSL 进程承载你几乎感受不到它的存在。但既然是一台虚拟机就必然有一个实实在在的虚拟磁盘文件存在Windows文件系统上。这个文件叫 ext4.vhdx默认位置在C:\Users\你的用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu...\LocalState\ext4.vhdx路径又深又长平时根本没人会去翻。但问题恰恰出在这个文件上。ext4.vhdx不是固定大小的它会像海绵一样自动生长。你在WSL2里 apt install 装了一堆包、pip 下载依赖、Docker 拉镜像文件系统里的数据越来越多vhdx文件就跟着膨胀。更坑的是它默认只会变大不会自动缩小。你在WSL2里删除20GB文件C盘上的虚拟磁盘文件大小纹丝不动空间被白白占住。这就是为什么很多人C盘莫名其妙满了。Windows系统文件本来就大休眠文件再加上WSL2的vhdx三座大山一压256GB的C盘很快告急。理解了这套机制就明白自定义安装目录不是矫情而是刚需。1.2 最容易踩坑的三个场景先说我见过最多的三个场景各位可以对号入座。第一个是Docker Desktop用户。Docker Desktop现在默认用WSL2做后端镜像、容器、卷全部落在WSL2的虚拟磁盘里。开发个微服务项目拉几个基础镜像加构建缓存轻轻松松吃掉十几个GB这些全记在C盘头上。第二个是做深度学习或音视频处理的。装CUDA工具链、FFmpeg编译、OpenCV编译这类工具链动不动几个GB编译过程还要大量临时文件。我见过最狠的一个案例同事在WSL2里编译大项目一个下午C盘少了30GB。第三个是图省事把所有开发环境都塞进WSL2的。数据库、Node环境、Python虚拟环境、Go模块缓存全放里面日积月累相当可观。关键是这些东西删起来还不一定想到去压缩虚拟磁盘空间就白白浪费了。如果你命中其中一个场景强烈建议按照这篇教程从一开始就把安装目录放到非系统盘。1.3 传统方案和--location方案的区别在 --location 参数出现之前要把WSL2装到D盘得装完再迁移步骤繁琐而且中间任何一步出错都可能丢数据。先装到C盘然后 wsl --shutdown、wsl --export、wsl --unregister再去D盘新建目录 wsl --import最后还要修复默认用户。整个流程走一遍熟悉的人也要十几分钟新手容易翻车。--location 参数出现后安装时一步到位直接在命令里指定目标目录。两者的区别用表格看得更清对比项传统默认安装--location 指定目录安装位置C盘用户目录任意指定目录后续迁移需要导出导入无需迁移初次配置安装后需手工迁移一条命令搞定WSL版本要求无限制1.1及以上适用系统Win10/Win11Win10/Win11比较下来新装的机器直接用 --location 最省事。老用户已经装好了怎么办别担心第4节专门讲迁移。2. 安装前的环境检查与准备2.1 系统版本与虚拟化检查开始之前先确认三件事缺一个后面都可能白忙活。第一Windows版本。WSL2要求Windows 10 2004版本内部版本19041以上或者Windows 11。怎么看WinR输入 winver 回车或者设置-系统-系统信息里看版本号。低于这个版本的老系统建议先升级否则WSL2的体验会非常差。第二CPU虚拟化。WSL2是虚拟机方案CPU必须支持并开启虚拟化。Intel的VT-x、AMD的SVM需要在BIOS里确认开启。如果之前装过VMware、VirtualBox或者安卓模拟器大概率已经开启了。检测方法不复杂任务管理器-性能-CPU看右下角虚拟化一栏是否显示已启用。第三Windows功能组件。需要开启适用于Linux的Windows子系统和虚拟机平台两个功能。Win11通常自带Win10建议手动确认。可以直接用管理员终端执行两条命令dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart执行完重启一次系统。这一步是后面所有操作的基础别跳过。2.2 利用wsl --install安装WSL核心组件系统重启后打开Windows Terminal或PowerShell。建议直接把Windows Terminal设置为默认终端后面用起来舒服很多。先安装WSL主体不装任何发行版wsl --install --no-distribution这个命令会安装WSL虚拟化平台、最新的WSL内核以及WSL相关的基础组件。为什么要加 --no-distribution因为我们要单独控制Ubuntu的安装位置先装主体下一步再用 --location 精确指定目录。如果没有这个参数部分系统版本会顺手装一个默认Ubuntu到C盘等于白找麻烦。如果用的是比较老的Win10命令执行后可能提示不支持那就回到2.1把两个功能用dism启用然后执行wsl --update wsl --set-default-version 2把WSL内核更新到最新并明确把默认版本设为WSL2。实在不行去微软官方文档的下载页面手动获取最新WSL安装包装完再回来继续。2.3 确认WSL版本和默认版本设置WSL主体装好以后先看版本再开始装Ubuntu。执行wsl --status wsl --version wsl --list --onlinewsl --status 会显示当前默认版本和内核状态wsl --version 显示WSL程序自身的版本号。--location 参数要求WSL版本够新如果你的版本号比较低先跑 wsl --update 更新到最新版本。wsl --list --online 则列出当前可以安装的发行版列表能看到Ubuntu、Ubuntu-22.04、Ubuntu-24.04、Debian、Kali等发行版。记下你要安装的发行版准确名称下一步就要用到。常用命令的作用汇总在这里命令作用wsl --status查看整体状态wsl --version查看WSL版本号wsl --list --online查看可安装发行版wsl --update更新WSL内核wsl --set-default-version 2设置默认版本为WSL2顺便多提一句如果此时 wsl --list --online 刷新不出来多半是网络问题可以稍后重试或者直接跳到第6节的下载速度慢的几种自救方式栏目。3. 核心操作--location一键安装到D盘3.1 --location参数的前世今生在WSL 1.1版本之前WSL的命令行工具还比较简陋。安装发行版只能用 wsl --install -d Ubuntu 这种默认形式装完位置就被固定在C盘。当时社区里普遍的做法是装完立刻导出、注销、导入到D盘这一套流程被大家吐槽是安装五分钟迁移半小时。后来微软加了 --location 参数允许在安装阶段就指定发行版文件系统的存放目录。这个参数的价值在于从源头避免系统盘膨胀同时省掉所有迁移操作。对批量交付开发机、公司电脑标准化配置的场景帮助特别大。我自己现在给同事装开发环境都是指定D盘的一个专门目录比如 D:\WSL\Ubuntu-Dev方便后续维护和备份。不过要注意--location 参数只对在线安装命令 wsl --install 生效对已经装好的发行版无法事后追加。已经装到C盘的朋友还是得走第4节的迁移流程。3.2 完整安装Ubuntu实操记录下面是完整实操记录每一条命令我都会拆开解释。第一步更新WSL确保版本足够新wsl --update第二步查看可安装的发行版名称wsl --list --online第三步关键一步安装Ubuntu到D盘wsl --install Ubuntu-22.04 --location D:\WSL\Ubuntu-22.04 --name ubuntu-dev逐项拆解Ubuntu-22.04发行版名称必须和 --list --online 输出的名字完全一致。--location D:\WSL\Ubuntu-22.04指定安装目录目录不存在会自动创建。建议路径不要带中文和空格免得后续有些命令行工具处理起来出幺蛾子。--name ubuntu-dev给这个发行版起一个显示名。不加这个参数就用默认名字Ubuntu-22.04。想给多套环境做区分时这个参数很有用。执行后系统会开始下载发行版安装包下载完成后自动初始化虚拟磁盘。在D盘对应目录下会生成 ext4.vhdx 文件这就是整套Linux文件系统的载体。实测下来下载阶段比较依赖网络状态耐心等就行。安装结束后默认会自动启动新系统。如果想装完先不启动可以加 --no-launchwsl --install Ubuntu-22.04 --location D:\WSL\Ubuntu-22.04 --name ubuntu-dev --no-launch首次启动时系统会让你创建Linux用户名和密码。用户名随意起密码输入时不会显示字符这是Linux的正常行为别以为自己键盘坏了。创建完成后会出现一段欢迎信息然后进入命令行提示符。3.3 验证安装目录和运行状态安装完成不是终点验证一下更安心。先回到Windows侧确认发行版状态和位置wsl -l -v会看到类似这样的输出NAME STATE VERSION * ubuntu-dev Running 2VERSION列显示2代表这个发行版运行在WSL2模式。再去资源管理器确认D盘目录能看到 D:\WSL\Ubuntu-22.04\ext4.vhdx 这个文件。确认文件在就说明安装位置百分之百是D盘了。进系统里再验证一下df -h uname -a cat /etc/os-releasedf -h 能看文件系统挂载情况uname -a 看内核信息cat /etc/os-release 看发行版版本。这些输出正常的话WSL2 Ubuntu环境就算正式跑起来了。4. 老用户迁移方案没有--location也能搬到D盘4.1 导出-导入法完整步骤已经装在C盘且用了一阵子的朋友直接卸载重装代价太大正确做法是导出后导入到D盘。这招在 --location 出现之前就是标准方案现在依然有效两者可以交叉使用。第一步把WSL2里所有运行中的发行版停掉wsl --shutdown这个命令会把后台所有WSL虚拟机全部关停确保文件系统处于一致状态避免导出时数据不一致。第二步导出当前Ubuntu为tar包wsl --export Ubuntu D:\backup\ubuntu-backup.tartar包是整个Linux文件系统的完整快照。导出时间取决于数据量几个GB的发行版可能要等几分钟。注意tar包别放到C盘否则迁移完系统盘空间还是被占着白折腾。第三步注销旧的发行版wsl --unregister Ubuntu这个命令会把旧的发行版从WSL注册列表移除同时删除它在C盘上的vhdx文件。执行前务必确认tar包已经导出成功。文件一删原来的Linux数据就没有了。第四步在D盘重建mkdir D:\WSL\Ubuntu wsl --import Ubuntu D:\WSL\Ubuntu D:\backup\ubuntu-backup.tarwsl --import 后面跟三个参数发行版名称、VHD存放目录、tar包路径。执行完成后新的ext4.vhdx就生成在D盘了。4.2 迁移后默认用户变root的修复迁移过程中有个老生常谈的坑通过 wsl --import 导入的发行版默认用户会变成root不再是原来的普通用户。如果不修复后续所有操作都在root下进行文件权限会变得很混乱。修复方法有两种任选其一。第一种用发行版自带的配置命令在Windows侧执行ubuntu.exe config --default-user 你的用户名如果你的发行版是Ubuntu-22.04可执行文件可能是 ubuntu2204.exe具体名称去开始菜单里找。执行完重启WSL即可生效。第二种在Linux里修改 /etc/wsl.confsudo vi /etc/wsl.conf写入以下内容[user] default你的用户名保存后回到Windows侧执行 wsl --shutdown再重新 wsl -d Ubuntu 进入用户名就恢复正常了。4.3 迁移时容易翻车的三个细节迁移流程一共涉及四个命令看起来简单但我见过不少人在细节上翻车特意列出来提醒。第一导出前一定要先 wsl --shutdown。不关停直接导出WSL里的应用还在运行缓存和内存里的数据没有落盘导出的tar包可能缺数据导入后系统会出现各种灵异问题。第二tar包路径和导入目录要分开。很多人习惯把tar包放在导入目录里导入时又把目标目录指向同一个地方容易造成文件互相覆盖。建议tar包放独立备份目录导入目录保持干净。第三--unregister 不可逆。执行之后原发行版和C盘数据会被清掉如果tar包不完整就白干了。稳妥起见迁移成功后先使用几天确认一切正常再清理备份tar包。5. 装完之后的系统配置与后续优化5.1 换软件源、中文环境和输入法Ubuntu安装完成后建议先做三件基础配置换软件源、设置中文环境、配置输入法。第一件换软件源。默认apt源指向Ubuntu官方服务器国内网络环境下速度有时不够理想。把源换成国内镜像比如清华TUNA或阿里云镜像下载速度会有明显改善。Ubuntu 22.04及以前版本直接改 /etc/apt/sources.listsudo sed -i s/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g /etc/apt/sources.list sudo apt updateUbuntu 24.04以后用了新的软件源格式文件位置在 /etc/apt/sources.list.d/ubuntu.sources需要改的是URIs那一行改成 https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ 即可。第二件设置中文locale。终端里执行sudo apt install locales sudo dpkg-reconfigure locales在出现的界面里勾选 zh_CN.UTF-8然后把默认locale设为zh_CN.UTF-8。重新登录后系统提示和日期格式会变成中文。第三件中文输入法。这里要分清场景。如果只是在Windows Terminal里敲命令行Windows自带的中文输入法直接就能在终端里输入中文什么都不用配。只有当你需要在WSL2里的图形界面程序中输入中文时才需要在Linux侧配置输入法框架。建议安装fcitx5sudo apt install fcitx5 fcitx5-chinese-addons fcitx5-pinyin im-config im-config -n fcitx5配置完成后图形程序里可以用CtrlSpace切换中英文输入。WSL2自带WSLg图形支持会把这些Linux GUI窗口显示在桌面上。如果应用里没有自动加载输入法可以在终端执行 fcitx5 -d 手动拉起。5.2 磁盘空间瘦身开启稀疏VHD与手动压缩前文说过vhdx文件只增不减。即便一开始就装到了D盘时间久了也会白白占用空间。两个办法可以解决。第一个办法直接给WSL2开启稀疏VHD特性wsl --manage ubuntu-dev --set-sparse true开启后WSL2会定期把释放的空白页还给Windows宿主删除文件后空间能够自动回收不用再手工压缩。这个参数在较新的WSL版本中都有老版本先 wsl --update 再执行。第二个办法手动压缩vhdx。先停掉WSL再用系统自带的diskpart操作wsl --shutdown然后在Windows终端输入 diskpart 并回车进入交互界面后依次输入select vdisk fileD:\WSL\Ubuntu-22.04\ext4.vhdx attach vdisk readonly compact vdisk detach vdisk exit压缩时间取决于vhdx里空白空间的大小一般几分钟。压缩前记得做好数据备份尽量在系统空闲时操作。5.3 开发环境的常见组合CUDA与DockerWSL2对开发者的一个巨大吸引力是原生支持GPU直通。Windows侧安装好NVIDIA驱动后WSL2里可以直接调用GPU跑深度学习。安装CUDA工具链用NVIDIA官方WSL版本源wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.0-1_all.deb sudo dpkg -i cuda-keyring_1.0-1_all.deb sudo apt update sudo apt install cuda装完执行 nvidia-smi能看到和Windows侧一致的GPU信息就说明GPU直通配置成功。注意CUDA版本要和Windows驱动兼容建议选择相对稳定的版本不要盲目追新。Docker方面推荐直接在Windows侧装Docker Desktop并把WSL2作为后端。在Docker Desktop的Settings里选择一个WSL发行版作为集成对象镜像和数据默认放在该发行版的vhdx里。既然我们已经把发行版放到D盘Docker的数据也就跟着落在D盘这比默认配置科学得多。6. 常见问题与排查技巧实录6.1 WSL2尚未准备就绪 的最快排查顺序WSL2使用过程中经常有人遇到WSL2尚未准备就绪或者请启用虚拟机平台的报错。这个问题的根源通常是三个虚拟机平台功能没开、CPU虚拟化没开、WSL内核没更新。建议按顺序排查第一确认Windows功能里虚拟机平台和适用于Linux的Windows子系统都已勾选没勾就按2.1节的dism命令补开重启。第二任务管理器确认CPU虚拟化已启用。没启用就去BIOS里找Intel Virtualization Technology或者SVM Mode改成Enabled。第三执行 wsl --update 更新内核。这条命令能解决很大一部分尚未准备就绪问题因为旧内核和新Windows版本之间存在兼容性问题。第四最兜底的一招wsl --set-default-version 2确保新安装的发行版默认跑在WSL2而不是WSL1上。按这个顺序走绝大多数情况十分钟内能解决。6.2 启动闪退、打不开的现场处理WSL2启动闪退的问题我也遇到过几次触发原因各不相同但排查思路是通用的按严重程度从小到大处理。先看是不是临时性故障。任务管理器里找到所有的 vmmemWSL 和WSL相关进程全部结束然后重新执行 wsl --shutdown再启动发行版。很多闪退只是WSL服务进程僵死重启进程就能恢复。再查事件查看器。WinR输入 eventvwr.msc在Windows日志-应用程序里按时间筛选找到来源含WSL或Vmmem的错误条目看具体的错误代码。不同错误代码对应不同原因拿着代码去搜索基本都能找到对应的系统组件和修复方法。如果还是不行考虑虚拟磁盘损坏或配置异常。先备份重要数据然后可以尝试 wsl --unregister 注销重建或者参考第4节的导出导入流程把系统迁移到一个新vhdx。这套操作相当于给WSL2做一次重置能救回大部分问题。还有一个容易被忽略的原因磁盘空间不足。WSL2运行需要临时空间如果C盘剩余空间太低启动时也会闪退。定期检查磁盘剩余空间保持充足余量很多莫名其妙的问题自然消失。6.3 下载速度慢的几种自救方式wsl --install 或 wsl --update 时下载慢是很多新手遇到的第一个拦路虎。讲讲自救思路。第一种给WSL更新加 --web-download 参数wsl --update --web-download默认情况下wsl --update是从Microsoft Store拉取安装包网络不理想时速度很慢。加了这个参数会改为直接从WSL的GitHub发布页下载实测对部分网络环境有明显提速效果。第二种先关掉正在占用带宽的软件。云盘同步、视频播放、系统更新下载这些都会抢占连接把下载速度拖到几KB每秒。下载WSL安装包的大文件时可以短暂暂停这些任务。第三种检查网络环境。如果公司网络或校园网有特殊的流量限制可以尝试连接手机热点等不同的网络再试。网络波动导致的下载中断直接重跑一次命令即可WSL安装过程本身支持重试。还有一种情况要特别提醒下载慢也可能是C盘空间不足。WSL在安装过程中需要释放安装包到临时目录如果磁盘满了下载进度会卡住或者反复失败。安装前先确认C盘剩余空间在10GB以上。6.4 中文环境相关的两个翻车点最后补一个中文环境的细节。很多人配置文件写错导致locale警告比如运行程序时提示 perl: warning: Setting locale failed多半是缺少zh_CN.UTF-8或系统没有生成对应locale。执行sudo locale-gen zh_CN.UTF-8 sudo update-locale重新登录即可。另一个翻车点是安装了fcitx5但环境变量设置不正确图形程序里无法呼出输入法。在 /etc/environment 里补充XMODIFIERSimfcitx GTK_IM_MODULEfcitx QT_IM_MODULEfcitx保存后重进WSL输入法就能正常工作了。这两个问题看起来小实际遇到的人不少尤其是不熟悉Linux环境变量的朋友经常卡在环境变量配置上。说实话WSL2这套东西官方文档写得不算差但真正把安装目录、磁盘膨胀、迁移这些实操问题串起来的教程不多。我自己第一次装的时候就是因为没注意安装位置C盘被折腾到只剩几个GB后来花了大半个下午导数据、迁移才把环境救回来。写这篇的目的就是把这段弯路帮你省掉。我现在给新机器配WSL2的习惯是先 wsl --update再 wsl --install --no-distribution然后直接 --location 把Ubuntu放到D盘装完顺手开稀疏VHD再按需装CUDA和Docker。整套流程二十分钟左右。如果你装完之后觉得D盘目录还是乱可以按发行版建子目录比如 D:\WSL\Ubuntu-Dev、D:\WSL\Ubuntu-Data时间久了维护起来非常清爽。最后再提醒一句无论用哪种方式安装数据备份永远是最重要的尤其是 --unregister 和 diskpart 压缩这类操作一旦失误没有后悔药。
返回列表