Skip to content

09|软件安装:三种方式

Linux 上装软件不像 Windows 那样下载个 exe 双击安装。Linux 有三种主流方式:包管理器、源码编译、二进制包部署。选错方式会埋下后续维护负担——用源码编译装完后依赖混乱、升级时不知道哪些文件要替换;用二进制包部署但忘写 systemd unit,重启后服务起不来。

本篇讲三种方式各自怎么用、什么时候选哪种。装不上或装坏了怎么排查,是下一篇的内容。

一、三种方式怎么选

方式解决的问题适用场景
包管理器(yum/dnf/apt)自动处理依赖、安全更新、统一卸载系统组件、常用服务
源码编译仓库里没有所需版本、需要自定义编译选项特殊需求(如自定义 Nginx 模块)
二进制包快速部署、版本切换灵活云原生工具、Go/Rust 编写的服务

绝大多数情况用包管理器就够。源码编译和二进制包是特殊场景的补充。

二、包格式与包管理器

两大发行版系列的包格式和工具不同:

系列包格式底层工具高层工具
RHEL 系(RHEL/CentOS/Rocky/AlmaLinux)rpmrpmyum(RHEL 7)/ dnf(RHEL 8+)
Debian 系(Debian/Ubuntu)debdpkgapt

高层工具(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 updateapt 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.rpmdpkg -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 报锁、依赖冲突、编译失败、装完跑不起来。这些故障的排查在下一篇讲。