恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Ubuntu 20.04 软件中心与软件安装:apt/snap 恢复指南
首页
资讯中心
/
Ubuntu 20.04 软件中心与软件安装:apt/snap 恢复指南
Ubuntu 20.04 软件中心与软件安装:apt/snap 恢复指南
发布时间:2026/9/18 21:17:23
上周帮同事收拾一台跑了两年多的 Ubuntu 20.04 工作站症状特别典型他只是想装个看 PDF 的小工具结果点左上角那个软件中心图标转了两圈就没了再右键一看启动器里的图标干脆不翼而飞。打开终端敲snap list输出里连snap-store的影子都没有——这基本可以断定不是软件中心坏了是它被人清理掉了。Linux 系统里的软件安装和软件中心恢复看着是两件事实际上是一根藤上的两个瓜。Ubuntu 20.04代号 Focal Fossa2020 年 4 月发布的 LTS 长期支持版本最后一个点版本是 20.04.6从这一代开始把图形化软件中心整个换成了 Snap 打包的应用这直接导致了很多老教程里的修复方法失效——你按网上的方法apt install gnome-software图标还是不出现因为真正撑起Ubuntu Software这个门面的根本不是那个 deb 包。这篇文章就围绕 Ubuntu 20.04 的软件安装体系、包管理器分工、以及软件中心消失后的完整恢复链路来讲适合刚接触 Linux 的新手也适合被这个问题卡了半天、查了一圈教程越修越乱的老用户。1. Ubuntu 20.04 装软件这件事先把三个包管理器分清楚很多人装软件时的困惑本质上是没搞清楚 Ubuntu 里同时跑着几套互不相同的软件分发体系。你在终端敲的每一行安装命令背后走的是完全不同的仓库、不同的依赖解析器、不同的卸载逻辑。分不清这三者装不上和卸不干净就会反复出现。1.1 apt、dpkg、snap 各自管什么先给一个最直观的定位工具层级依赖处理典型仓库卸载是否干净dpkg底层不处理只管解包安装无直接操作 deb 文件一般aptdpkg 的上层封装自动解析并补齐依赖官方源、PPA、第三方源较干净snap完全独立的体系依赖打包在应用内部Snap Store很干净但占空间dpkg是 Debian 系最底层的包管理工具它只做一件事把一个.deb文件里的内容铺到文件系统上然后登记到数据库里。它不知道你要装的软件依赖什么也懒得管——依赖缺失时它会直接把错误甩给你让你自己想办法。apt是站在dpkg肩膀上的调度器。它先去读/etc/apt/sources.list和/etc/apt/sources.list.d/下面的仓库索引算出一套能满足依赖的安装顺序再挨个调用dpkg落地。这也是为什么apt报错时经常提示你跑一下apt --fix-broken install——它知道数据库里有个半装的状态需要收尾。snap是另一条完全平行的路。它把应用和它需要的运行库、语言运行时全部塞进一个压缩镜像里挂载到/snap目录下运行理论上跟系统里其他部分互不干扰。代价是每个 snap 应用动辄几百兆启动时还要挂载第一次打开会比 apt 装的程序慢一些。Ubuntu 20.04 的软件中心snap-store本身就是个 snap 应用这一点后面还要重点讲。1.2 一个真实场景同一个软件三条安装路径的差别假设你要装一个代码编辑器三条路都能走通但体验完全不同。走apt命令是sudo apt install 包名装完文件散落在/usr/bin、/usr/share等处体积小启动快但版本通常比较老——官方源里冻结的版本可能比上游落后一两年。走snap命令是sudo snap install 包名装完在/snap/bin/下有软链接版本永远是最新的自动更新不用你管但占用空间大而且因为是沙箱运行访问你 home 目录之外的文件、调用系统里的某些硬件接口可能会被权限挡住需要手动sudo snap connect授权。走第三方 deb 或者源码编译版本最新、可控性最强但升级和卸载全靠你自己记着时间一长就是个隐形维护负担。我的建议很简单系统工具和基础库走 apt桌面应用和需要新版本的开发工具走 snap实在没有才考虑第三方 deb。这个顺序能让你在 90% 的场景里少踩坑。顺带说一句版本确认动手之前先看清楚自己在哪个系统上lsb_release -a会输出发行版和代号cat /etc/os-release能看到更详细的构建信息。这一步很有必要——网上大量教程是针对 18.04 甚至 16.04 写的照搬到 20.04 上软件中心的修复方法第一个就不对。2. 把 apt 用顺镜像、更新、安装与卸载的完整动作apt是日常使用频率最高的工具但真正用明白的人不多。大部分人的使用习惯停留在装东西敲 install卸载敲 remove遇到报错就上网搜一条命令复制粘贴结果问题越滚越大。2.1 换国内镜像源sources.list 的改法与验证默认的官方源在国内访问速度经常慢到让人怀疑网络断了apt update卡在 Waiting for headers 十几分钟是常事。换成国内镜像是最有效的提速手段清华、中科大、阿里云这些镜像站都是长期稳定运行的开源镜像直接改配置即可。动手前先备份这一步别省sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak然后确认当前系统的代号20.04 的代号是focallsb_release -cs输出的focal就是你要在源地址里用的字段。不要想当然地写20.04仓库路径用的是代号不是版本号写错了apt update会直接报 404。一个可用的 20.04 源配置长这样这里以清华镜像为例deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse改完之后跑一次sudo apt update观察是否有Err或404。如果出现Release file ... is not valid yet八成是系统时间不对跟镜像服务器的时间差超过允许范围了用timedatectl看一眼必要时开一下自动校时。提示改源之前如果不确定先把sources.list整体备份出问题直接sudo cp回去。见过太多人改坏之后连原始内容都找不回来。2.2 apt update / install / remove / purge 的区别与常用参数这几个子命令的语义差别值得单独拎出来说清楚apt update只刷新本地缓存的仓库索引不安装也不升级任何东西。换了源之后必须跑。apt upgrade把已安装的包升级到新版本不会删除任何已有包。如果某个升级需要移除旧包它会跳过并提示你。apt full-upgrade允许为完成升级而移除或新增包比upgrade更彻底。跨版本升级时会用到日常慎用。apt install 包名安装。加-y跳过确认加--reinstall强制重装当前版本。apt remove 包名卸载程序但把配置文件留在系统里。apt purge 包名连配置文件一起清掉。修复软件中心、清除错误配置时purge 比 remove 更有用。apt autoremove清理那些当初作为依赖装进来、现在没人需要的包。排查问题时有两个查询命令特别好用。apt-cache policy 包名会告诉你这个包当前有哪些候选版本、分别来自哪个仓库当你怀疑某个软件装的是旧版或者来自一个不该存在的第三方源时这条命令一眼就能看出来。apt list --installed | grep 关键词则用来确认某个包到底装没装、装的是哪个版本。还有一个冷门但很实用的dpkg -S /usr/bin/某程序反查某个可执行文件属于哪个包。清理来路不明的程序时非常管用。2.3 依赖断裂与锁文件最常见的两类报错怎么破apt 报错里出现频率最高的就两类处理方式完全不同。第一类是依赖问题典型输出是下列软件包有未满足的依赖关系或者正在处理用于 xxx 的触发器时出错。这时候先不要乱删东西按顺序跑sudo apt --fix-broken install sudo dpkg --configure -a sudo apt autoremove--fix-broken会让 apt 尝试补齐缺失的依赖--configure -a是把数据库里所有处于解包了但没配置完状态的包重新配置一遍。九成的依赖断裂问题这两条就能解决。如果还不行用sudo apt install -f再兜一次底。第二类是锁文件被占用报错类似无法获得锁 /var/lib/dpkg/lock-frontend。原因通常是后台还有一个 apt 或 unattended-upgrades 在跑或者上次安装被 CtrlC 强行打断了。正确处理顺序是先用ps aux | grep -i apt看看是不是真有进程在运行有的话等它跑完确认没有进程后再清理锁文件。不要一看到锁就无脑删如果真的有 apt 在跑你把锁删了两个 apt 同时写数据库后果比等几分钟严重得多。确认无进程后再执行sudo rm /var/lib/dpkg/lock-frontend sudo rm /var/lib/dpkg/lock sudo rm /var/cache/apt/archives/lock sudo dpkg --configure -a3. 不在源里的软件deb 包、PPA、源码编译与 AppImage官方源里的软件版本偏保守很多新工具根本不在里面。这时候就要走扩展渠道但每一条渠道的成本和风险都不一样选错了会给以后的系统维护埋雷。3.1 dpkg 装离线 deb 包以及依赖手到病除的修法从官网下载的.deb文件标准装法是sudo dpkg -i 软件包.deb但这一步十有八九会报依赖缺失。此时不要慌也不要一个个手动去装依赖直接跑sudo apt install -fapt 会读数据库里那个依赖未满足的记录自动把缺的包补上然后再回头配置刚才那个 deb。这个组合拳比任何手动装依赖的方式都省事。其实还有一个更省心的写法很多人都不知道sudo apt install ./软件包.deb在路径前面加./apt 会把它当成一个本地包源来处理安装过程中会自动解析并下载依赖一步到位不用再补apt install -f。20.04 上的 apt 版本完全支持这个用法。卸载的对应命令是sudo dpkg -r 包名想连配置一起清掉用sudo dpkg -P 包名。3.2 PPA 与第三方仓库方便与风险并存PPA 是个人或团队在 Launchpad 上维护的软件源加进来之后apt就能直接装到新版本。添加命令是sudo add-apt-repository ppa:用户/仓库名 sudo apt update如果提示add-apt-repository: command not found先装software-properties-common。PPA 的便利背后有个容易忽略的坑任何一个 PPA 挂掉或者更新延迟都会让整个apt update失败报错信息里会明确写出是哪个源的 Release 文件取不到。这时候其他所有源明明都是好的但你就是装不了任何东西。解决办法是进/etc/apt/sources.list.d/把对应那个.list文件临时改个后缀名禁用掉等它恢复再改回来。另一个经验同一个软件的 deb 官方源和 PPA 不要同时挂很容易出现版本冲突apt-cache policy一看会发现候选版本来源混乱最后装出来的是哪个谁都说不准。3.3 源码编译与 AppImage什么情况下才值得源码编译的流程大家都熟./configure make -j$(nproc) sudo make install。它的最大问题不是编译慢而是卸载极其困难——make install把文件撒得到处都是想删干净基本靠手动回忆。我的做法是编译时用--prefix/usr/local指定安装前缀如果项目支持make uninstall就用它卸载不支持的装之前用checkinstall代替make install它会顺手打成一个 deb 包以后卸载就跟普通软件一样了。另外make时加-j$(nproc)可以并行编译把 CPU 核心吃满nproc会自动返回当前的核心数不用自己数。AppImage 是另一种思路一个文件就是一个完整应用不需要安装chmod x 应用.AppImage ./应用.AppImage20.04 上第一次运行 AppImage 常常报 FUSE 相关的错误装一个libfuse2就好sudo apt install libfuse2AppImage 适合那种偶尔用一下、不想留痕迹的工具缺点是每次都要手动去官网下新版也没有系统级的更新机制。4. 软件中心不见了先搞清楚它到底是个什么东西修东西之前得先知道修的是什么。这一步如果搞错后面所有操作都是白费力气——我看到过太多人一遍遍重装gnome-software然后困惑为什么图标还是不出来。4.1 Ubuntu Software 在 20.04 里是 snap-store不是普通程序这是整个问题的关键。Ubuntu 从 20.04 开始把图形界面上那个叫 Ubuntu Software 的软件中心换成了 Snap 打包的应用包名就叫snap-store。它本质上是 GNOME 的gnome-software被重新打包塞进了 snap 里所以你系统里同时存在两个东西gnome-software一个传统的 deb 包装完在/usr/share/applications/下有个桌面入口。snap-store一个 snap 包桌面入口在/var/lib/snapd/desktop/applications/目录下。在实际的 20.04 桌面上你点到的那个软件中心图标指向的是snap-store。这就解释了一个经典现象你sudo apt install --reinstall gnome-software重装半天图标纹丝不动因为你根本没碰到出问题的那个组件。自己动手验证一下就很清楚了snap list | grep -i store ls /usr/share/applications | grep -i software ls /var/lib/snapd/desktop/applications | grep -i software如果第一条命令什么都没输出说明snap-store这个 snap 包已经不在了。4.2 图标消失的五种表现对应五种病因同样是软件中心打不开现象不同根因完全不同。对照下面这张表先定位比盲目重装高效得多。现象可能病因优先排查方向启动器里完全找不到图标snap-store 被移除或 snapd 未安装snap list是否有输出图标在点了没反应snap-store 进程卡死或已崩溃ps aux | grep snap-store图标在打开后一直转圈网络或 DNS 异常取不到商店数据ping测试域名解析打开了但一片空白本地缓存损坏清理 snap-store 缓存目录报错无法连接到 Snap Storesnapd 服务未运行或系统时间错误systemctl status snapd还有一种容易被忽略的情况系统时间不对导致 snap 校验失败。snap 包安装时会做签名验证如果本机时间跟真实时间偏差过大验证直接不通过表现就是 snap 命令各种莫名其妙的失败。排查时顺手敲一句timedatectl看System clock synchronized是不是yes不是的话sudo timedatectl set-ntp true打开自动校时。这个坑我在一台长期断电的测试机上踩过折腾了快一个小时才想到是时间问题。5. 软件中心恢复实战一条完整的排查链路下面这套流程是我自己总结的从最轻量的操作开始逐层深入。不要一上来就重装很多情况重启一下服务就好了重装反而会丢掉你已经装过的 snap 应用列表。5.1 第一步确认 snapd 状态与系统时间先看服务是否在跑systemctl status snapd看到active (running)才算正常。如果是inactive或者failed先启用并启动sudo systemctl enable --now snapd.socket sudo systemctl restart snapd如果snap这个命令本身都不存在说明 snapd 压根没装或者被卸了sudo apt update sudo apt install snapd装完记得重新登录一下会话让/snap/bin进入 PATH。接着确认时间timedatectl时间不对就sudo timedatectl set-ntp true等几秒钟再timedatectl复查一次。5.2 第二步重装 snap-store 与 gnome-software 插件服务正常、时间正常就可以处理组件本身了。先看看当前有哪些 snap 处于异常状态snap changes输出里如果有Error状态的记录说明之前某次操作中断了先让它自愈sudo snap refresh然后处理 snap-store。如果它还在但卡死先杀掉进程再刷新sudo killall snap-store sudo snap refresh snap-store如果它压根不在了重新装回来sudo snap install snap-store如果 snap 体系提示包处于损坏状态就先移除再装sudo snap remove snap-store sudo snap install snap-store至于gnome-software那一侧也不要完全放着不管——有些场景下系统走的是 deb 版入口或者你需要 snap 插件来让 deb 版软件中心能显示 snap 应用sudo apt install --reinstall gnome-software gnome-software-plugin-snap装完之后刷新桌面数据库让图标重新注册sudo update-desktop-database这一步很多人会漏掉。桌面环境靠.desktop文件的缓存来生成启动器图标缓存不同步的话程序明明装好了图标还是不出现。5.3 第三步清理缓存、权限与残留配置前面两步做完图标还是不出来就要往缓存和权限上查了。snap-store 的用户级缓存通常在~/snap/snap-store/目录下如果内容损坏会出现打开就闪退的情况。清理方式是把整个目录改名而不是直接删方便出问题时回退mv ~/snap/snap-store ~/snap/snap-store.oldGNOME 软件那一侧的缓存则在~/.cache/gnome-software/同样处理。改完名重新打开软件中心它会重新生成一套干净的配置。系统级的 snap 缓存也可以顺手清一次sudo rm -rf /var/cache/snapd/* sudo systemctl restart snapd权限方面重点看/var/lib/snapd的所有者有没有被改动过。正常情况下它属于 root如果之前有谁为了图方便chmod -R 777过snapd 会拒绝启动或者行为异常ls -ld /var/lib/snapd属主应该是root root。不对的话改回来sudo chown -R root:root /var/lib/snapd注意给系统目录批量改权限是排障里最容易治病治出新病的操作改之前一定先记录原始权限改完立刻验证服务状态。5.4 如果还是不行绕开软件中心直接命令行装说实话我个人的习惯是从来不指望图形化软件中心。它慢、搜索不准、有时候还推荐一堆不相干的 snap 应用。日常装软件直接命令行效率高得多。常见的几类需求对应的命令其实就那么几条# 装具体应用 sudo snap install code --classic sudo apt install vlc # 搜索有哪些可选 snap find 关键词 apt search 关键词 # 看某个应用详情 snap info 包名 # 一次性装多个 sudo apt install git curl wget htop--classic这个参数值得说一下。snap 默认运行在沙箱里权限收得很紧像代码编辑器这种需要读取任意目录下的项目文件、调用外部命令的工具必须用--classic模式安装否则会出现打开了但读不到项目文件这类怪问题。看到某个 snap 应用行为异常第一反应就该去查它是不是需要 classic 权限。如果连命令行都装不上那就得回到网络层面查了。先测 DNS 解析nslookup archive.ubuntu.com解析不出来就是 DNS 配置问题检查/etc/resolv.conf能解析但连不上ping一下看丢包情况如果是公司内网环境还要确认有没有走内部软件源或者访问策略。6. 装完之后的高频坑输入法、字体、环境变量与解压乱码软件装上了不等于能用。Ubuntu 20.04 上还有一批特别高频的装完还有后续的问题几乎每个中文用户都会撞上一两次。6.1 中文输入法从装到能用的完整流程输入法这个问题只装不配等于没装。20.04 默认是 ibus 框架但你也可以换成生态更成熟的 fcitx。以 fcitx 加拼音为例sudo apt install fcitx fcitx-googlepinyin fcitx-config-gtk im-config -n fcitxim-config -n fcitx这一步是设置默认输入法框架很多人跳过这步结果装完重启还是打不出中文。然后注销重新登录不是重启系统注销当前会话就够了。登录后还要补环境变量否则在某些应用里输入法不生效。把这些写进~/.xprofileexport GTK_IM_MODULEfcitx export QT_IM_MODULEfcitx export XMODIFIERSimfcitx这里有个细节如果你的会话用的是 Wayland 而不是 Xorg.xprofile不一定被读取这时候要么切回 Xorg 登录要么把这几行写进~/.profile。判断自己在哪套显示协议下用echo $XDG_SESSION_TYPE就行。还有一个坑是安装顺序。想装第三方拼音输入法比如从官网下的搜狗 deb 包必须先装好 fcitx 框架再装输入法包。反过来装依赖会挂不上表现出来就是安装过程报了一堆依赖错误装完了输入法列表里也看不到。6.2 环境变量改错导致命令找不到的复原方法这是另一类高频事故。往/etc/profile或者~/.bashrc里改 PATH 的时候把原来的内容覆盖掉了或者写漏了一个冒号重启之后所有基础命令都报command not found。应急恢复有两条路。第一条是在当前会话里直接把 PATH 重置回去export PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin第二条更彻底用一个不读取任何配置文件的干净 shell 启动bash --noprofile --norc进去之后用绝对路径打开出错的文件把有问题的那行删掉或者注释掉/usr/bin/vi ~/.bashrc改 PATH 的正确姿势永远是追加而不是覆盖export PATH$PATH:/your/new/path写法上必须带$PATH把原来的内容包含进来。再就是改/etc/profile之前先备份这一类文件改坏了普通用户连图形界面都可能登不进去。6.3 zip 解压中文乱码与字体安装Windows 上用压缩软件打出来的 zip文件名多半是 GBK 编码在 Ubuntu 上解压出来就是一串问号或者火星文。单次处理可以指定编码unzip -O cp936 压缩包.zip -d 目标目录/如果你的 unzip 版本不支持-O参数换7zsudo apt install p7zip-full 7z x 压缩包.zip -o目标目录/已经解压出来、文件名已经乱掉的可以用convmv批量转码注意加--notest之前先用--notest的反面也就是不加参数跑一次预览sudo apt install convmv convmv -f gbk -t utf8 -r 目标目录/确认预览结果正常之后再加--notest真正执行。字体方面系统级安装就是把字体文件放到/usr/share/fonts/下对应目录用户级放到~/.local/share/fonts/放完刷新缓存fc-cache -fv fc-list :langzh第二条命令用来确认中文字体有没有被正确识别。终端里中文显示成方块、代码注释里汉字变成方框基本都是因为系统缺中文字体装一个fonts-noto-cjk就能解决大部分场景sudo apt install fonts-noto-cjk。说到这里插一句个人体会Ubuntu 20.04 这套软件安装和软件中心的坑本质上都源于图形化工具背后跑着一堆命令行组件这个事实。搞清楚apt、dpkg、snap三条线各自的职责把命令行当成主力工具图形界面当成补充你会发现 90% 所谓的Linux 装软件难其实只是没找对那个该敲的命令而已。