Linux: 包管理——apt / dpkg / snap 与软件安装
在 Linux 上安装软件不需要去官网下载 exe——通过包管理器一行命令就能完成。不同的发行版使用不同的包管理器,但核心概念都一样。
📋 前置知识:需要先掌握以下内容
- 第17课:进程管理
1. 你将学到
- apt 更新/安装/卸载/搜索
- dpkg 本地 deb 安装
- 添加 PPA 第三方源
- snap/flatpak 容器包
- pip/npm/cargo 语言级包管理
2. 一个安装 Nginx 的故事
(1) 痛点:Windows 上装个软件要搜官网、下载、双击、点下一步
小明需要在 Ubuntu 上安装 Nginx。他习惯性打开浏览器搜索 "nginx download"。
(2) apt 一行搞定
Bob 说:"在 Ubuntu 上装 Nginx 只需要一行命令。"
sudo apt update
sudo apt install nginx -y
30 秒后 Nginx 就装好了——自动处理依赖、自动创建服务文件、自动设置开机启动。
(3) 收益:包管理器改变了安装方式
小明发现 apt 不仅安装软件,还自动处理了所有依赖关系。他再也没有手动下载 exe 或 dmg 了。
3. 知识点讲解
(1) apt——Debian/Ubuntu 的包管理
# 更新软件源列表
sudo apt update
# 升级所有已安装的软件
sudo apt upgrade -y
> 💡 **提示**:`apt update && apt upgrade -y` 是系统维护的黄金组合——`update` 刷新软件源列表,`upgrade` 升级已安装的软件。建议在安装新软件前先 `update`,否则可能找不到最新版本的包。
# 安装软件
sudo apt install nginx -y
sudo apt install curl wget git vim -y # 一次装多个
# 卸载软件
sudo apt remove nginx # 保留配置文件
sudo apt purge nginx # 删除配置文件
# 搜索软件
apt search "web server"
apt show nginx # 查看软件包信息
# 清理
sudo apt autoremove # 删除不再需要的依赖
sudo apt autoclean # 清理下载的缓存
(2) dpkg——本地 deb 包安装
# 安装本地 .deb 文件
sudo dpkg -i package.deb
# 如果依赖缺失,用 apt 修复
sudo apt install -f
# 查看已安装
dpkg -l | grep nginx
dpkg -L nginx # 查看包安装的文件路径
# 卸载
sudo dpkg -r package_name # 卸载
sudo dpkg -P package_name # 完全清除(含配置文件)
(3) 软件源和 PPA
# 软件源列表
cat /etc/apt/sources.list
# 添加 PPA(Personal Package Archive)
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.12
# Ubuntu 软件源的优先顺序
# 1. /etc/apt/sources.list
# 2. /etc/apt/sources.list.d/*.list
(4) snap/flatpak——容器化包
# snap(Ubuntu 内置)
snap find "code" # 搜索
sudo snap install code --classic # 安装 VS Code
sudo snap install lxd # 安装 LXD
sudo snap refresh # 更新所有 snap
sudo snap remove code # 卸载
# snap 的特点:自动更新、沙箱隔离、跨发行版
ℹ️ 说明:apt、snap、flatpak 是三种不同的包管理方案——apt 安装系统原生包(性能最好、最轻量),snap/flatpak 是容器化包(隔离性好、自动更新,但启动稍慢、占用空间更大)。日常使用优先 apt,需要跨发行版或沙箱隔离时选 snap/flatpak。
(5) 语言级包管理器
# Python
pip install requests # 安装 Python 包
pip install -r requirements.txt # 从文件安装
pip list # 列出已安装包
pip uninstall requests # 卸载
pip freeze > requirements.txt # 导出依赖
# Node.js
npm install express # 安装包
npm install -g typescript # 全局安装
npm list # 列出已安装包
npx create-react-app my-app # 不安装直接运行
# Rust
cargo install ripgrep # 安装工具
cargo add serde # 添加依赖到项目
▶ 示例:apt 基本操作
# 1. 更新软件源
sudo apt update
# 2. 安装常用开发工具
sudo apt install -y build-essential curl wget git vim htop
# 3. 搜索一个包
apt search "text editor" | grep -i "vim\|nano"
# 4. 查看包信息
apt show htop
# 5. 卸载
sudo apt remove htop
sudo apt autoremove # 清理无用的依赖
输出:
TEXT 📖 仅展示Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease Get:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB] Fetched 119 kB in 1s Reading package lists... Done Reading package lists... Done Building dependency tree... Done The following NEW packages will be installed: build-essential curl wget git vim htop 0 upgraded, 6 newly installed, 0 to remove Need to get 12.3 MB of archives. Setting up build-essential (12.9ubuntu3) ... Setting up curl (7.81.0-1) ... vim - Vi IMproved - enhanced vi editor htop - interactive processes viewer Package: htop Version: 3.0.5-7build2 Priority: optional Section: utils Reading package lists... Done Building dependency tree... Done The following packages will be REMOVED: htop 0 upgraded, 0 newly installed, 1 to remove Reading package lists... Done Building dependency tree... Done The following packages will be REMOVED: libhwloc5 0 upgraded, 0 newly installed, 1 to remove
▶ 示例:dpkg 安装本地包
# 下载 VS Code 的 .deb 包
wget https://code.visualstudio.com/sha/download?build=stable&os=linux-deb-x64 -O code.deb
# 安装
sudo dpkg -i code.deb
# 如果提示依赖问题,修复
sudo apt install -f
# 查看 VS Code 安装的文件
dpkg -L code | head -20
输出:
TEXT 📖 仅展示--2026-07-07 10:23:01-- https://code.visualstudio.com/sha/download?build=stable&os=linux-deb-x64 Resolving code.visualstudio.com... 20.190.159.4 HTTP request sent, awaiting response... 302 Found Length: 95000000 (90M) [application/octet-stream] Saving to: 'code.deb' code.deb 100%[==========>] 90.51M 5.2MB/s in 18s Selecting previously unselected package code. Setting up code (1.89.1-1716721786) ... /usr/share/code/code /usr/share/code/resources/app/package.json /usr/share/code/resources/app/product.json /usr/bin/code /usr/share/applications/code.desktop /usr/share/icons/hicolor/512x512/apps/code.png
▶ 示例:添加 PPA 安装新版 Python
# Ubuntu 22.04 默认 Python 3.10,要装 Python 3.12 需要 PPA
sudo add-apt-repository ppa:deadsnakes/ppa -y
sudo apt update
sudo apt install -y python3.12 python3.12-venv python3.12-distutils
# 验证
python3.12 --version
输出:
TEXT 📖 仅展示Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease Hit:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease Get:3 http://ppa.launchpadcontent.net/deadsnakes/ppa/ubuntu jammy InRelease [23.8 kB] Fetched 23.8 kB in 1s Reading package lists... Done The following NEW packages will be installed: python3.12 python3.12-venv python3.12-distutils Setting up python3.12 (3.12.4-1+jammy1) ... Python 3.12.4
▶ 示例:pip 管理 Python 包
# 安装 Flask Web 框架
pip install flask
# 创建依赖清单
pip freeze > requirements.txt
# 在另一台机器上安装同样的依赖
pip install -r requirements.txt
# 安装到用户目录(不需要 sudo)
pip install --user black
输出:
TEXT 📖 仅展示Collecting flask Downloading flask-3.0.3-py3-none-any.whl (101 kB) Installing collected packages: flask Successfully installed flask-3.0.3 flask==3.0.3 werkzeug==3.0.3 jinja2==3.1.4 Collecting black Downloading black-24.4.2-py3-none-manylinux1_x86_64.whl (2.2 MB) Installing collected packages: black Successfully installed black-24.4.2
▶ 示例:查找已安装包的路径
# 查看 nginx 安装在了哪些目录
dpkg -L nginx | head -10
# 查看 nginx 的配置文件
dpkg -L nginx | grep -E "\.conf$"
# 查看某个命令属于哪个包
dpkg -S /usr/bin/htop
# htop: /usr/bin/htop
# 反向——查看某个文件属于哪个包
dpkg -S /etc/nginx/nginx.conf
# nginx: /etc/nginx/nginx.conf
输出:
TEXT 📖 仅展示/etc/nginx/nginx.conf /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default /usr/sbin/nginx /var/www/html/index.html /etc/nginx/nginx.conf /etc/nginx/sites-available/default htop: /usr/bin/htop nginx: /etc/nginx/nginx.conf
▶ 综合示例:从零搭建 Web 开发环境
#!/bin/bash
# setup-web-env.sh - 从零搭建 Web 开发环境
set -e
echo "=== 搭建 Web 开发环境 ==="
# 1. 更新系统
echo ">>> 更新软件源..."
sudo apt update
sudo apt upgrade -y
# 2. 安装基础工具
echo ">>> 安装基础工具..."
sudo apt install -y build-essential curl wget git vim htop net-tools
# 3. 安装 Nginx
echo ">>> 安装 Nginx..."
sudo apt install -y nginx
sudo systemctl enable nginx
sudo systemctl start nginx
# 4. 安装 Node.js
echo ">>> 安装 Node.js 20..."
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
> ⚠️ **注意**:`curl | bash` 模式(从网络下载脚本直接执行)存在供应链攻击风险——如果服务器被入侵或 DNS 被劫持,可能执行恶意代码。在生产服务器上,建议先下载脚本、审查内容后再执行,或优先使用发行版官方仓库。
# 5. 安装 Python 3 + pip
echo ">>> 安装 Python 3..."
sudo apt install -y python3 python3-pip python3-venv
# 6. 安装 Docker
echo ">>> 安装 Docker..."
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
# 7. 验证
echo ""
echo "=== 环境验证 ==="
echo "Nginx: $(nginx -v 2>&1)"
echo "Node.js: $(node --version)"
echo "npm: $(npm --version)"
echo "Python: $(python3 --version)"
echo "Git: $(git --version)"
echo "Docker: $(docker --version)"
echo ""
echo "✅ 环境搭建完成!部分更改(如 Docker)需要重新登录生效。"
❓ 常见问题
Q:
apt update和apt upgrade有什么区别? A: \1
Q:
apt remove和apt purge有什么区别? A: \1
Q: 怎么查看一个包安装了哪些文件? A:
dpkg -L package_name列出包安装的所有文件。dpkg -S /path/to/file反向查找某个文件属于哪个包。
Q: PPA 安全吗? A: PPA 是第三方维护的源,安全级别低于官方源。建议只添加知名项目的官方 PPA(如 deadsnakes、nginx、git-core)。非知名 PPA 有安全风险。
Q: 依赖冲突怎么办? A: 先用
sudo apt install -f修复。不行就检查 PPA 冲突(禁用冲突的 PPA)。极端情况下,手动下载.deb包用dpkg -i安装。
📖 小节
- Debian/Ubuntu:
apt install/remove/purge/update/upgrade - 本地包:
dpkg -i安装.deb、apt install -f修复依赖 - 第三方源:
add-apt-repository ppa:xxx/yyy - 语言级包:
pip installPython、npm installNode.js apt autoremove清理无用的依赖
📝 作业
- 基础题(难度⭐):用 apt 安装 htop 和 tree 命令,验证安装成功,然后用
dpkg -L查看 htop 安装了哪些文件 - 进阶题(难度⭐⭐):用
apt search "database"搜索并安装一个数据库(如 PostgreSQL 或 SQLite),然后用 pip 安装一个 Python 包(如requests或flask) - 挑战题(难度⭐⭐⭐):写一个一键环境搭建脚本,安装 git/vim/htop/nginx/nodejs/python3,每个安装步骤检查是否已安装以避免重复,最后输出所有工具的版本验证报告