Linux软件安装与管理¶
概述¶
软件安装与管理是 Linux 系统管理的核心任务。本文从源码编译、RPM、YUM/DNF 到 apt/pkg 等多种安装方式,全面介绍了 Linux 软件包管理的知识体系,并以 CentOS 为例演示了实际的安装操作。
软件为什么需要安装¶
Windows软件安装流程¶
当我们双击Windows安装程序时,背后发生了以下步骤:
- 安装检查:检查系统版本、硬件配置、磁盘空间是否满足要求
- 释放文件:将程序文件解压到目标目录(如
C:\Program Files\) - 复制可执行文件:将主程序和相关组件放到对应位置
- DLL动态链接库/安装服务:注册系统运行所需的库文件,可能注册为Windows服务
- 注册表:向Windows注册表写入配置信息、文件关联、启动项等
- 开始菜单和快捷方式:创建用户访问入口
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(源码)、rpm、yum、dnf |
| Debian派系 | Debian、Ubuntu、Kali、Deepin | deb、apt、dpkg |
| FreeBSD系 | FreeBSD | make、pkg、ports |
专业解读:选择哪种安装方式,首先取决于你使用的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最大的问题是依赖地狱(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 包名 |
专业解读:
apt是apt-get的简化版,交互更友好。dpkg是Debian系的基础包管理工具,类似于rpm,直接操作.deb包文件。
FreeBSD系:pkg / ports¶
| 操作 | 命令 |
|---|---|
| 搜索 | pkg search 包名 |
| 安装 | pkg install 包名 |
| 升级 | pkg upgrade 包名 |
| 卸载 | pkg delete 包名 |
CentOS安装软件案例¶
CentOS启用中文输入法¶
- 安装中文输入法框架(如ibus-libpinyin)
- 在系统设置中启用输入法
- 使用
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提供的软件版本切换工具。
查看已注册的版本:
添加新版本:
参数解析: -/usr/bin/java:注册地址(软链接)
- java:服务名
- /usr/local/jdk-11.0.2/bin/java:实际程序路径
- 3:优先级(数字越大优先级越高)
切换版本:
专业解读:
update-alternatives的原理是在/usr/bin/下创建软链接,指向实际安装的版本。切换版本时,只是修改软链接的指向,不需要重新安装软件。
安全测试视角:供应链安全 软件安装过程中的供应链攻击是近年来日益严重的威胁: - 依赖混淆:攻击者上传与内部私有包同名的恶意包到公共仓库,当企业内部构建系统自动拉取时,优先拉取版本号更高的恶意包 - 仓库篡改:如果 yum/apt 源被中间人攻击或恶意篡改,安装的软件包可能包含后门 - 签名验证:使用
rpm -K或gpg --verify验证软件包签名,确保软件来源可信安全测试视角:SUDO 与包管理器滥用 如果用户被允许以 sudo 执行包管理命令,可能被利用提权: -
sudo yum install可以被利用安装恶意 RPM 包 -sudo apt install同样可以用于安装后门程序 - 更隐蔽的:sudo dnf remove可以卸载关键安全组件 在配置 sudo 权限时,应避免授予普通用户无限制的包管理权限。