Skip to content

软件安装

Linux 上部署软件的方式主要有三种:通过系统包管理器安装、从源码编译、直接解压二进制包。选择哪种取决于对版本控制、依赖管理和回滚能力的需求。

一、包格式和包管理器

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

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

高层工具(yum/dnf/apt)在底层工具(rpm/dpkg)之上增加了自动处理依赖、连接远程仓库的能力。日常装软件优先用 yum/dnf/apt,它们会自动解决依赖关系。

查看已安装的包:

bash
rpm -qa | grep nginx            # RHEL 系
dpkg -l | grep nginx            # Debian 系

查看某个文件属于哪个包:

bash
rpm -qf /usr/sbin/nginx         # RHEL 系
dpkg -S /usr/sbin/nginx         # Debian 系

在服务器上看到一个陌生命令或配置文件,查它属于哪个包比靠路径猜可靠得多。

二、yum 和 dnf

RHEL 8+ 用 dnf 替代了 yum,命令基本兼容。

bash
yum install nginx -y
yum remove nginx -y
yum update nginx -y
yum list installed
yum info nginx

查看和更新仓库信息:

bash
yum repolist              # 列出已启用的仓库
yum makecache             # 更新仓库元数据缓存

只下载包但不安装(适合离线环境):

bash
yum install --downloadonly --downloaddir=/tmp/pkgs nginx

内网环境无法直连外网仓库时,--downloadonly 比手动到处找 rpm 链接省事很多。

三、apt

bash
apt update                 # 更新包列表(类似 yum makecache)
apt install nginx -y
apt remove nginx -y        # 卸载包但保留配置
apt purge nginx -y         # 卸载包同时删除配置
apt list --installed
apt show nginx

removepurge 的区别:remove 删程序不删配置,下次安装时之前的配置能继续用;purge 把配置也清掉。

只下载包:

bash
apt download nginx

四、rpm 和 dpkg

在需要安装本地包或无法连接仓库时用到:

bash
rpm -ivh package.rpm       # 安装本地 rpm(不自动解决依赖)
rpm -Uvh package.rpm       # 升级
rpm -ql nginx              # 列出包安装的所有文件
rpm -qi nginx              # 查看包的详细信息
bash
dpkg -i package.deb        # 安装本地 deb(可能提示依赖缺失)
apt -f install             # 修复依赖问题(dpkg -i 之后经常需要)

五、仓库配置

RHEL 系的仓库配置目录:

bash
ls /etc/yum.repos.d/

Debian/Ubuntu:

bash
cat /etc/apt/sources.list
ls /etc/apt/sources.list.d/

修改仓库配置前备份原文件:

bash
cp /etc/yum.repos.d/CentOS-Base.repo{,.bak}
cp /etc/apt/sources.list{,.bak}

多个第三方仓库同时启用时,可能出现同一个包有多个版本来源的情况。排查版本冲突时先确认包实际来自哪个 repo:

bash
yum info package-name             # RHEL 系
apt-cache policy package-name     # Debian 系

六、源码编译

某些场景下需要特定编译选项,或者仓库中根本没有对应版本的包,这时才用源码编译。

典型流程:

bash
tar xf app.tar.gz
cd app
./configure --prefix=/usr/local/app   # 检查依赖,生成 Makefile
make                                   # 编译
make install                           # 安装到 --prefix 指定的目录

编译前需要安装开发工具链:

bash
yum groupinstall "Development Tools" -y    # RHEL 系
apt install build-essential -y             # Debian 系

源码编译的主要缺点:包管理器不知道它的存在,卸载和升级需要自己管理、依赖版本冲突时无法被自动检测。安装路径集中放在 /usr/local/软件名-版本 并用软链接管理版本,日后维护会方便一些。

七、二进制包部署

很多现代服务(Go、Rust 写的工具、各种云原生组件)以预编译的二进制压缩包形式发布。部署方式是直接解压:

bash
tar xf app-1.2.3-linux-amd64.tar.gz -C /opt/
ln -sfn /opt/app-1.2.3 /opt/app

这种部署方式之下,目录规划通常遵循一定惯例:

路径内容
/opt/app-版本各版本的程序文件
/opt/app软链接指向当前使用的版本
/etc/app配置文件(从 /opt/app/conf 软链接过来或直接放这)
/var/log/app日志文件
/var/lib/app持久化数据

回滚只需要把软链接指回旧版本目录,效率很高。缺点是 systemd unit、日志轮转、用户创建、升级流程都需要自己写,不像包管理器那样集成好。

八、安装后确认

安装完成不等于服务可用。至少确认几点:

bash
which nginx                      # 确认命令在 PATH 中
nginx -v                         # 确认版本
systemctl status nginx           # 确认服务状态

机器上如果装过多个版本(比如同时有包管理器装的 nginx 和二进制部署的 nginx),which 查出来的路径可能和预期不同。