什么是 RPM
RPM 全称为:Red-Hat Package Manager,即红帽 Linux 发行版的软件包管理器。RPM 的出现,提升了 Linux 软件安装、升级的便捷性。RPM 遵循 GPL 协议,除了红帽 Linux 发行版,Caldera OpenLinux、SUSE 以及 Turbo Linux 等 Linux 的发行版也使用 RPM,因此 RPM 是 Linux 软件包管理的行业标准。为了使读者能够较为深入理解 RPM,我们先介绍软件的构建方法。
计算机软件的软件是从源代码构建出来的。源代码是人们以人类可读的语言书写的、让计算机执行任务的指令。人类可读的语言格式和规范,就是编程语言。
从源代码制作软件的过程,称之为是软件编译。从源代码构建成软件的编译有两种方式:
- 本机编译 (Natively Compiled),对应编译型语言。
- 解释编译(Interpreted Compiled),对应解释性语言。
本机编译方式下,代码可以独立编译成机器代码或直接编译为二进制文件可执行文件。本机编译构建的软件包中,包含编译环境下计算机体系架构的特征。例如,使用 64 位(x86_64)AMD 计算机中编译的软件,不能在 Intel 处理器架构上运行。
与本机编译可以独立执行相对应,某些编程语言不能将软件编译成计算机可以直接理解的格式,而需要语言解释器或语言虚拟机(如 JVM),我们称之为解释编译。常用的解释语言有 Byte Compiled(源代码需要编译成字节代码,然后由语言虚拟机执行,如 Python)和 Raw Interpreted(原始解释语言完全不需要编译,它们由解释器直接执行,如 Bash shell)两种。
我们常用的 bash shell 和 Python 是解释型的,这种方式编译出的程序与硬件架构无关,通过这种方式编译出的 RPM 会被标注为 noarch(说明 RPM 包不依赖于特定 linux 发行版)。
在介绍了源代码的编译方式后,接下来我们通过实验的方式展现软件的编译过程。
从源代码构建软件
在正式开始验证之前,我们需要在 Linux 中安装编译工具。
# yum install gcc rpm-build rpm-devel rpmlint make python bash coreutils diffutils
接下来,我们分别介绍本机编译和解释编译。
本机编译代码
在编程语言中,C 语言是本机编译。我们查看一个源代码文件,如清单 1 所示:
清单 1. C 语言源码文件
# cat cello.c#include int main(void) { printf("Hello World, I'm DavidWei!"); return 0;}
调用 C 编译器 gcc 进行编译:
# gcc -o cello cello.c
编译成功后,我们可以执行结果输出。
# ./cello
Hello World, I'm DavidWei!
为了实现自动化构建代码,我们添加 Makefile,这是大型软件开发中常用的方法。
首先创建一个 Makefile,如清单 2 所示:
清单 2. Makefile 文件
# cat Makefilecello: gcc -o cello cello.cclean: rm cello
接下来,通过 make 来完成编译。
执行 make 会自动编译源代码,然后可以成功执行,如下图 1 所示:
图 1. 编译并运行代码
![b7a6ce32dbd946c229091ad31f863198.png](https://i-blog.csdnimg.cn/blog_migrate/a587b667888f69ad25162afb1d357895.jpeg)
执行 make clean 会删除编译结果,如下图 2 所示:图 2. 删除编译结果
![f47f22426781aa653a53b064e3ac3189.png](https://i-blog.csdnimg.cn/blog_migrate/593dea779e2e0f1649def94c542deea6.jpeg)
在介绍了本机编译后,我们介绍解释编译。
解释型代码
对于用解释型编程语言编写的软件,如果是 Byte Compiled 语言如 Python,就需要一个编译步骤,把源代码构建成 Python 的语言解释器(称为 CPython)的可以执行文件。
我们查看一个 python 的源代码,如清单 3 所示:
清单 3. Python 源代码文件
# cat pello.py#!/usr/bin/env pythonprint("Hello World, I'm DavidWei!")
对源代码进行编译:
# python -m compileall pello.py
Compiling pello.py ...
编译成功后运行:
# python pello.pyc
Hello World, I'm DavidWei!
我们看到,对源.py 文件进行字节编译后会生成一个.pyc 文件,这是 python 2.7 字节编译的文件类型,这个文件可以使用 python 语言虚拟机运行。
查看文件类型:
# file pello.pyc
pello.pyc: python 2.7 byte-compiled
和 python 相对应,无需编译的解释性代码是 Raw Interpreted,如我们日常使用的 bash shell。
我们看一个 shell 文件,如清单 4 所示:
清单 4. Shell 文件
# cat bello#!/bin/bashprintf "Hello World, I'm DavidWei!"
对于 Raw Interpreted 源码,我们使文件可执行、然后直接运行即可,如下图 3 所示:
图 3. 修改权限运行 shell
![d12525fdc4b7ea6e2c27f9c4e8b1368e.png](https://i-blog.csdnimg.cn/blog_migrate/7737f4794a5236b5dbe33ec9a2de0419.jpeg)
在介绍了如何从源码构建软件包后,接下来我们介绍如何给软件打补丁。
给软件打补丁
在计算机软件中,补丁是用来修复代码中的漏洞的。软件中的补丁表示的是与源代码之间的不同之处。接下来,我们从原始源代码创建补丁,然后应用补丁。
创建补丁的第一步是备份原始源代码,通常是将它拷贝为.orig 文件。我们以 cell