news 2026/10/6 10:19:21

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Windows下玩转Linux:WSL、终端与apt依赖管理入门

如果你的电脑是一台Windows,但心里一直痒痒想学Linux——这集的入口刚好适合你。我自己就是从这个路径走过来的:不想给电脑装双系统,怕折腾坏引导;又受不了虚拟机那点性能和启动速度;最后发现WSL(Windows 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,别纠结,直接选2

WSL现在分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看着舒服;三是体验里开启右键粘贴,避免每次按Ctrl+Shift+V不习惯。

还有一个很影响日常使用的小问题: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系Linux(Ubuntu、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。我的排查顺序比较固定:

  1. 先刷新源:sudo apt update,确保本地索引和远端一致。
  2. 自动修复:执行sudo apt --fix-broken install,让apt尝试自动修复损坏的依赖关系。这条命令是万能第一步,经常一通就通。
  3. 查询软件包信息:如果还不行,用apt-cache policy 包名看候选版本和当前版本,判断是不是版本冲突。
  4. 手动搜索缺失依赖的来源:用apt search 缺失包名看看仓库里有没有;如果没有,考虑添加相关第三方仓库或下载对应.deb包。
  5. 重新安装目标软件:把依赖解决掉后,再执行一次安装。

举一个我曾经遇到过的例子:想给一台老旧的Ubuntu 20.04装最新版nginx,结果apt提示libssl3版本太老不满足。我的处理是:先apt update,再apt install -f,无效;查apt-cache policy libssl3发现源里确实没有新版本;最终通过添加nginx官方仓库后才解决。整个过程就是上面链路一步步走完,没有任何魔法。

4.3 依赖管理是Linux绕不开的设计哲学

学Linux学到一定阶段,会发现自己不是被“命令数量”难倒的,而是被“包管理思想”难倒的。Debian系用apt,RedHat系用yum/dnf,Arch系用pacman,每一套都是一样的核心逻辑:软件包声明依赖,包管理器解析依赖树,系统维护统一版本库。

理解依赖带来的好处是,遇到软件安装问题不会像无头苍蝇一样到处搜“报错怎么办”,而是自己顺着依赖树一层层拆清楚。依赖管理也解释了为什么Linux服务器上的软件不容易“全家桶”——每个软件包只声明自己真正需要的库,不打包重复资源。

我建议初学者在第一次跑通apt install后,多做两个练习:一个是用dpkg -l查看当前系统装了哪些包,无比庞杂;另一个是用dpkg -S /usr/bin/htop反查某个文件属于哪个包。这两条命令会让你对系统“拆解”有直观认识,后面学什么都快。

5. 踩坑实录:下载了一个.deb安装包,双击却装不上

5.1 装.deb的正确姿势:优先用apt而不是dpkg

WSL里的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从来不是背命令,而是理解整个系统怎么组织自己。第一条路你自己走一遍,比我讲十遍都管用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/6 10:19:08

font-awesome-4.7.0 实战指南:Web与WPF图标集成、避坑与子集化

简介:Font Awesome 4.7.0 是一套面向网页设计师与前端开发者的矢量图标字体库,内含约470个覆盖社交网络、通用对象与界面元素的图标,适合需要在响应式页面中灵活调用图标的初中级开发者。压缩包共37个文件,约654KB,包含…

作者头像 李华
网站建设 2026/10/6 10:17:19

C++结构体排序必知:sort与priority_queue的重载运算符及pair实战

如果你自己写过一段带排序的代码,八成撞过这堵墙:明明只是想把结构体按某个字段排个序,结果编辑器给你一屏报错;明明sort跑得好好的,换成priority_queue之后出队顺序完全变了。这类问题绕不开一个核心概念——结构体的…

作者头像 李华
网站建设 2026/10/6 10:16:15

NumPy索引与切片完全指南:视图、副本与性能优化

数组这玩意儿,但凡用过 Python 列表的人都不陌生,但一旦数据量上来、维度多起来,列表那套索引和切片就明显不够用了。Numpy 的 ndarray 之所以能成为数据分析、科学计算、深度学习这些领域的底座,索引与切片这套机制功不可没&…

作者头像 李华
网站建设 2026/10/6 10:15:31

拆解1111111111:从repunit到边界值测试的多重身份

有天我清理后台内容库,翻到一条只有标题的投稿,标题就是 1111111111——整整 10 个“1”排成一排,正文空白,关键词空白,摘要空白。换成以前,我大概率会直接归档进垃圾箱。但那天我盯着它看了很久&#xff0…

作者头像 李华
网站建设 2026/10/6 10:15:31

Spring AOP核心源码:MethodProxy的invoke与invokeSuper解析

如果有人问我 Spring 框架里最容易被低估的代理组件是谁,我会毫不犹豫地报出这个名字:MethodProxy.java。它不像 BeanFactory、ApplicationContext 那样天天挂在嘴边,也不像 JDK 动态代理的 InvocationHandler 那样被各种博客反复讲解&#x…

作者头像 李华
网站建设 2026/10/6 10:15:01

Navicat 64bit免安装版:解压即用的原理、部署与避坑指南

简介:这是一份为64位Windows环境准备的Navicat Premium免安装资源包,面向需要同时管理MySQL、MariaDB、Oracle、SQL Server等多种数据库的开发者与数据库管理员。压缩包约91.81MB,内置新版与旧版两个完整的Navicat Premium程序,均…

作者头像 李华