
如果你刚把 Ubuntu 22.04 装好进到桌面那一刻心情通常很爽但接下来往往会发生一件让人瞬间冷静的事打开终端敲apt update要么超时要么直接报“Temporary failure resolving”浏览器里的网页也刷不出来。明明系统都装上了网络却像根本没连通一样。这篇文章就是针对这个场景写的。我最近给一台刚做完初始化的 Ubuntu 22.04 工作站梳理网络和软件源把“装完系统之后怎么把网络和下载源一次理顺”的完整逻辑重新走了一遍。顺便提一嘴标题里的“Ubuntn”大概率是搜关键词时打出来的变体也不影响理解后面我都按标准拼写 Ubuntu 来说。全文主要覆盖三件事系统级网络状态检查、静态 IP 配置、apt / pip / conda / npm 的软件源切换。会对刚装好系统的人、在虚拟机里做实验的同学、以及需要给内网服务器做初始化的人都有参考价值。我尽量少讲理论多给可以直接复制到终端里的命令同时把那些特别容易翻车的细节单独标出来。毕竟网络配置和软件源这种东西配置好了不觉得有什么配置坏了那是真的难受。1. 拿到 Ubuntu 22.04 后先把网络状态盘明白再谈其他很多人会在系统刚装好、还没判断出问题在哪一层的时候就开始搜索各种配置文件去改结果越改越乱。我个人的习惯是先花十分钟把网络现状看清楚再动手。这一步能帮你把问题定位到“接口没起来”“没拿到 IP”“路由缺失”还是“DNS 解析失败”不同问题对应完全不同的处理方式。1.1 用三条命令看清接口、IP、路由打开终端后先用下面三个命令组合做一轮基础巡检测试ip link ip addr show ip route showip link看的是物理和虚拟网卡的启用状态。正常情况下你会看到 lo 和有线/无线网卡网卡状态是UP。如果网卡显示state DOWN那就说明接口还没启用大多数情况下可以用sudo ip link set 网卡名 up先手动拉起来但如果重启后又变回 DOWN那就需要去检查网络管理服务或 Netplan 配置了。ip addr show是重点。你要看网卡上有没有拿到 IPv4 地址。在 VMware、VirtualBox 这类虚拟化环境里如果虚拟机用的 NAT 模式或仅主机模式通常应该有 192.168.x.x、172.16.x.x 之类的地址。如果执行完发现网卡下面只有inet6或者干脆没有inet字段说明 DHCP 没正常工作。ip route show则看默认路由。正常情况会有一条类似default via 192.168.1.1 dev ens33的记录。没有这条就算有 IP 也出不了网。一个更省眼力的写法是ip -br addr输出会把每个接口和地址压缩到一行一眼就能看完。我排查时会先用这个命令再按需展开看细节。1.2 先把问题分成“外网不通”和“DNS 不通”两类假设网卡正常启动、也有 IP但apt update还是报错。这时候不要急着改源先用下面两个命令定位ping -c3 223.5.5.5 ping -c3 www.aliyun.com第一个 ping 的是公网 IP第二个 ping 的是域名。这里会出现三种情况情况结果结论1两个都通网络完全正常问题很可能出在软件源地址本身2223.5.5.5 通域名不通DNS 解析有问题3两个都不通路由或网关层面出了问题很多人看到ping: www.aliyun.com: Temporary failure in name resolution就以为是网络断了实际上这只是 DNS 挂了。判断好这一层能少绕很多弯。1.3 22.04 的 DNS 和以前不太一样别看到 127.0.0.53 就慌如果定位到 DNS 问题可以直接看一下系统当前的解析器状态resolvectl status在 22.04 里systemd-resolved默认接管 DNS/etc/resolv.conf通常是一个软链接指向/run/systemd/resolve/stub-resolv.conf。所以打开 resolv.conf 时如果看到nameserver 127.0.0.53不用奇怪这是本地 stub resolver真正的上游 DNS 在resolvectl status的 DNS Servers 字段里。临时想换个 DNS 测试的话可以直接用sudo resolvectl dns 网卡名 223.5.5.5这样改不需要重启服务。确认是上游 DNS 的问题后再考虑写死到配置文件里。如果命令返回的是空白或报错并且这台机器上有systemd-networkd在跑还可以顺手看一眼systemctl status systemd-networkd总之第一阶段的结论是先确认网卡状态、IP、路由、DNS 这四层再往下走。层级没确认之前就乱改源往往会掩盖真正的问题。2. Ubuntu 22.04 静态 IPNetplan 下容易踩的坑我一口气排干净网络通完之后很多人会想把 IP 改成静态。尤其是虚拟机里的 Ubuntu重启后 IP 一旦变了Xshell 里保存的会话就全部作废非常难受。但 22.04 的网络配置方式跟早年用/etc/network/interfaces的年代已经有很大区别现在默认走 Netplan配置格式是 YAML对缩进极其敏感。2.1 先分清桌面版和服务器版的配置入口打开终端后先看看/etc/netplan/里有什么文件ls -l /etc/netplan/通常你看到的文件不是00-installer-config.yaml就是01-network-manager-all.yaml。其中00-installer-config.yaml是服务器安装器生成的默认走systemd-networkd01-network-manager-all.yaml是桌面版常见的渲染器是 NetworkManager。这两个配置背后的网络管理服务不一样处理方式也略有区别。如果你在桌面版上只是想要一个简单的静态 IP其实直接在“设置 - 网络”里改也不是不行但为了重启之后行为可预期我更建议直接把 Netplan 文件写好让配置变成可复制、可备份的东西。2.2 一份能用到底的 Netplan 静态 IP 配置示例假设网卡名是ens33你想把 IP 设为192.168.1.100/24网关是192.168.1.1DNS 用223.5.5.5和119.29.29.29那么可以新建一个配置文件sudo nano /etc/netplan/99-custom.yaml写入内容network: version: 2 renderer: networkd ethernets: ens33: dhcp4: false addresses: - 192.168.1.100/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: - 223.5.5.5 - 119.29.29.29这里有几个点需要留意。第一gateway4这个写法已经废弃了新版 Netplan 会直接报警告正确写法是上面这种routes方式。第二YAML 的缩进必须是空格绝不能用 Tab。ethernets:下面是两个空格ens33:下面是四个空格再往下是六个空格。缩进错了netplan apply大概率直接报解析错误。第三文件名的数字前缀决定了配置合并顺序。我习惯单独建一个99-custom.yaml就是为了避免跟安装器生成的默认文件混在一起后续要回滚时直接删掉这个文件就行不会动系统原来的配置。2.3 我强烈建议你每次改完都用 try而不是直接 apply这是我觉得整篇文章里最值得记住的一条习惯。netplan apply是立刻生效但如果配置写错了特别是你在通过 SSH 远程操作一台服务器时一个回车下去可能就把当前会话断了然后你再也连不上。正确做法是sudo netplan try --timeout30执行后会先做配置校验然后给出一个 30 秒的确认窗口。如果你没按回车确认到时间会自动回滚到上一份可用配置。这样即便配置有问题也不会把自己锁在门外。确认没问题后再sudo netplan apply本地虚拟机操作时可能觉得没必要但长期看这个习惯能救你很多次。我曾见过同事远程配置时手滑把网关写错apply之后整个人被断在机房外最后只能靠人肉到现场处理画面太惨烈。2.4 虚拟机里最常见的两个静态 IP 坑第一个坑是多网卡。如果你的虚拟机有 ens33 和 ens34 两张网卡并且都在 Netplan 里配了to: default的默认路由系统可能会随机选择一张网卡出外网现象就是时通时不通。我的处理原则是只让一张“出公网”的网卡配置默认路由其他网卡只配置内网地址和路由。第二个坑是桥接模式选错网卡。VMware 里桥接模式要绑到宿主机的物理网卡如果你笔记本连的是 Wi-Fi桥接却选了有线网卡虚拟机就永远拿不到可用 IP。这个不是 Ubuntu 的问题但很多新手会以为是自己系统配置错了在 Netplan 里反复折腾。3. 全家桶换源实操apt、pip、conda、npm 换到顺手为止网络通了以后下一步就是把各种包管理器的下载地址从官方源换成访问更快的镜像入口。这部分是“全家桶”的正文所在我按 apt、pip、conda、npm 四个逐一说明。这些操作的逻辑都是一样的修改默认的下载地址让系统从更近的镜像站拉取软件包。需要提醒一点不同镜像站的同步频率、可用性不完全一样建议选择你实际访问速度更稳定的那个不要迷信某个“万能源”。我在下面以清华 TUNA 和阿里云镜像为例。3.1 apt 换源先备份再调整最后 updateUbuntu 22.04 的 codename 是 jammyapt 源配置默认在/etc/apt/sources.list和/etc/apt/sources.list.d/目录下。换源前先把原文件备份sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak然后直接编辑sources.list替换成对应镜像站地址。用清华源的话22.04 的典型写法是sudo tee /etc/apt/sources.list EOF 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 EOF注意 security 也要一起换很多人只换了前三条结果apt update的时候还是会在 security 源上报超时。如果你不想手动输入整个文件也可以在原官方源基础上做批量替换sudo sed -i s|http://archive.ubuntu.com/ubuntu|https://mirrors.tuna.tsinghua.edu.cn/ubuntu|g; s|http://security.ubuntu.com/ubuntu|https://mirrors.tuna.tsinghua.edu.cn/ubuntu|g /etc/apt/sources.list这条 sed 命令会把官方源里的两个主域名都替换成清华镜像。替换完以后执行sudo apt update没有报错的话apt 这个环节就结束了。deb-src 那几行要不要开我个人的观点是除非你需要编译软件包或看源码否则没必要开开了反而会增加索引耗时。3.2 pip 换源写配置文件的优先级比命令行参数高Python 常见的换源方式有两种一种是在命令行里临时指定-i 地址另一种是把地址写到配置文件里。前者适合单次安装后者适合长期生效。在 22.04 上建议直接用pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ pip config list执行后pip 会替你创建好配置文件。如果你想知道这个文件在哪可以看pip config debug我自己更喜欢手写一份~/.config/pip/pip.conf因为可以顺手把trusted-host也写好。内容类似[global] index-url https://mirrors.aliyun.com/pypi/simple/ trusted-host mirrors.aliyun.com要说明的是阿里云这个地址是支持 HTTPS 的理论上不需要trusted-host但有些内网环境或老版本 pip 会因 SSL 证书校验失败而拒绝连接加这一行能少踩一个莫名其妙的问题。命令行临时指定也可以但我不建议长期用pip install requests -i https://mirrors.aliyun.com/pypi/simple/临时指定适合快速验证某个包能不能装上或者你不想影响全局配置的时候用。3.3 conda 换源不要直接复制网上老教程的 channels如果你用 Miniconda 或 Anaconda换源的配置文件是~/.condarc。先执行conda config --set show_channel_urls yes这个命令会自动帮你生成~/.condarc然后再编辑它内容可以参考channels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud这里要注意网上很多教程还停留在旧的https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge这种带完整路径的写法新版本 conda 的配置解析可能不认或者在实际使用时出现奇怪的 channel 错位。按上面custom_channels的格式写把conda-forge这类云渠道映射到镜像根路径更匹配当前常用版本的习惯。验证配置是否生效conda clean -i conda create -n test python3.10 -yconda clean -i会清理下载缓存里的索引信息避免换源后 conda 还在使用旧的缓存 URL。3.4 npm 换源一条命令加一条验证如果你在 Ubuntu 上开发前端项目npm 换源相对简单npm config set registry https://registry.npmmirror.com npm config get registrynpm config get registry返回https://registry.npmmirror.com就说明已经生效。如果你只是想让某一个项目走镜像但不想影响全局也可以在当前项目目录下写一个.npmrcregistryhttps://registry.npmmirror.com或者用一条命令临时指定npm install --registry https://registry.npmmirror.com3.5 一张表把常见镜像入口整理清楚我把上面涉及的入口汇总一下方便直接复制保存包管理器配置文件/命令镜像地址示例apt/etc/apt/sources.listhttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/apt/etc/apt/sources.listhttps://mirrors.aliyun.com/ubuntu/pip~/.config/pip/pip.confhttps://mirrors.aliyun.com/pypi/simple/pip~/.config/pip/pip.confhttps://pypi.tuna.tsinghua.edu.cn/simpleconda~/.condarchttps://mirrors.tuna.tsinghua.edu.cn/anaconda/npm~/.npmrchttps://registry.npmmirror.com等等这个表格里的pypi.tuna.tsinghua.edu.cn/simple是不是整洁罢了放置的是一个“入口示例”。实际操作时请以镜像站官方文档给出的最新地址为准因为有些镜像站调整过目录结构。换源本身并不复杂但换完以后如果出现报错才是真正考验人的地方。4. 换完源以后的翻车现场与恢复流程我把平时帮别人排查时遇到最多的几类报错按“现象 - 原因 - 解决”的顺序列出来。这一节的思路你完全可以复用到其他 Linux 发行版上本质都是同一个套路。4.1 现象apt update 报 “Could not resolve” 或 “Temporary failure resolving”这种情况通常不是源的问题而是 DNS 配置没生效。当你换了清华源以后apt update需要解析mirrors.tuna.tsinghua.edu.cn如果解析失败第一步就卡住了。可以先手动验证解析getent hosts mirrors.tuna.tsinghua.edu.cn如果命令返回一个 IP说明 DNS 正常如果只返回空或者报错就回到第一节提到的 DNS 排查流程用resolvectl status看当前 DNS再用sudo resolvectl dns ens33 223.5.5.5临时指定 DNS 测试。确认 DNS 恢复后再重新apt update。4.2 现象apt update 报 Release 文件过期或哈希校验失败这个报错经常出现在源文件写混的情况下。比如你把 jammy 的安全源写到了jammy-updates里或者把 20.04 的源混进了 22.04都会导致 apt 拿到和当前版本不匹配的索引信息。处理办法很直接先确认 codenameUbuntu 22.04 是 jammy不要写成 focal。lsb_release -a然后对照官方镜像站给出的配置一行一行检查sources.list。最容易出错的是 security 源很多旧教程还会写http://security.ubuntu.com但换镜像时这一行经常没被替换到。4.3 现象NO_PUBKEY 或签名验证失败这个报错常出现在你手动添加了第三方软件源之后。比如添加 Docker、PostgreSQL 这类第三方 apt 仓库如果没有正确导入 GPG 公钥apt update就会拒绝使用该仓库。22.04 对 GPG 密钥的管理方式和早期版本不太一样。老办法里的apt-key add已经废弃推荐正确路径是把公钥转成 keyring 文件再在 source 列表里用signed-by引用。以引入 Docker 官方仓库为例一套比较完整的写法是curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-ce-archive-keyring.gpg echo deb [archamd64 signed-by/usr/share/keyrings/docker-ce-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu jammy stable | sudo tee /etc/apt/sources.list.d/docker-ce.list然后再sudo apt update如果还是报 NO_PUBKEY那多半是 keyring 文件路径写错或者[signed-by...]参数没起作用。可以检查一下 keyring 文件是否存在以及sources.list.d里那行配置有没有拼错。这里需要单独提醒一句不是所有第三方源都适合换成国内镜像因为有些软件仓库根本不提供镜像入口。遇到这种仓库保持官方地址反而更靠谱。4.4 换源后建议做一次索引清理软件源切换以后本地缓存里可能还留着旧源的索引数据。最保守的做法是sudo apt clean sudo apt update sudo apt upgradeapt clean会清掉/var/cache/apt/archives下已经下载的旧包。已经安装的软件不受影响只是后续重新下载时会重新拉取。pip 和 conda 也有各自的清理命令。pip 的话可以使用pip cache purgeconda 使用conda clean -i都不复杂但能避免好多“明明换了源怎么还是从旧地址下载”的幻觉问题。5. 几个我养成的习惯顺手就把这些坑躲开了能走到这里说明网络通了、源也换好了基本的全家桶动作已经完成。不过根据我自己的经验还有几个习惯值得长期保持它们未必能让你立刻看到收益但在未来某一天一定能帮你省下大把时间。5.1 远程操作服务器时永远给自己留后门如果你是在服务器上配置网络netplan try是底线。除此之外我还有一个习惯修改任何网络配置文件之前先备份并记录当前文件内容与回滚方法。备份命令本身只需要几秒钟但万一出事它能让你从一个 SSH 断连的恐慌局面里快速恢复。5.2 不要把桌面版和服务器版的网络管理方式混着用桌面版的 NetworkManager 和服务器版的 systemd-networkd 是两套体系最怕的就是既在 GUI 里改网络设置又去手动写 Netplan 文件两边互相覆盖。我一般到了服务器环境会明确关掉 NetworkManager只保留 systemd-networkdsudo systemctl stop NetworkManager sudo systemctl disable NetworkManager桌面环境下反过来优先用 NetworkManager 管理不要把 Netplan 文件写成renderer: networkd后跑到桌面设置里去改 IP两边较劲的体验非常糟糕。5.3 虚拟机里用 Xshell 连 Ubuntu先把 SSH 服务装好很多人在 VMware 里装完 Ubuntu第一件事就是打开 Xshell 想连上去却发现连不上。最常见原因不是 IP 配错而是系统里根本没装 OpenSSH Server。Ubuntu 22.04 默认不会自动安装 SSH 服务端。解决办法sudo apt install openssh-server -y sudo systemctl enable --now ssh然后从 Ubuntu 里执行ip addr show拿到当前 IP用ssh 用户名IP测试通了再放到 Xshell 里保存会话。桥接模式下还要注意虚拟机和宿主机 IP 不能冲突。5.4 系统大版本升级后记得重新审视源配置Ubuntu 每两年出一个新版本codename 都会变化。如果你后续把系统从 22.04 升到 24.04原来的 jammy 源就不能再用了需要同步改成新版 codename。很多人在升级后遇到apt update报错就是因为/etc/apt/sources.list还停留在 old release 的标记上。所以换源这个操作不是配置一次就一劳永逸。最好的做法是升级前备份配置升级后主动检查一遍源文件里的版本代号再重新apt update。就我这几年的实际体验来说网络配好、源换顺手的 Ubuntu 22.04用起来是真的省心。上面这些命令和配置大部分我已经在不同机器上重复过很多次写出来也是想让你少走一点弯路。如果你照着操作后还有哪一步报错没解决优先从 DNS 和配置文件缩进这两个方向排查绝大多数问题都出在这两处。