首页 / 资讯中心 / 文章详情

Windows WSL 安装 Ubuntu 16.04 老版本:避坑指南与初始化配置

Windows WSL 安装 Ubuntu 16.04 老版本:避坑指南与初始化配置 ★ FEATURED ARTICLE
1. 为什么还要折腾 Ubuntu 16.04 这个老版本先把话说在前头如果你只是想在 Windows 上跑个 Linux 环境做日常开发直接装最新的 Ubuntu LTS 版本就行没必要碰 16.04。但现实里有一类需求绕不开它——某些老项目的编译工具链、特定版本的运行时库、或者一套祖传的构建脚本就是认准了 16.04 这个底座。我最近就遇到一个图像处理的小 Demo依赖的某个库在 18.04 之后改了 ABI编译直接报符号找不到折腾半天最后还是回到 16.04 才跑通。所以这篇内容的核心是讲清楚在 Windows 的子系统WSL里装 Ubuntu 16.04 这件事从版本选择的坑、安装方式、到装完之后必须做的初始化配置再到实际用起来会撞上的几个典型问题。适合两类人看一类是被老项目绑死、不得不回到 16.04 的开发者另一类是想搞明白 WSL 版本差异、顺便了解老发行版维护现状的技术爱好者。哪怕你最后决定不用 16.04这里面的排查思路和配置方法也能直接迁移到别的版本上。需要提前说明的是Ubuntu 16.04 早已过了官方标准维护期很多软件源、安全更新都不再默认提供。这意味着你在安装和使用过程中会遇到比新版本多得多的手动挡操作。这不是吓唬人而是让你有个心理预期接下来的每一步可能都需要你比装新系统多花两三倍的时间去查资料、试参数。2. WSL 两个版本对老发行版的支持差异2.1 WSL1 和 WSL2 的底层区别到底影响什么很多人装子系统时随手就选了默认版本根本没注意 WSL1 和 WSL2 是两套完全不同的架构。简单打个比方WSL1 像是给 Windows 内核加了一层翻译官把 Linux 的系统调用实时翻译成 Windows 能懂的指令所以它和 Windows 的文件系统是打通的启动快、内存占用小WSL2 则是在 Windows 里跑了一个轻量级的虚拟机里面装的是真正的 Linux 内核兼容性更好、性能更接近原生但代价是文件跨系统访问变慢、内存占用更高。对于 Ubuntu 16.04 这种老发行版这个差异就变得很关键了。WSL1 因为共享 Windows 内核对老版本 Linux 的兼容性反而更宽容一些很多在 WSL2 里跑不起来的老工具在 WSL1 下能凑合跑。但 WSL1 也有硬伤比如不支持 Docker 的原生运行只能靠 Docker Desktop 的桥接某些需要内核模块的操作直接歇菜。我的建议是如果你装 16.04 是为了跑一个纯用户态的老工具链优先试 WSL1如果这个老环境里还要跑容器、或者需要完整的内核特性那就只能上 WSL2然后接受它启动慢、占内存的现实。2.2 版本切换的具体命令和注意事项查看当前默认版本很简单打开 PowerShell 敲wsl --list --verbose这条命令会列出你所有已安装的发行版以及它们各自跑在 WSL1 还是 WSL2 上。如果你想把某个发行版从 WSL2 切回 WSL1用wsl --set-version Ubuntu-16.04 1反过来切到 WSL2 就把最后的数字改成 2。这里有个坑要提醒版本转换过程会重新打包整个文件系统如果你的子系统里已经装了几个 G 的东西这一步可能要等十几分钟甚至更久中途千万别关窗口。我有一次手贱在转换到一半的时候按了 CtrlC结果那个发行版直接损坏只能卸载重装之前配的环境全没了。另外设置默认版本用wsl --set-default-version 1或2这个只影响之后新安装的发行版已经装好的不会自动变。很多人以为改了默认版本就万事大吉结果发现老环境还是跑在原来的版本上白白排查半天。3. 把 Ubuntu 16.04 装进子系统的几种路子3.1 通过应用商店安装的可行性分析最省事的方式本来是打开 Microsoft Store 搜 Ubuntu但现实是商店里现在只提供较新的 LTS 版本16.04 早就下架了。你搜到的可能是 20.04、22.04 这些。所以想装 16.04商店这条路基本走不通除非你去找第三方打包的离线包但那种来源不明的包我强烈不建议用天知道里面塞了什么。3.2 手动导入根文件系统的完整流程真正靠谱的做法是手动导入一个官方的根文件系统压缩包。流程分三步下载、导入、验证。第一步去官方镜像站找 Ubuntu 16.04 的 WSL 根文件系统包文件名通常类似ubuntu-xenial-core-cloudimg-amd64-root.tar.gz这种。注意要认准官方源别随便找个网盘链接就下。第二步在 PowerShell 里执行导入命令wsl --import Ubuntu-16.04 D:\wsl\ubuntu1604 D:\downloads\ubuntu1604-rootfs.tar.gz --version 1这里三个参数分别是发行版名称你自己起建议规范点、安装目标目录找个空间够的盘别放 C 盘、根文件系统包路径。--version 1指定用 WSL1如果你要 WSL2 就改成 2。第三步导入完成后用wsl -d Ubuntu-16.04进去看看能不能正常启动。第一次进去默认是 root 用户这跟商店安装的体验不一样商店版会引导你创建普通用户手动导入的默认就是 root。提示导入的目标目录一旦确定就别乱动WSL 会在这个目录里维护整个文件系统。你要是手动把文件夹挪走或者改名这个发行版就废了只能重新导入。3.3 导入后第一件必须做的事进去之后别急着装东西先把软件源换掉。16.04 默认的源地址里很多已经失效或者响应极慢。编辑/etc/apt/sources.list把里面的archive.ubuntu.com和security.ubuntu.com替换成还能用的镜像地址。这一步不做后面apt update能卡到你怀疑人生。换完源执行apt update apt upgrade -y升级过程可能会提示你有若干包被保留kept back这在老系统上很常见通常是依赖关系冲突导致的不用慌先放着后面按需单独处理。4. 装完之后绕不开的初始化配置4.1 创建普通用户并配置权限一直用 root 操作不是个好习惯权限太大容易误伤系统文件。创建一个普通用户adduser devuser usermod -aG sudo devuser然后设置这个发行版默认登录用户。在 PowerShell 里执行ubuntu1604 config --default-user devuser注意这里的ubuntu1604是你导入时起的发行版名称得对应上。配置完之后重新进子系统应该就是普通用户身份了需要提权时用sudo。4.2 时区和本地化的调整老版本装完经常出现时间不对、中文乱码的问题。先设时区ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime再装语言包apt install -y language-pack-zh-hans如果终端里中文显示成方块检查一下locale命令的输出确保LANG和LC_ALL设置正确。我一般直接在~/.bashrc里加一行export LANGzh_CN.UTF-8省得每次手动设。4.3 常用开发工具的补齐16.04 自带的工具版本都比较老按需升级。比如 Python 默认是 3.5如果你要跑新一点的代码得自己装 3.6 以上。但这里要小心别直接把系统自带的 Python 卸了很多系统工具依赖它。正确做法是装个新版本然后用虚拟环境隔离或者用update-alternatives管理多版本。Git 版本也可能偏旧如果遇到某些仓库拉不下来的情况可以加个 PPA 装新版本但 PPA 在老系统上不一定还有维护得碰运气。5. 实际使用中撞上的几个典型问题5.1 软件源失效导致的安装失败这是最高频的问题。你执行apt install某个包结果报 404 或者连接超时八成是源地址挂了。解决办法就是前面说的换源但换源也有讲究16.04 对应的代号是xenial你找镜像站的时候要确认它还有xenial的归档。有些镜像站只保留最近两三个版本的包老版本的目录直接被删了。如果实在找不到可用的源可以考虑用old-releases.ubuntu.com这个专门存放历史版本的地址虽然速度慢但至少包是全的。5.2 文件系统跨系统访问的性能陷阱在 WSL 里访问 Windows 盘符下的文件比如/mnt/c/...性能会比访问子系统内部的文件慢很多WSL2 下尤其明显。我做过一个粗略测试同样一个包含几千个小文件的目录在子系统内部遍历只要几秒在/mnt/c下要几十秒。所以项目代码尽量放在子系统自己的文件系统里别图方便直接放 Windows 桌面。反过来如果你需要在 Windows 里访问子系统文件WSL2 可以通过\\wsl$\路径访问WSL1 则是直接映射到某个隐藏目录。这个路径在资源管理器地址栏里敲一下就能进去。5.3 内存和磁盘占用的控制WSL2 有个众所周知的问题它会慢慢吃掉大量内存不释放因为虚拟机里的缓存不会自动还给 Windows。解决办法是在用户目录下建一个.wslconfig文件限制内存上限[wsl2] memory4GB swap2GB改完执行wsl --shutdown重启生效。WSL1 没这个问题但它的磁盘占用会随着文件增多而膨胀定期清理没用的包和缓存能省不少空间。5.4 网络相关操作的常见报错老版本子系统里跑网络请求偶尔会遇到 DNS 解析失败的情况。这通常是/etc/resolv.conf被自动生成覆盖了。可以手动改这个文件加上可靠的 DNS 地址然后把它设成只读防止被覆盖chattr i /etc/resolv.conf不过要注意设了只读之后如果哪天网络配置变了需要更新得先chattr -i解锁再改。6. 让老环境稳定跑下去的几个维护习惯6.1 定期备份整个发行版WSL 提供了导出功能可以把整个发行版打包成一个 tar 文件wsl --export Ubuntu-16.04 D:\backup\ubuntu1604-backup.tar我一般每个月导一次尤其是做完重大配置变更之后。恢复的时候用wsl --import指定新的目录就行。这个习惯救过我好几次有一次手滑删错了系统目录直接导出恢复十分钟搞定比重装快多了。6.2 别在生产性质的场景里依赖它说句实在话16.04 加上 WSL 这个组合稳定性是打折扣的。它适合做本地开发、跑跑测试、验证老项目能不能编译通过。但如果你要拿它跑长时间的服务、或者处理重要数据我劝你三思。老系统的安全更新缺失、WSL 本身的版本迭代都可能在某次系统更新后让环境突然罢工。重要的工作还是放在正经的服务器或者新版本环境上。6.3 记录你的每一步配置老环境最怕的就是当时配好了过俩月忘了怎么配的。我习惯在子系统里建一个setup-notes.md把换源地址、装的包、改的配置文件都记下来。这样下次重装或者换机器照着笔记走一遍就行不用重新踩一遍坑。这个习惯看起来笨但实际省下的时间远超记录的成本。最后分享一个我自己的小技巧如果你同时需要多个老版本环境别在一个发行版里硬塞直接导入多个独立的发行版各自起不同的名字。虽然占点磁盘空间但环境之间互不干扰出问题了也好定位。比起在一个环境里反复折腾依赖冲突多开几个的成本其实更低。
阅读完成 · 觉得有帮助?
咨询建站