Appearance
09|软件安装:三种方式
Linux 上装软件不像 Windows 那样下载个 exe 双击安装。Linux 有三种主流方式:包管理器、源码编译、二进制包部署。选错方式会埋下后续维护负担——用源码编译装完后依赖混乱、升级时不知道哪些文件要替换;用二进制包部署但忘写 systemd unit,重启后服务起不来。
本篇讲三种方式各自怎么用、什么时候选哪种。装不上或装坏了怎么排查,是下一篇的内容。
一、三种方式怎么选
| 方式 | 解决的问题 | 适用场景 |
|---|---|---|
| 包管理器(yum/dnf/apt) | 自动处理依赖、安全更新、统一卸载 | 系统组件、常用服务 |
| 源码编译 | 仓库里没有所需版本、需要自定义编译选项 | 特殊需求(如自定义 Nginx 模块) |
| 二进制包 | 快速部署、版本切换灵活 | 云原生工具、Go/Rust 编写的服务 |
绝大多数情况用包管理器就够。源码编译和二进制包是特殊场景的补充。
二、包格式与包管理器
两大发行版系列的包格式和工具不同:
| 系列 | 包格式 | 底层工具 | 高层工具 |
|---|---|---|---|
| RHEL 系(RHEL/CentOS/Rocky/AlmaLinux) | rpm | rpm | yum(RHEL 7)/ dnf(RHEL 8+) |
| Debian 系(Debian/Ubuntu) | deb | dpkg | apt |
高层工具(yum/dnf/apt)建立在底层工具(rpm/dpkg)之上,多出两项核心能力:自动处理依赖关系、连接远程仓库下载。日常安装软件优先用高层工具——它们会自动把依赖一并装上,底层工具(如 rpm -i)不会自动解析依赖,遇到依赖缺失直接报错。
查看已安装的包
bash
# RHEL 系
rpm -qa | grep nginx
rpm -q nginx # 精确查询单个包
# Debian 系
dpkg -l | grep nginx
dpkg -l nginx查文件归属:文件来自哪个包
服务器上发现一个陌生命令或配置文件,可以反向查它属于哪个包:
bash
# RHEL 系
rpm -qf /usr/sbin/nginx
# nginx-1.20.1-14.el9.x86_64
# Debian 系
dpkg -S /usr/sbin/nginx
# nginx-core: /usr/sbin/nginx判断"某个文件能不能卸载""某个命令属于哪个软件"时,这比靠路径猜可靠得多。
查包安装了哪些文件
反向操作——某个包都装了哪些文件:
bash
rpm -ql nginx # RHEL 系,列出所有文件
rpm -qc nginx # 只列出配置文件
dpkg -L nginx # Debian 系三、yum 与 dnf
RHEL 系用 yum(RHEL 7)或 dnf(RHEL 8+),命令几乎一样。
基本操作
bash
yum install nginx -y # 安装
yum update nginx # 升级单个包
yum update # 升级所有可升级的包
yum remove nginx # 卸载
yum list nginx # 查看仓库中可用的版本
yum info nginx # 查看包详细信息查找命令属于哪个包
想用某个命令但不知道装哪个包:
bash
yum provides *bin/htpasswd
# 输出:httpd-tools-2.4.x.x86_64 : ...provides 能按文件路径或命令名反查包,比记包名省事。
四、apt
Debian 系用 apt。
bash
apt update # 更新仓库索引(不是升级软件)
apt install nginx -y # 安装
apt upgrade nginx # 升级单个包
apt upgrade # 升级所有可升级的包
apt remove nginx # 卸载(保留配置文件)
apt purge nginx # 卸载并删除配置文件
apt list --installed # 列出已安装的包
apt show nginx # 查看包详细信息apt update 和 apt upgrade 容易混:update 只更新仓库索引(告诉系统有哪些包可装可升),upgrade 才是真正升级软件。装软件前通常先 apt update 刷新索引,否则可能装到旧版本或找不到包。
remove 和 purge 的区别
apt remove nginx 卸载程序但保留 /etc/nginx/ 下的配置文件。apt purge nginx 连配置文件一起删。想干净卸载用 purge,想重装但保留配置用 remove。
五、底层工具:rpm 与 dpkg
日常装软件用高层工具,底层工具(rpm/dpkg)主要用来查询。
bash
# 查询包是否安装、版本
rpm -q nginx
dpkg -l nginx
# 查询文件归属
rpm -qf /usr/sbin/nginx
dpkg -S /usr/sbin/nginx
# 查询包安装了哪些文件
rpm -ql nginx
dpkg -L nginx底层工具也能直接装本地包文件(rpm -ivh xxx.rpm、dpkg -i xxx.deb),但不会自动处理依赖——遇到依赖缺失会报错让你自己装。所以装远程仓库的软件用高层工具,只有手头有个本地 .rpm/.deb 文件时才用底层工具直接装。
六、仓库配置
高层工具从仓库下载软件。仓库是软件的源,默认配的是官方仓库,也可以加第三方仓库(如 EPEL)。
RHEL 系仓库配置
仓库配置文件在 /etc/yum.repos.d/ 下,每个 .repo 文件一个仓库:
ini
# /etc/yum.repos.d/epel.repo
[epel]
name=EPEL
baseurl=https://mirrors.aliyun.com/epel/9/Everything/x86_64/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-9国内服务器通常把 baseurl 换成阿里云、清华等国内镜像,下载速度快很多。
bash
yum repolist # 查看当前启用的仓库
yum-config-manager --enable epel # 启用某仓库
yum-config-manager --disable epel # 禁用某仓库Debian 系仓库配置
仓库配置在 /etc/apt/sources.list 和 /etc/apt/sources.list.d/ 下:
text
# /etc/apt/sources.list
deb https://mirrors.aliyun.com/ubuntu jammy main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu jammy-updates main restricted universe multiverse改完仓库配置后:
bash
apt update # 刷新索引七、源码编译
绝大多数情况下用包管理器就够。需要源码编译的场景仅限:仓库里没有目标版本(业务要求 Nginx 1.25 的新模块,但仓库只有 1.20),或需要自定义编译选项。
不要为了"装最新版本"就动辄源码编译——后续的升级、依赖管理、安全补丁全部要手工维护。
典型流程
bash
# 第 1 步:解压源码
tar xf nginx-1.25.3.tar.gz
cd nginx-1.25.3
# 第 2 步:检查依赖、生成 Makefile
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module
# 第 3 步:编译
make -j$(nproc) # -j 并行编译,加快速度
# 第 4 步:安装到 --prefix 指定的目录
make install编译前的工具链
源码编译要装编译工具链和开发库:
bash
# RHEL 系
yum groupinstall "Development Tools" -y
yum install pcre-devel zlib-devel openssl-devel -y
# Debian 系
apt install build-essential -y
apt install libpcre3-dev zlib1g-dev libssl-dev -y这里有个认知要建立:运行时库和开发库是分开的两个包。生产机器通常只装运行时库(pcre),编译需要额外的开发库(pcre-devel,带头文件 .h)。开发库的命名规律:RHEL 系加 -devel 后缀,Debian 系加 -dev 后缀。编译报错缺某个库时,要装的是对应的 -devel/-dev 包,不是运行时库。
源码编译的进阶问题(编译失败排查、动态库依赖地狱、ABI 不兼容)在下一篇故障与进阶里讲。
八、二进制包部署
很多云原生工具(Prometheus、node_exporter、Grafana)官方直接提供编译好的二进制包,下载解压就能用,不用包管理器也不用源码编译。这种方式适合 Go/Rust 编写的单文件服务。
典型流程
bash
# 第 1 步:下载并校验
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
# 第 2 步:校验完整性
sha256sum node_exporter-1.7.0.linux-amd64.tar.gz
# 跟项目 release 页面给的值对比
# 第 3 步:解压
tar xf node_exporter-1.7.0.linux-amd64.tar.gz -C /opt/
# 第 4 步:创建软链接指向当前版本
ln -s /opt/node_exporter-1.7.0.linux-amd64 /opt/node_exporter
# 第 5 步:创建专用用户
useradd -r -s /sbin/nologin nodeuser
# 第 6 步:写 systemd unit
cat > /etc/systemd/system/node_exporter.service <<'EOF'
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=nodeuser
ExecStart=/opt/node_exporter/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
# 第 7 步:启用并启动
systemctl daemon-reload
systemctl enable --now node_exporter软链接 /opt/node_exporter 指向当前版本,升级时换链接指向新版本目录就行,不用改 unit 文件里的路径。
校验为什么重要
下载的二进制包可能被篡改或下载不完整。sha256sum 算出的哈希值要和官方 release 页面给的值对比,一致才算完整。这步不偷懒——运行被篡改的二进制等于执行别人的恶意代码。
九、安装后的标准确认
装完软件,别急着用,先确认装对了:
bash
# 1. 确认命令在 PATH 中能被找到
which nginx
# /usr/sbin/nginx
# 2. 确认版本符合预期
nginx -v
# nginx version: nginx/1.20.1
# 3. 确认服务能正常启动
systemctl start nginx
systemctl status nginx
# 4. 确认监听端口正常
ss -lntp | grep nginx这四步走完,软件才算真正装好可用。
学会了基础之后
到这里,三种安装方式都会了:包管理器装系统组件、源码编译装特殊版本、二进制包部署云原生工具。
但实际装软件时会遇到各种问题:yum 报锁、依赖冲突、编译失败、装完跑不起来。这些故障的排查在下一篇讲。