跳转至

Linux软件安装与管理

概述

软件安装与管理是 Linux 系统管理的核心任务。本文从源码编译、RPM、YUM/DNF 到 apt/pkg 等多种安装方式,全面介绍了 Linux 软件包管理的知识体系,并以 CentOS 为例演示了实际的安装操作。

软件为什么需要安装

Windows软件安装流程

当我们双击Windows安装程序时,背后发生了以下步骤:

  1. 安装检查:检查系统版本、硬件配置、磁盘空间是否满足要求
  2. 释放文件:将程序文件解压到目标目录(如 C:\Program Files\
  3. 复制可执行文件:将主程序和相关组件放到对应位置
  4. DLL动态链接库/安装服务:注册系统运行所需的库文件,可能注册为Windows服务
  5. 注册表:向Windows注册表写入配置信息、文件关联、启动项等
  6. 开始菜单和快捷方式:创建用户访问入口

Linux可执行程序的位置

Linux中没有注册表的概念,可执行程序通常放在以下标准目录中:

目录 存放内容 使用用户
/bin 基本用户命令(单用户模式下也可用) 所有用户
/sbin 系统管理命令 root管理员
/usr/bin 普通应用程序 所有用户
/usr/sbin 非关键系统管理命令 root管理员

专业解读:Linux的可执行文件不需要特定扩展名(不像Windows的.exe),而是通过文件权限中的x(执行权限)来标识。判断一个文件是否可执行,用 ls -l 看权限位,或用 file 命令查看文件类型。


脚本和程序的区别

解释型 vs 编译型

类型 代表语言 执行方式 特点
解释型 JavaScript、Python、Ruby、Shell 边解释边执行,由解释器逐行翻译 开发快、跨平台、运行相对慢
编译型 C、C++、Swift、Kotlin、Go、Rust 先编译成机器码,再直接执行 运行快、效率高、需针对平台编译

专业解读:Java比较特殊,属于"半编译半解释":先编译成字节码(.class文件),再由JVM(Java虚拟机)解释执行。因此Java程序"一次编译,到处运行"(Write Once, Run Anywhere)。


Linux安装软件的几种方式

Linux主要派系与安装方式

派系 代表发行版 主要安装方式
Redhat红帽派系 Redhat、CentOS、Fedora、Rocky Linux make(源码)、rpmyumdnf
Debian派系 Debian、Ubuntu、Kali、Deepin debaptdpkg
FreeBSD系 FreeBSD makepkgports

专业解读:选择哪种安装方式,首先取决于你使用的Linux发行版。CentOS属于Redhat系,因此主要使用yum/rpm。

源码安装

特点:从软件的源代码开始,通过编译生成可执行文件。

通用步骤

# 下载源码包
wget https://example.com/software-1.0.tar.gz

# 解压
tar -zxvf software-1.0.tar.gz
cd software-1.0

# 配置(检查依赖、生成Makefile)
./configure --prefix=/usr/local/software

# 编译
make

# 安装
make install

优点:可定制编译选项、可优化性能、可修改源码 缺点:步骤繁琐、依赖关系复杂、卸载困难

专业解读--prefix 指定安装路径,强烈建议自定义路径(如 /usr/local/软件名),方便后续管理和卸载。源码安装的软件通常不在PATH中,需要手动创建软链接或修改环境变量。

rpm 安装

全称:RedHat Package Manager(红帽包管理器)

RPM是Redhat系发行版的基础包格式,文件扩展名为 .rpm

操作 命令 说明
查询所有已安装包 rpm -qa q=query, a=all
查询指定包 rpm -q 包名 rpm -q nginx
安装 rpm -ivh 包名.rpm i=install, v=verbose, h=hash(显示进度条)
升级 rpm -Uvh 包名.rpm U=Upgrade(若未安装则安装,已安装则升级)
卸载 rpm -e 包名 e=erase,不需要带.rpm后缀
# 示例
rpm -ivh nginx-1.20.1-1.el7.ngx.x86_64.rpm
rpm -e nginx                    # 卸载nginx

专业解读:rpm最大的问题是依赖地狱(Dependency Hell):安装A包需要B包,B包又需要C包……手动解决依赖非常痛苦。因此诞生了yum/dnf等高级包管理器。

yum 安装

全称:Yellow dog Updater, Modified

yum是rpm的前端工具,自动解决依赖关系,从配置的软件源(repository)中下载并安装软件及其所有依赖。

操作 命令
列出所有可安装/已安装的包 yum list
列出指定包 yum list 包名
搜索包 yum search 包名
安装 yum install 包名
升级指定包 yum update 包名
卸载 yum remove 包名yum erase 包名
更新所有软件 yum update
清除缓存 yum clean all
更新yum缓存 yum makecache

yum常用选项

选项 含义
-h 显示帮助信息
-y 对所有提问自动回答"yes"(非交互模式,脚本中常用)
-c 指定配置文件
-q 安静模式,减少输出
-v 详细模式
# 示例
yum install nginx              # 安装nginx(自动解决依赖)
yum install -y nginx           # 自动确认,无需手动输入y
yum remove nginx               # 卸载nginx(同时移除不再被依赖的包)
yum clean all && yum makecache # 清除并重建缓存

专业解读:yum源配置文件在 /etc/yum.repos.d/ 目录下,每个 .repo 文件定义一个软件源。建议将默认源替换为国内镜像(阿里云、清华、163),大幅提升下载速度。

DNF 与 YUM 的区别

DNF(Dandified YUM)是yum的下一代替代品,在Fedora、RHEL 8、CentOS 8及更高版本中成为默认包管理器。

区别项 DNF YUM
解析依赖 使用Libsolv库,更快更可靠 使用公开API,速度较慢
API 完整API文档,易于扩展 文档不完善,扩展困难
开发语言 C、C++、Python 纯Python
内存占用 占用内存少 占用较多内存
更新策略 包中包含不相关的依赖则不更新 可能在没有验证的情况下更新
内核保护 不提供保护,可删除内核包 不允许删除运行中的内核
使用范围 Fedora、RHEL 8+、CentOS 8+ RHEL/CentOS 6/7

专业解读:DNF的语法与YUM几乎完全兼容,CentOS 7用户熟悉yum后,迁移到DNF几乎没有学习成本。

Debian系:apt / dpkg

虽然CentOS属于Redhat系,但在实际工作中可能会遇到Debian/Ubuntu系统,了解其包管理也很重要。

操作 命令
搜索 apt search 包名
安装 apt install 包名
升级 apt update && apt upgrade
卸载 apt remove 包名

专业解读aptapt-get 的简化版,交互更友好。dpkg 是Debian系的基础包管理工具,类似于rpm,直接操作 .deb 包文件。

FreeBSD系:pkg / ports

操作 命令
搜索 pkg search 包名
安装 pkg install 包名
升级 pkg upgrade 包名
卸载 pkg delete 包名

CentOS安装软件案例

CentOS启用中文输入法

  1. 安装中文输入法框架(如ibus-libpinyin)
  2. 在系统设置中启用输入法
  3. 使用 Super(Win键)+ Space 切换输入法

CentOS yum安装MySQL

# 下载MySQL官方yum源
wget https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm

# 安装yum源
rpm -ivh mysql80-community-release-el7-11.noarch.rpm

# 安装MySQL服务器
yum install -y mysql-community-server

# 启动MySQL
systemctl start mysqld

# 查看初始密码
grep 'temporary password' /var/log/mysqld.log

Linux软件版本管理

在服务器上,有时需要安装多个版本的同一软件(如Java 8和Java 11),此时需要版本管理工具。

update-alternatives

CentOS提供的软件版本切换工具。

查看已注册的版本

update-alternatives --display java

添加新版本

update-alternatives --install /usr/bin/java java /usr/local/jdk-11.0.2/bin/java 3
参数解析: - /usr/bin/java:注册地址(软链接) - java:服务名 - /usr/local/jdk-11.0.2/bin/java:实际程序路径 - 3:优先级(数字越大优先级越高)

切换版本

update-alternatives --config java
# 然后输入对应的数字选择要使用的版本

专业解读update-alternatives 的原理是在 /usr/bin/ 下创建软链接,指向实际安装的版本。切换版本时,只是修改软链接的指向,不需要重新安装软件。


安全测试视角:供应链安全 软件安装过程中的供应链攻击是近年来日益严重的威胁: - 依赖混淆:攻击者上传与内部私有包同名的恶意包到公共仓库,当企业内部构建系统自动拉取时,优先拉取版本号更高的恶意包 - 仓库篡改:如果 yum/apt 源被中间人攻击或恶意篡改,安装的软件包可能包含后门 - 签名验证:使用 rpm -Kgpg --verify 验证软件包签名,确保软件来源可信

# 验证 RPM 包签名
rpm -K nginx-1.20.1-1.el7.ngx.x86_64.rpm

# 查看已安装包的文件变更(检查是否被篡改)
rpm -Va

安全测试视角:SUDO 与包管理器滥用 如果用户被允许以 sudo 执行包管理命令,可能被利用提权: - sudo yum install 可以被利用安装恶意 RPM 包 - sudo apt install 同样可以用于安装后门程序 - 更隐蔽的:sudo dnf remove 可以卸载关键安全组件 在配置 sudo 权限时,应避免授予普通用户无限制的包管理权限。