ARTICLE DETAIL

资讯详情

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

Windows上跑Linux:WSL安装、终端配置与apt依赖管理实战

Windows上跑Linux:WSL安装、终端配置与apt依赖管理实战 刚接触 Linux 时我面临的最大障碍不是命令记不住而是“一台 Windows 电脑怎样才能舒服地跑 Linux”。双系统要重启切换虚拟机又觉得笨重。直到用上 WSLWindows Subsystem for Linux这个问题才算真正解决不需要另装系统Windows 自带内核级支持直接命令行进入 Ubuntu、Debian 环境文件和 Windows 互通。配合 PowerShell、CMD、Windows Terminal 这些终端工具以及 apt 这个包管理器日常学习和实践完全够了。这集就把这一套环境从零讲清楚重点是 WSL 安装、终端选择、apt 命令以及新手最容易懵的 Package Dependency软件包依赖到底是怎么运作的。这集适合谁想学 Linux 但只有 Windows 机器的零基础朋友需要在 Windows 上跑开源工具又不想开虚拟机的开发者还有刚接触服务器运维、想先在本地练手的人。读完你可以自己搭好一个能敲 Linux 命令、能装软件、能排查依赖问题的开发环境。1. 项目概述为什么我建议从 WSL 而不是虚拟机开始学 Linux1.1 双系统、虚拟机、WSL 三种方案怎么选我见过不少人为了学 Linux 直接把自己的 Windows 换成 Linux 桌面结果打印机不认、网银装不上、文档排版错乱折腾一星期又换回去。这不是意志力问题是工具选错了。对绝大多数学习者来说目标不是“让电脑跑 Linux”而是“能用 Linux 环境学习和干活”这两件事差别很大。双系统的痛点很明显切换要重启磁盘分区紧张而且 Windows 和 Linux 之间的文件互访非常别扭。虚拟机VMware、VirtualBox稍微好一点可以边用 Windows 边开一个 Linux 窗口但内存开销大启动要几分钟共享文件夹、剪贴板、网络的配置也经常让人头大。WSL 2 的出现改变了这个局面它底层是微软帮你托管的一个轻量虚拟机但和 Windows 的集成度极高终端里直接输入wsl就能进去文件系统可以互访剪贴板通用启动速度接近秒级。当然WSL 也不是万能的。它不适合跑需要特定内核模块的场景不适合做硬实时任务也不适合当生产服务器。但用于学习 Linux 基础、跑 Python 脚本、装开发环境、写 Shell 脚本完全够用。1.2 WSL 1 和 WSL 2 到底差在哪WSL 经历过两代架构。WSL 1 走的是“系统调用翻译层”路线把 Linux 程序发出的系统调用直接翻译成 Windows 的系统调用启动速度和文件性能不错但对内核的兼容性有限有些软件跑不起来。WSL 2 则换成了真正的轻量虚拟机内置一个完整 Linux 内核兼容性大大提升Docker、CUDA 这类对内核有要求的场景也能正常使用。代价是会吃掉一些内存并且会有一个虚拟磁盘文件存在 Windows 盘上。检查当前用的是哪个版本在 PowerShell 里运行wsl -l -v如果看到VERSION列是 2那已经很理想。如果是 1可以单独把某个发行版切换成 2wsl --set-version Ubuntu-22.04 2提示新版 Windows 10/11 执行wsl --install默认安装的已经是 WSL 2不需要额外处理。如果你的系统因为组策略或老版本原因装出来还是 WSL 1再用上面命令升上去。2. 终端三件套CMD、PowerShell 与 Windows Terminal 的分工2.1 三个终端到底是什么关系很多新手被三个“黑窗口”搞糊涂CMD、PowerShell 和 Windows Terminal 长得差不多到底用哪个我的理解很简单CMD是 Windows 的元老级命令提示符起源于 DOS 和早期批处理。它能做的事情有限主要用来启动程序、操作文件、运行简单的批处理脚本。PowerShell是微软后来推出的“加强版 shell”它面向对象管道里传递的不只是文本而是结构化的对象。比如Get-Process列出进程后可以直接接Where-Object做筛选比在 CMD 里用 findstr 处理文本方便得多。Windows Terminal则不是命令解释器它是一个“外壳”一个现代终端模拟器。它可以同时开多个标签页每个标签页可以跑 CMD、PowerShell、WSL 或者 Git Bash支持多主题和 GPU 渲染。打个比方CMD 和 PowerShell 是司机Windows Terminal 是同一台车。对日常使用来说不用非得学会 PowerShell 的复杂语法只需要知道在这三个环境里怎么调用 WSL 就够了。热词里经常出现的“在 PowerShell 中运行 wsl --status”就是指在 Windows 的任一终端里执行 WSL 相关命令。2.2 从 Windows 终端进入 WSL 的几种方式进入 WSL 最直接的方式是开始菜单里找到安装好的发行版图标比如 Ubuntu点击后会打开一个窗口直接进入 Linux shell。不过我更推荐在 PowerShell 或 Windows Terminal 里操作因为这样能同时管理 Windows 命令和 Linux 命令。打开 PowerShell输入wsl就会自动进入默认发行版的 Linux shell提示符会变成用户名主机名:~$。如果想进入某个特定发行版比如你同时装了 Ubuntu 和 Debian用wsl -d Debian需要退出 WSL 时输入exit就会回到 Windows 的终端环境。在 Windows Terminal 里点标题栏的“向下箭头”会看到“新建配置文件”列表选择对应的发行版即可。如果装了 WSL 发行版它通常会自动出现在列表里。日常我用 Windows Terminal 的频率最高因为多标签页太方便了一个标签折腾 Linux一个标签跑 PowerShell互不干扰。2.3 手把手完成 WSL 安装与版本切换这部分把整个安装流程记录下来照着操作基本不会出错。以管理员身份打开 PowerShell运行wsl --install如果只想装某个具体发行版可以加参数指定比如wsl --install -d Ubuntu-22.04安装完成后重启电脑。重启后首次进入会在终端里弹出一个启动画面让你设置 Linux 用户的用户名和密码。设置完成后进入 Linux shell验证一下版本cat /etc/os-release回到 Windows PowerShell用wsl -l -v查看是否显示 VERSION 为 2。有一点值得提醒wsl --install依赖 Windows 的“虚拟机平台”功能如果执行时报错提示需要启用虚拟化需要去 BIOS 里确认 Intel VT-x 或 AMD SVM 是否开启。3. 核心命令apt 到底帮你做了什么3.1 apt update 与 apt upgrade先刷新货架再更新商品在 Linux 里安装软件最常用的是 apt 命令。它全称 Advanced Package Tool是 Debian/Ubuntu 系的软件包管理器。很多人第一次接触apt update时会疑惑我还没装软件为什么先要执行一个 update这里的update并不是升级系统而是“更新软件源索引”也就是让本机知道远程软件仓库里有哪些软件、当前版本是多少。打个比方apt update相当于去超市前先刷新一遍购物清单apt upgrade才是把清单上已经买过的商品替换成更新版本。如果跳过 update本地的索引可能是陈旧的apt install会发现找不到软件包或者装到老版本。实际操作中我会在每次安装软件之前先执行sudo apt update然后根据需要再决定要不要 upgradesudo apt upgrade注意apt upgrade会一次性更新很多软件包在服务器或正在运行的开发环境上执行前最好看一眼输出里“将被升级”的列表。WSL 里一般问题不大但如果跑着生产环境不建议盲目升级所有包。3.2 安装、卸载、清理apt 的日常动作常用命令的语义有必要厘清不然容易在卸载时误删数据sudo apt install package sudo apt remove package sudo apt purge package sudo apt autoremove sudo apt cleanremove只是卸载软件本身配置文件一般保留purge则连配置文件一起删适合彻底清理某个软件。autoremove用来清理那些“因为安装某软件而被顺带装进来、但现在没用了”的依赖包。比如你把某个大软件卸载后它的一些依赖残留下来就可以用 autoremove 清掉。实际中的常见操作组合是sudo apt install git curl vim一次安装多个包每个包名之间用空格隔开apt 会统一处理它们的依赖。3.3 Package Dependency 到底是什么为什么它决定着安装体验Package Dependency软件包依赖是 Linux 新手最容易迷糊的概念之一。Windows 上安装软件一般双击 exe 或 msi安装器已经把你需要的运行库打进去了。Linux 不是这样一个软件包通常只包含自己的可执行文件、配置文件和文档而它运行时依赖的动态链接库或其他程序往往属于另外的软件包。举个例子你安装git时apt 会提示“以下软件包将被额外安装”这些额外包里面就有libcurl4、libexpat1之类的运行库。Git 是一个用 C 写的程序它运行的第一步就是去系统目录里找到这些动态库.so文件并加载。如果缺少某个库程序就会报error while loading shared libraries。可以用下面命令直观地看ldd /usr/bin/git输出里每一行就是一个依赖的动态库。再看软件包层面的依赖关系apt-cache depends git这个命令会列出 git 依赖的包包括Depends强依赖和Suggests建议安装的增强功能。反过来可以用apt-cache rdepends git看哪些包依赖 git。这样你就能理解依赖树的概念软件包之间形成一个层级网络A 依赖 BB 依赖 C。apt 的价值就在于它替你把这棵依赖树理顺了安装 A 时自动把 B、C 全装上卸载时也能判断哪些包变成孤儿依赖。对用户来说最直观的感受是在 Linux 上装软件基本不用担心“这个程序缺个 DLL 去哪找”apt 会一次性处理好。这也是现代包管理器最重要的价值之一。3.4 本地 .deb 包为什么也建议用 apt install热词里有一个很典型的场景cd ~/downloads sudo apt install ./spark-store*.deb这里./加软件包路径是让 apt 从一个本地.deb文件安装而不是从远程仓库下载。为什么要强调用apt install ./xxx.deb而不是dpkg -i xxx.deb因为dpkg -i只知道“把这个包装上”它不会自动去仓库里下载这个包缺失的依赖如果缺依赖就会报一堆dependency is not satisfiable的错误你得手动apt install -f修复。而apt install ./xxx.deb会自动解析该软件包的依赖并补装省掉不少麻烦。shell 里的通配符*.deb也有讲究在 bash 中./spark-store*.deb会被自动展开成当前目录下所有匹配的.deb文件。这个技巧在你手动下载了多个软件包时特别有用。4. 实操过程从零配置一个能写代码的 WSL 环境4.1 更换软件源解决下载慢的第一步国内访问 Ubuntu 默认源经常很慢换源是我每次装完 WSL 后的第一件事。思路很简单把/etc/apt/sources.list里的默认服务器地址换成国内镜像站地址。以 Ubuntu 22.04 为例先备份原文件sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak然后用你熟悉的编辑器修改sudo nano /etc/apt/sources.list注释掉原来的archive.ubuntu.com相关行换成以下内容这里是清华源的示例deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse保存后执行sudo apt update如果输出里Get行的速度明显加快说明换源成功。提示不同 Ubuntu 版本比如 22.04 的代号是 jammy24.04 的代号是 noble对应源地址不同别照着老文章硬抄。可以先执行lsb_release -a查看代号。4.2 用 apt 批量安装常用开发工具先来一套最常用的组合sudo apt install build-essential git curl wget vim python3 python3-pip各工具的用途不展开说单挑几个容易踩坑的点build-essential包含 gcc、make 等编译工具之后如果自己编译源码这是必备组件。python3和python3-pip是分开装的不要以为装了 python3 就自带 pip。有些系统里 pip 命令会指向 pip3使用时注意。vim默认是 vim-tiny 还是完整版取决于源配置vim --version可查看。热词里还有一句sudo apt install jmeter。JMeter 这种工具在 Ubuntu 仓库里可能没有或版本比较旧。如果apt search jmeter找不到可以去 Apache 官网下载 tar 包放到~/tools里解压直接用。这正好印证了包管理器的边界apt 能解决很多问题但不是所有软件的官方发布渠道都走 apt。安装时如果遇到E: Unable to locate package一般就是没执行sudo apt update导致索引里没有这个包。这也是新手第一反应应该检查的事。4.3 让 VS Code 和 WSL 无缝协作热词里“在 vscode 中使用 wsl”我强烈推荐。步骤非常简单在 Windows 侧安装 VS Code然后在扩展市场搜索装Remote - WSL插件。回到 WSL 终端进入你的项目目录直接输入code .VS Code 会自动以“WSL 模式”启动左下角会出现绿色的WSL: Ubuntu-...标识。这时候编辑文件、运行终端、调试代码全部是在 WSL 环境里完成的。这里有个性能小技巧值得专门写一句代码文件一定要放在 Linux 文件系统里比如~/projects而不是放在C:\Users\你\projectsWSL 里对应路径是/mnt/c/Users/你/projects。因为 WSL 访问 Windows 盘文件走的是跨文件系统协议IO 性能会差很多尤其是跑依赖大量小文件的构建任务时差距非常明显。5. 常见问题与避坑实录5.1 “用户不在 sudoers 文件中”怎么救很多人在 WSL 里执行sudo apt update时遇到过这样的输出[sudo] 你的用户名 的密码: 你的用户名 未出现在 sudoers 文件中。此事将被报告。出现这个报错说明当前用户没有被加入sudo组无法提权。解决方法不复杂回到 Windows PowerShell以 root 身份进入发行版不需要密码wsl -u root然后在 Linux 里把用户加进 sudo 组usermod -aG sudo 你的用户名Debian 系也可能是adduser 你的用户名 sudo退出重新进入终端问题就解决了。这里强调一点不要图省事直接编辑/etc/sudoers文件特别是不要用一个错误的语法把文件写坏。改 sudoers 的正确姿势是用visudo命令它会在保存前检查语法错误。我见过新手手工改了 sudoers 导致整个系统无法提权只能靠wsl -u root进去修复这其实很麻烦。5.2 apt 锁冲突另一个程序正在运行安装软件时偶尔会遇到Could not get lock /var/lib/dpkg/lock-frontend这提示你上游的dpkgapt 的底层工具正被另一个进程占用。常见原因是后台的自动更新任务还在运行或者之前一次安装中断了进程还挂着。可以用命令看看是哪个进程ps aux | grep -E apt|dpkg发现可疑进程后等它结束或者确认无误后结束它sudo kill -9 进程号网上很多教程会直接让你删/var/lib/dpkg/lock文件我的经验是除非确认没有任何 apt/dpkg 进程在跑否则不要删锁文件。锁文件在最多让你等锁文件没了且进程还活着才真正可能把 dpkg 数据库写坏。5.3 WSL 空间占满 C 盘迁移到 D 盘WSL 2 的数据存在一个叫ext4.vhdx的虚拟磁盘文件里默认位置在 C 盘用户的AppData\Local\Packages下面。用一段时间后这个文件能涨到十几个 GBC 盘吃紧是必然的。迁移步骤记录一下亲测可用先关闭 WSLwsl --shutdown导出发行版到目标盘wsl --export Ubuntu-22.04 D:\wsl\ubuntu.tar注销原发行版注意这步会删掉原注册信息但不会删导出的 tar 文件wsl --unregister Ubuntu-22.04导入到新路径wsl --import Ubuntu-22.04 D:\wsl\ubuntu D:\wsl\ubuntu.tar导入后默认登录用户会变成 root需要重新设置默认用户。编辑一下/etc/wsl.conf[user] default你的用户名然后wsl --shutdown再重新打开即可。提示导出前一定要先wsl --shutdown否则虚拟磁盘可能处于不完整状态导出的 tar 文件在后面导入时可能报错。5.4 网络不通、DNS 解析慢怎么办WSL 里偶尔会遇到curl某个网址没反应但 Windows 上访问同样的网址却正常。我先排查的是 DNScat /etc/resolv.conf如果看到 nameserver 是异常的地址比如自动生成的 NAT 网关地址解析不出来可以试试换个公共 DNS修改/etc/resolv.conf后为了防止被 WSL 自动重置还需要在/etc/wsl.conf里写[network] generateResolvConf false然后执行sudo rm /etc/resolv.conf sudo nano /etc/resolv.conf写入公共 DNS 地址保存。这种方式在 WSL 网络模式下是有效的。如果你只是下载软件包很慢前面 4.1 已经说过换镜像源是最优解。5.5 排查问题速查表把上面几个问题整理成一张表方便你快速定位现象可能原因首选解法user is not in the sudoers file用户不在 sudo 组wsl -u root加用户入 sudo 组Could not get lock /var/lib/dpkg/lock-frontendapt/dpkg 进程占用ps aux查进程等待或结束进程E: Unable to locate package软件源索引未更新先执行sudo apt updateerror while loading shared libraries缺少动态库依赖用apt install -f或补装对应库包wsl -l -v显示 VERSION 为 1未切换到 WSL 2wsl --set-version 发行版 2C 盘空间骤减ext4.vhdx 文件膨胀按 5.3 方法迁移到其他盘5.6 记不住命令不用慌用工具代替死记硬背最后分享一个心态上的技巧。Linux 命令多到没人能全记下来我不建议背命令表。遇到不知道用法的情况先看命令自带的帮助命令 --help想查某个命令的详细说明用manman apt想找“某个功能该用哪个命令”有apropos。比如你忘了“复制”相关的命令有哪些apropos copy这比翻收藏的文章高效得多。同时建议在 WSL 里自己建一个笔记文件比如~/notes/linux-commands.md把每次踩坑的解法记下来。这个习惯帮你积累起来比任何教程都贴合你自己的工作场景。这集我们从 WSL 的环境搭建讲到终端选择再到 apt 命令和依赖关系的底层逻辑最后聊了不少坑。我在实际使用中的一个体会是理解“软件包依赖”这套思想比记住几个 apt 参数重要得多它不仅是 apt 的运作核心也是之后接触 Docker 镜像、Conda 环境、Ansible 自动化时的通用基础。装完环境没事多敲几条命令看看ldd的输出翻了apt-cache depends的结果你对 Linux 的掌控感会慢慢建立起来。下一集可以聊聊文件系统、权限模型和 Shell 脚本有环境在手里学什么都会更快。
返回列表