注:本文使用的是RHEL9,会以RHEL9为示例
一、Linux中一些软件包的类型和软件包的名称结构
1、软件包的类型
(1)DEB包
定义与适用场景
格式:
.deb
适用系统:Debian、Ubuntu、Linux Mint 等 Debian 系发行版。
用途:预编译的二进制安装包,包含软件的可执行文件、配置和依赖信息。
包管理工具:
dpkg
:基础安装工具(dpkg -i package.deb
)。apt
/apt-get
:高级工具(自动解决依赖)。
核心特点
依赖管理:自动处理依赖关系(通过
apt
工具)。安装简便:一键安装,无需编译。
版本控制:官方仓库提供稳定版本,适合生产环境。
(2)RPM包
定义与适用场景
格式:
.rpm
适用系统:RHEL、CentOS、Fedora、openSUSE 等 Red Hat 系发行版。
用途:类似 DEB 包,提供预编译的二进制安装包。
包管理工具:
rpm
:基础安装工具(rpm -ivh package.rpm
)。yum
/dnf
:高级工具(自动解决依赖)。
核心特点
依赖管理:通过
yum
或dnf
自动解决依赖。企业级支持:RHEL/CentOS 长期支持(LTS)版本,稳定性高。
软件签名:支持 GPG 签名验证,增强安全性。
(3)源代码压缩包(.tar.bz2 / .tar.gz / .tar.xz)
定义与适用场景
格式:
.tar.bz2
(高压缩率)、.tar.gz
(通用)、.tar.xz
(极高压缩率)适用系统:所有 Linux 发行版。
用途:包含软件源代码,需手动编译安装。
核心特点
依赖管理:需要手动安装依赖库
灵活性:可自定义编译选项(如安装路径、启用功能模块)。
跨平台:适配不同架构和系统环境。
手动管理:需自行解决依赖关系和更新维护。
其中,源代码压缩包分为两种类型:
1. 需要编译的源代码包
特点
内容:包含软件的源代码文件(C/C++、Python 等)、构建脚本(如
Makefile
、configure
)。目的:允许用户自行编译软件,适配不同系统环境或自定义功能。
常见格式:
.tar.gz
、.tar.bz2
、.tar.xz
。
2. 绿色软件(预编译二进制包)
特点
内容:包含已编译好的可执行文件或脚本,无需编译。
目的:提供开箱即用的程序,简化安装步骤。
常见格式:
.tar.gz
、.tar.bz2
、.tar.xz
(名称可能含precompiled
、binary
等字样)。
2、软件包的名称结构
以RPM 包(RHEL/CentOS/Fedora 等)为例
命名结构: <软件名>-<版本号>-<发行号>.<发行版标识>.<架构>.rpm
各部分解析
字段 | 说明 | 示例 |
---|---|---|
软件名 | 软件名称(通常全小写,用连字符分隔) | httpd 、python3 |
版本号 | 软件的主版本号(可能含字母,如 beta ) |
2.4.6 、3.9.5 |
发行号 | 软件包的构建次数(由维护者递增) | 90 、1 |
发行版标识 | 标识适用的发行版(如 el7 =RHEL7,fc33 =Fedora 33) |
el7 、fc33 |
架构 | 支持的 CPU 架构(如 x86_64 、noarch 表示通用包) |
x86_64 、noarch |
软件类型后缀 | 不同类型的软件包的软件类型后缀不相同 | .deb 、.rpm |
实例解析: httpd-2.4.6-90.el7.centos.x86_64.rpm
软件名:
httpd
(Apache HTTP 服务器)版本号:
2.4.6
发行号:
90
(第 90 次构建)发行版标识:
el7.centos
(适用于 CentOS 7 或 RHEL 7)架构:
x86_64
(64 位 x86 架构)软件类型后缀:
.rpm
二、rpm命令详解
核心参数说明
涉及到列出、指定或者操作文件等需要查询文件的功能都需要复合参数 -q 使用。
参数 | 作用 | 常用组合示例 |
---|---|---|
-i |
安装软件包(Install) | rpm -ivh package.rpm |
-v |
显示详细输出(Verbose) | 通常与 -i 、-U 等组合使用 |
-h |
显示进度条(Hash marks) | 同上 |
-a |
所有/全部(All) | rpm -qa #查询所有已安装包 |
-f |
指定文件(File) | rpm -qf /usr/bin/python3 |
-p |
操作未安装的 RPM 文件(Package file) | rpm -qpl package.rpm |
-q |
查询(Query) | rpm -qi package-name |
-l |
列出文件列表(List) |
#查询httpd这个包在系统中安装的时候生成了什么文件 |
-e |
卸载(Erase) | rpm -e package-name |
-c |
列出配置文件(Config files) | rpm -qc nginx |
-d |
列出文档文件(Documentation) | rpm -qd httpd |
--info |
显示包的元信息(等同于 -qi ) |
rpm --info package-name |
--force |
强制操作(覆盖文件、忽略冲突) | rpm -ivh --force package.rpm |
--nodeps |
忽略依赖检查(可能导致系统不稳定) | rpm -ivh --nodeps package.rpm |
--scripts |
显示包安装/卸载时执行的脚本 |
示例的解析:可以显示未安装的RPM文件在安装时执行的脚本,这样我们就可以检查脚本是否有问题,防止出错。 |
-Kv |
验证包的签名和完整性(检查 GPG 和 MD5校验码) |
#看校验码是否OK,检查软件包是否被人篡改过,防止出问题。 |
-V |
检查已安装包的文件是否被修改(Verify) | rpm -V httpd |
参数组合示例
1. 安装
# 安装包(显示进度和详情)
rpm -ivh WeChatLinux_x86_64.rpm
# 强制安装(覆盖冲突文件)
rpm -ivh --force WeChatLinux_x86_64.rpm
# 忽略依赖安装(显示进度和详情)
rpm -ivh WeChatLinux_x86_64.rpm --nodeps
2. 查询信息
# 列出所有已安装的包
rpm -qa
# 查询某个包是否安装
rpm -qa | grep httpd
# 查看包的详细信息(已安装)
rpm -qi httpd
# 查看未安装包的元信息
rpm -qpi ./mysql.rpm
# 列出包安装的文件
rpm -ql nginx
# 查询文件所属包
rpm -qf /usr/sbin/nginx
3. 卸载
# 卸载包(保留配置文件)
rpm -e httpd
# 强制卸载(忽略依赖)
rpm -e --nodeps conflicting-package
4. 验证与安全
# 验证包的签名和完整性
rpm -Kv package.rpm
# 检查已安装包的文件是否被篡改
rpm -V httpd
5. 高级操作
# 查看包安装/卸载时执行的脚本
rpm -q --scripts docker-ce
# 列出包的配置文件
rpm -qc nginx
# 列出包的文档文件
rpm -qd python3
下图为忽略依赖安装RPM包的示例:
三、构建本地的软件仓库
做完上面四张图片的步骤,本地的软件仓库就算搭建好了。
然后就可以从软件仓库中安装软件了。示例如下图:
四、网络软件仓库的构建
发布资源的主机:
下图的挂载是临时的,若是关机重启了,挂载就会消失,除非在开机自运行脚本中编写自动挂载的命令。而若发布资源的主机的挂载消失了,那么测试主机会获取不到资源。
下图为在开机自运行脚本中编写自动挂载的命令。
测试主机:
然后测试主机就可以安装软件仓库里的软件包了,软件包就是从发布资源的主机里面来的,只要与发布资源的主机保持网络连接,就可以从发布资源的主机中获取软件包。
五、dnf命令的使用
dnf常用命令速查表
sudo 表示以超级用户(root)的身份执行命令,若本身就是root用户的话可以不用sudo。
功能分类 | 命令语法 | 说明 | 示例 |
---|---|---|---|
仓库管理 | |||
dnf repolist |
列出所有已启用的仓库 | 显示仓库 ID、名称和软件包数量 | dnf repolist |
dnf repolist all |
列出所有仓库(包括启用和禁用) | 查看完整的仓库状态 | dnf repolist all |
dnf clean all |
清除所有仓库缓存(路径:/var/cache/dnf ) |
清理下载的软件包和元数据,释放磁盘空间 | sudo dnf clean all |
dnf makecache |
主要功能是生成或更新软件包元数据缓存 | 执行 dnf makecache 命令需要网络连接,因为它需要从软件源服务器上下载元数据。如果网络不稳定或无法访问软件源服务器,可能会导致缓存更新失败。 |
sudo dnf makecache |
软件包管理 | |||
dnf list all |
列出所有软件包(已安装 + 未安装) | 显示仓库中所有可用软件包 | dnf list all |
dnf list available |
列出未安装的可用软件包 | 仅显示可安装但尚未安装的包 | dnf list available |
dnf list installed |
列出已安装的软件包 | 查看系统中已安装的包 | dnf list installed | grep nginx |
dnf install |
安装软件包 | 从仓库安装指定软件包 | sudo dnf install httpd |
dnf remove |
卸载软件包 | 移除已安装的软件包(保留配置文件) | sudo dnf remove mariadb |
dnf reinstall |
重新安装软件包 | 覆盖当前安装版本,修复损坏的文件 | sudo dnf reinstall python3 |
|
仅执行下载操作,而不进行安装 | 主要用途是仅下载指定软件包及其依赖项,而不进行安装操作,并将下载的软件包保存到指定的目录中。 | dnf install gcc --downloadonly --dest=/mnt |
查询与搜索 | |||
dnf search |
按关键字搜索软件包 | 匹配名称或描述的模糊搜索 | dnf search "web server" |
dnf whatprovides |
搜索包含指定文件/命令的软件包 | 查找提供某个文件或命令的包 | dnf whatprovides */nginx |
事务历史管理 | |||
dnf history |
查看 DNF 操作历史 | 列出所有安装、更新、卸载操作的事务记录 | sudo dnf history |
dnf history info |
查看指定事务的详细信息 | 显示某次操作涉及的软件包和依赖 | sudo dnf history info 5 |
软件组管理 | |||
dnf group list |
列出所有软件组 | 显示所有可用软件组(默认包含已安装和未安装) | dnf group list |
dnf group list --installed |
列出已安装的软件组 | 仅显示当前已安装的软件组 | dnf group list --installed |
dnf group list --available |
列出未安装的可用软件组 | 显示可安装但未安装的软件组 | dnf group list --available |
dnf group list --hidden |
列出隐藏的软件组 | 显示标记为隐藏的软件组(通常为特殊用途) | dnf group list --hidden |
dnf group install |
安装软件组 | 批量安装一组相关软件包 | sudo dnf group install "Development Tools" |
dnf group info |
查看软件组详细信息 | 显示软件组包含的必需包和可选包 | dnf group info "Web Server" |
六、epel源的构建
然后我们就可以使用epel源来下载我们需要的软件了。
下图含义:列出未安装的可用软件包 ansible,我们可以看到ansible.noarch这个软件包可以从epel源下载安装。
七、第三方软件仓库的搭建
发布资源的主机:从 epel源 中将 ansible软件包和依赖关系 仅下载 到 新建的httpd服务的默认共享目录的子目录/var/www/html/ansible中。
测试主机:
下图:列出未安装的可用软件包时出错了,所以进行原因分析 --- 根据错误提示发现,很有可能是 ansible软件仓库中的 /repodata/repomd.xml 文件消失了。
发布资源的主机:
先安装软件 createrepo
然后根据指定目录生成元数据文件
测试主机:
然后第三方软件仓库中的的软件就可以下载安装了
补充:
若是 发布资源的主机 往ansible软件仓库中 新增加了一些软件,但是因为这时ansible软件仓库的repodata目录和里面的文件没有进行更新,所以测试主机是看不到这些新增加的软件的。
只有 发布资源的主机 使用 createrepo 重新生成repodata目录和其中的文件来进行信息更新,然后 测试主机 要使用 dnf clean all 清除仓库缓存,重新读取ansible软件仓库的信息后,测试主机才能看到ansible软件仓库中新增加的软件。