如果你的电脑是一台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对应 | 说明 |
|---|---|---|
dir | ls | 列目录 |
type a.txt | cat a.txt | 查看文件 |
copy | cp | 复制文件/目录 |
move | mv | 移动文件/目录 |
del | rm | 删除文件/目录 |
cd | cd | 切换目录(保留同名) |
此外还有一个概念: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。我的排查顺序比较固定:
- 先刷新源:
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系用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从来不是背命令,而是理解整个系统怎么组织自己。第一条路你自己走一遍,比我讲十遍都管用。