ARTICLE DETAIL

资讯详情

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

Windows下玩转Linux:WSL、终端与apt依赖管理入门

Windows下玩转Linux:WSL、终端与apt依赖管理入门 如果你的电脑是一台Windows但心里一直痒痒想学Linux——这集的入口刚好适合你。我自己就是从这个路径走过来的不想给电脑装双系统怕折腾坏引导又受不了虚拟机那点性能和启动速度最后发现WSLWindows Subsystem for Linux把“在Windows里用Linux”这件事变得异常顺滑。再加上CMD、PowerShell、Windows Terminal这几个终端家伙配上Linux基础里绕不开的apt命令和Package Dependency概念刚好构成一套起步组合拳。这一集我把这几个东西串成一条线讲什么样的人适合用WSL、三种常见终端到底怎么选、apt命令每天怎么用、软件包依赖是什么鬼以及装一个.deb安装包报错之后该怎么一步步排查。全程没有高深理论全是实际操作过得出的经验适合刚从Windows转到Linux、还在到处查命令的初学者。1. 从Windows到Linux的桥为什么WSL比虚拟机更香1.1 WSL到底是什么它是怎么做到不卡顿的很多人第一次听说WSL会下意识把它当成“装在Windows里的虚拟机”。这个理解不算全错但会误导你后续很多操作。虚拟机是把整套Linux原封不动地搬进来需要单独分配内存、CPU、磁盘启动像开一台新电脑而WSL的架构完全不同——Windows 10和Windows 11通过系统层的一个兼容层让Linux程序直接在Windows内核之上运行文件系统和系统调用都被翻译成了Windows能管的方式。用大白话讲虚拟机相当于在你家里搭了个独立的集装箱里面自成一套生活设施但占地方、进出都麻烦WSL则是在你家楼里专门给Linux开了一个房间卧室、客厅、水电都共用但生活习惯完全按Linux那一套来。所以WSL启动只要一两秒内存占用也很低并且Windows的磁盘可以直接被Linux目录访问反过来Linux里的文件也能在Windows资源管理器里看到。它对初学者最大的价值是“试错成本极低”。想玩坏系统删掉重装就是几分钟的事想备份环境一条命令把整个发行版导出成压缩包想学习不用等虚拟机开机也不用担心改坏双系统的引导菜单。我教过的学员里几乎没有人因为用WSL而把Windows搞崩过。1.2 WSL 1和WSL 2别纠结直接选2WSL现在分1和2两个大版本。WSL 1的Linux程序直接映射到Windows API兼容性够用但部分场景很怪比如Docker跑不了WSL 2则换成了真正的轻量虚拟机直接使用Linux内核兼容性大幅提升Docker、CUDA这些都能跑绝大多数Linux环境下的操作都和一台真正的Linux服务器没有本质区别。唯一要提一下的差异在文件性能WSL 2的Linux访问Windows文件比如/mnt/c/目录会比WSL 1慢一点因为中间隔了一层转换。不过对初学者来说这个差距基本感知不到。我建议直接WSL 2除非你明确知道自己有某种特殊需求否则不要主动去降低版本。1.3 装好WSL避开设完就卡住的几个坑安装步骤其实很简单右键开始菜单选择“管理员身份的PowerShell”然后执行wsl --install这条命令会自动安装WSL功能、虚拟机平台以及默认的Ubuntu发行版。装完后重启系统会让你设置一个Linux用户名和密码——注意这个密码不会显示在屏幕上输入时看着像没反应其实已经在记录了属于新手最容易困惑的瞬间。如果你在安装过程中发现下载进度条一直不动或者速度极慢可以试试在命令后面加一个参数让安装走Web下载通道wsl --install --web-download这一步能应对一部分网络环境下的卡顿问题实测比干等默认安装源要稳定。装好之后先看两个命令的输出确认自己装的是WSL几wsl -l -v wsl --status如果你想知道当前Ubuntu的版本号和代号比如22.04还是24.04进入Linux后执行lsb_release -a后面配置apt源、装软件都要用到。还有一个常见需求默认安装会把WSL放在C盘C盘紧张的同学想挪到D盘。操作上不是改个设置项而是先导出再导入wsl --export Ubuntu D:\ubuntu-backup.tar wsl --unregister Ubuntu wsl --import Ubuntu D:\WSL\Ubuntu D:\ubuntu-backup.tar注意这样挪完之后默认登录用户可能会变成root需要额外配置。我的建议是新手阶段先别动位置优先把命令和环境跑顺等真正需要再迁移。2. CMD、PowerShell和Windows Terminal到底该开哪个窗口2.1 三者的关系别把“终端”和“Shell”混为一谈很多教程一会儿让你开CMD一会儿让你开PowerShell又冒出个Windows Terminal初学者直接在“到底该用哪个”上纠结半天。我先给结论这三个东西不是一个层面的角色实际并不冲突。CMD命令提示符和PowerShell是“Shell”负责解释你输入的命令。CMD是DOS时代的遗留遗产还能跑一些老命令PowerShell是微软后来推出的现代化Shell能写脚本、能面向对象功能强得多。而Windows Terminal是个“终端模拟器”它只是个容器窗口里面可以承载多个标签页每个标签页运行不同的Shell——可以是CMD、PowerShell也可以是WSL里的Ubuntu。打个比方PowerShell和CMD是两位司机Windows Terminal是这座驾驶舱你可以同时让两位司机各开一辆车还能一键切换视角。WSL里的Ubuntu则是第三位司机Windows Terminal里开了它的标签页后你就在同一个窗口里操作Windows和Linux两种环境切换成本几乎为零。2.2 Windows Terminal里值得先改的几个配置强烈建议把Windows Terminal设为Windows的默认终端程序这样以后无论你从什么入口打开终端窗口用的都是它。打开Windows Terminal后按Ctrl,进入设置在“启动”页把“默认终端应用程序”改为“Windows Terminal”。Windows Terminal支持直接编辑配置文件settings.json强大的细节都在里面。新手不必全改我最推荐先调整三个点一是默认配置文件可以设为“Ubuntu”这样每次打开终端直接进入Linux二是字体和字号默认字体偏小调到Fira Code Nerd Font或者直接用Cascadia Mono看着舒服三是体验里开启右键粘贴避免每次按CtrlShiftV不习惯。还有一个很影响日常使用的小问题PowerShell里中文乱码。这往往是代码页不是UTF-8导致的。Windows Terminal默认一般会处理得比较好但如果遇到乱码在PowerShell里执行一次chcp 65001就能临时切换到UTF-8代码页之后中文显示就正常了。2.3 进Linux后先练的几步基础操作命令格式一目了然不管是Linux还是Windows命令行都有一个统一的结构命令 选项 参数。比如ls -la /home这里ls是“列出目录内容”的命令-l表示用详细列表显示-a表示显示隐藏文件/home是要查看的位置。选项常以-开头表示缩写--开头表示完整单词例如--help和-h经常等价。刚进入Linux我建议先把下面这几个命令敲熟全部练过一遍再继续pwd打印当前所在目录JetBrain系IDE里怎么看“我在哪”全靠它。ls列出目录内容配合-l和-a看文件权限和隐藏文件。cd切换目录cd ..回到上一级cd ~回到自己的家目录。cat查看文件内容等价于Windows里的type。man 命令名查看某个命令自带的手册linux里“不急先查手册”是职业习惯。举个对比表方便快速记忆Windows习惯Linux对应说明dirls列目录type a.txtcat a.txt查看文件copycp复制文件/目录movemv移动文件/目录delrm删除文件/目录cdcd切换目录保留同名此外还有一个概念sudo。它代表用管理员权限执行命令在Linux里特别常见比如装软件、修改系统配置。注意首次执行sudo会要求输入密码输入时不显示任何字符这属于安全问题设计不是系统卡了。3. apt命令把“应用商店”亲手装进Linux大脑3.1 update和upgrade到底有什么区别apt的全称是Advanced Package Tool是Debian系LinuxUbuntu、Debian、Linux Mint等默认的软件包管理器。它负责解决一个核心问题你想装某软件时软件本身和它依赖的一大堆东西应该从哪来、装哪些版本、冲突了怎么办。初学者最容易踩的第一个坑就是把apt update和apt upgrade混为一谈。update是“刷新软件源列表”——让系统去看看网上仓库里有哪些软件、有哪些新版本它不会升级任何已安装的软件upgrade才是“升级已安装的软件”——把本机软件更新到仓库中的最新版本。正确的日常操作习惯是先update再upgrade甚至只update然后有针对地安装单个软件。直接上来就upgrade也不是不行但有时会触发一次量大面广的系统更新新手看着输出一大片反而容易慌。我常用的命令组合sudo apt update sudo apt upgrade -y sudo apt install 软件包名 sudo apt remove 软件包名 sudo apt purge 软件包名-y参数表示“后续所有询问都默认回答Yes”适合批量操作remove只删软件本体purge连配置一起删。想查某个软件是否已经安装可以用apt list --installed | grep 软件名想按名字搜索仓库里有什么用apt search 关键词。3.2 apt源软件仓库到底做了什么为什么大家都说换源apt装软件不是凭空下载的它通过/etc/apt/sources.list文件或/etc/apt/sources.list.d/目录下的配置文件告诉系统“软件都去哪里找”。这个地址列表就叫“源”。默认情况下Ubuntu指向的是官方服务器国内网络访问经常不稳定所以就有了“换源”一说——换成国内镜像站。我在实际配置中最常用的是清华源或中科大源。以Ubuntu 22.04为例编辑源文件前先备份sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo nano /etc/apt/sources.list然后换成清华源的地址这里以22.04代号jammy为例不同版本代号要用lsb_release -a确认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-security main restricted universe multiverse保存退出后执行sudo apt update会看到下载速度和索引刷新速度明显提升。这个操作我一直认为属于“必经之路”无论你是在家还是在办公室换完源能省下大量等待时间。不要小看这一步很多新手栽在“apt装不上软件”上本质上都是源的问题要么默认源不可达要么本地源缓存损坏。遇到奇怪报错先换源、再apt update能解决七八成问题。3.3 实战完整安装一个软件并读懂终端输出选一个特别适合新手体验的软件来演示——htop一个增强版的进程管理器比系统自带的top好看很多也能直观感受Linux进程管理的魅力。整个过程如下sudo apt update apt search htop sudo apt install htop执行安装后终端会输出一大段信息其中关键部分我解释一下Reading package lists... Done正在读取软件源列表。Building dependency tree正在构建依赖关系树就是判断“这个软件需要哪些依赖”。0 upgraded, 1 newly installed意思是0个软件升级1个新软件将被安装。Need to get 148 kB of archives需要从网上下载148KB的软件包。之后会询问是否继续输入Y回车即可。安装完成后直接输入htop就能启动那个漂亮的进程界面按F10或q退出。这里提醒一句sudo的时候提示输入密码你键盘输入屏幕没有任何反应是正常的盲打输入后按回车即可别以为自己把密码输错了。4. Package Dependency那些“顺带安装”的软件在悄悄教你怎么回事4.1 依赖到底是什么报错读得懂吗Linux里装软件时会发现安装一个包经常“顺带安装”好几个小包这些就是它的依赖。依赖Dependency的含义是这个软件运行时需要用到一些公共库、工具包它们作为地基存在。讲得生活化一点你买了个书架软件A但书架要固定到墙上需要膨胀螺丝和电钻依赖包B、C。apt的职责就是帮你判断“装书架需要哪些工具”然后一次性把工具和书架都准备好。当你手动安装一个不来自软件源仓库的软件包时系统就不知道依赖在哪里找于是会看到这样经典的报错some-app: Depends: libnotify4 ( 0.7) but it is not installable翻译成人话这个软件想要系统里有一个叫libnotify4、版本号大于等于0.7的库但当前环境里要么没有要么仓库里找不到符合条件的版本。依赖本身分为两类一类是Depends硬依赖缺了软件根本跑不起来另一类是Recommends推荐依赖和Suggests建议依赖缺了不影响启动但功能可能不完整。apt默认会把Depends和Recommends自动装掉新手看到“自动安装额外软件包”不用慌这是正常行为。4.2 依赖冲突的排查链路别慌按顺序走依赖出现问题时的症状五花八门有的报unmet dependencies有的说broken packages甚至有的一直让你运行apt --fix-broken install。我的排查顺序比较固定先刷新源sudo apt update确保本地索引和远端一致。自动修复执行sudo apt --fix-broken install让apt尝试自动修复损坏的依赖关系。这条命令是万能第一步经常一通就通。查询软件包信息如果还不行用apt-cache policy 包名看候选版本和当前版本判断是不是版本冲突。手动搜索缺失依赖的来源用apt search 缺失包名看看仓库里有没有如果没有考虑添加相关第三方仓库或下载对应.deb包。重新安装目标软件把依赖解决掉后再执行一次安装。举一个我曾经遇到过的例子想给一台老旧的Ubuntu 20.04装最新版nginx结果apt提示libssl3版本太老不满足。我的处理是先apt update再apt install -f无效查apt-cache policy libssl3发现源里确实没有新版本最终通过添加nginx官方仓库后才解决。整个过程就是上面链路一步步走完没有任何魔法。4.3 依赖管理是Linux绕不开的设计哲学学Linux学到一定阶段会发现自己不是被“命令数量”难倒的而是被“包管理思想”难倒的。Debian系用aptRedHat系用yum/dnfArch系用pacman每一套都是一样的核心逻辑软件包声明依赖包管理器解析依赖树系统维护统一版本库。理解依赖带来的好处是遇到软件安装问题不会像无头苍蝇一样到处搜“报错怎么办”而是自己顺着依赖树一层层拆清楚。依赖管理也解释了为什么Linux服务器上的软件不容易“全家桶”——每个软件包只声明自己真正需要的库不打包重复资源。我建议初学者在第一次跑通apt install后多做两个练习一个是用dpkg -l查看当前系统装了哪些包无比庞杂另一个是用dpkg -S /usr/bin/htop反查某个文件属于哪个包。这两条命令会让你对系统“拆解”有直观认识后面学什么都快。5. 踩坑实录下载了一个.deb安装包双击却装不上5.1 装.deb的正确姿势优先用apt而不是dpkgWSL里的Ubuntu和正常Linux一样很多软件官网提供.deb格式安装包。新手从网上下了个something.deb习惯性双击WSL图形界面里确实能双击大概率弹错。这是因为.deb文件本质上是个“压缩包安装脚本”它不会自己处理依赖。网上很多老教程让你用dpkg -i直接安装但这个命令比较“死板”装完如果报依赖缺失它不会自动补装。我的习惯是安装.deb时直接交给apt来处理cd ~/Downloads sudo apt install ./your-app_1.0.0_amd64.deb注意路径前面有个./这是告诉apt“这个包在本地当前目录”没有这个前缀apt会去软件源里找同名包。用apt装.deb会自动解析它的依赖并尝试从源里补装省心很多。5.2 一次完整的依赖缺失修复过程举个实例我下过一个叫some-app的安装包当时执行安装后报The following packages have unmet dependencies: some-app : Depends: libnotify4 ( 0.7) but it is not installable E: Unable to correct problems, you have held broken packages.看到held broken packages别慌这在绝大多数情况下不是真的“锁包”而是“依赖没凑齐”。按前面链路走sudo apt update sudo apt install -f第一条刷新索引第二条让apt自动修复损坏依赖。如果第二条输出“0 upgraded, 0 newly installed”说明没有可自动修复的东西继续查apt-cache policy libnotify4看到仓库版本确实低于0.7或者干脆没有包那就得考虑让这个软件用系统自带的替代库。现实中有些商业软件依赖很老最实用的做法是查看软件官网的安装文档看它是否支持--no-install-recommends之类的参数或者是否有依赖的专门安装包。如果以上都解决不了最直接的办法是换一个安装方式——很多软件提供AppImage格式不用安装直接运行适合被依赖问题劝退的新手。5.3 修完之后我建议你养成的两个习惯第一个习惯是安装任何第三方软件前先看它的说明文档尤其是要弄清楚它针对的系统版本和依赖要求。WSL里的Ubuntu版本和普通服务器基本相同但第三方包的兼容性偶尔有差异多读一行说明能省不少事。第二个习惯是没事多做快照备份。WSL支持导出环境导出后保存在D盘出问题能快速回滚比反复折腾系统更有价值。我每隔几周就把配置好的环境导出一次遇到搞不定的依赖问题直接恢复而不是在一台机器上硬拼。如果你把第4章的依赖逻辑和第5章的排查链路都跑通了Linux基础这一关就算正式迈过去了。后面再学文件权限、用户管理、进程调度你会发现自己也敢动手玩Docker这类依靠依赖管理的容器工具了。学Linux从来不是背命令而是理解整个系统怎么组织自己。第一条路你自己走一遍比我讲十遍都管用。
返回列表