为什么要制作rpm包?
1. 并不是所有的软件都提供rpm包
2. 个性化定制
我们制作rpm包需要有一个源码包, 一个spec文件, 以及rpmbuild工具.
还需要一个build rpm tree的目录: ~/rpmbuild/{SOURCES,RPMS,SRPMS,SPECS,BUILD}
我们可以使用rpmdevtools包提供的rpmdev-setuptree命令来得到, 也可以手动创建
1. spec文件
提供给rpmbuild工具的响应文件
它有自己的标准格式, 其中包括有:
软件信息
安装与卸载前后需要执行的脚本
解包, 打补丁, 编译, 打包 等等
2. 源码包
提供源码文件, 及补丁
rhel6中, 可以安装rpm开发工具, 方便我们制作.
yum install rpmdevtools rpm-build
spec文件结构:
Name 包名, 引用: %{name}
Summary 包概要
Version 版本如2.6.32, %{version}
Release 发布序列号, 如-131 %{release}
Group 软件分组
License 软件许可
URL 软件主页
Source0 源码包, 可写多个, Source1, Source2... %{ }
BuildRoot 编译时使用的"虚拟目录", 可以理解成chroot目录
%{_tmppath}/%{name}-%{version}-%{release}-root
$RPM_BUILD_ROOT 引用
BuildRequires 编译时依赖包
Requires 依赖包, 可以用>=, <=; 如: libpng >= 1.2.40,libpng-devel
Vendor 软件包发行商或组织, 如 uplooking Ltd
Distribution 发行标识
Patch 补丁源码%{patch1},%patch2
Prefix: %{_prefix} 安装rpm包时可以指定路径, 但在后面%install中需要使用它
Prefix: %{_sysconfdir} 配置文件路径
Build Arch 编译的目标处理器架构,noarch标识不指定,但通常都是以/usr/lib/rpm/marcros中的内容为默认值
Provides 包的功能
Packager 打包者
%description 包的说明
%prep 预处理脚本
%setup -n %{name}-%{version} 解包
通常是从~/rpmbuild/SOURCES里的包解压到~/BUILD/%{name}-%{version}
%patch 打补丁
PS:
%setup 只解包
%setup -q 宏,解包,进入源码包目录等几个动作,(Maximum RPM)
%setup -n dir 解包到dir目录
%setup -c 解包前先产生目录
%setup -b num 将第num个source文件解压缩
%setup -T 不使用default的解压缩操作
%setup -T -b 0 将第0个源代码文件解压缩
%setup -c -n dir 指定目录名称dir
%patch 最简单的补丁方式,自动指定patch level
%patch 0 使用第0个补丁文件
%patch -s 不显示打补丁时的信息。
%patch -T 将所有打补丁时产生的输出文件删除。
%build 编译,构建包. 执行目录为:~/rpmbuild/BUILD/%{name}-%{version}
%configure 也可以不使用macros,用 ./configure --prefix=%{_prefix}
make %{?_smp_mflags} 编译参数,macros
%install 安装到虚拟目录中, 为后面的%files做准备
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT
%clean 清理临时文件
rm -rf $RPM_BUILD_ROOT
%files 定义rpm包需要的文件
都是相对路径, 用宏或变量
%deattr(-,root,root) (mode,owner,group)
%exclude 不想打包的文件
%changelog
注:
rpmbuild只认tar.gz格式, 并放入SOURCES目录中
rpm包分组: /usr/share/doc/rpm-4.8.0/GROUPS
宏: /usr/lib/rpm/macros
不生成debuginfo包: echo '%debug_package %{nil}' >> ~/.rpmmacros
Maximum RPM
http://www.rpm.org/max-rpm/index.html
大全
** 给RPM包签名:
我们自己制作的rpm包, 为了防止被篡改, 一般要使用私钥进行签名, 然后把公钥提供给使用者来进行验证, 从而确保文件的原始性, 避免安全隐患. 就如同redhat提供的软件包一样.
1. 生成密钥对
gpg --gen-key
图形界面下运行需要安装yum install pinentry-gui
相关文件生成在~/.gnupg/
查看公钥:
gpg --list-keys
2. rpm软件包签名
修改rpm宏, 让其使用我们的密钥对:
echo '%_signture gpg' >> ~/.rpmmacros
echo '%_gpg_name XXXXX (XXXX)' >> ~/.rpmmacros
其中XXXXX为gpg --list-keys命令中查看到的名字.
3. 对已有的rpm包签名
rpm --addsign nginx-1.0.5-1.i686.rpm
如果出现错误, 请查看XXXXX (XXXX)与gpg --list-keys命令结果中是否一致
(括号前的空格, 直接复制吧)
4. 使用rpmbuild打包时签名
rpmbuild --sign -bb nginx.spec
** 验证rpm包
1. 导出公钥到一个文件
gpg --export -a 'XXXX (XXX)' > /etc/pki/rpm-gpg/RPM-GPG-KEY-XXX
2. 查看rpm数据库中已有的公钥
rpm -q gpg-pubkey-*
3. 将公钥导入rpm数据库
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-XXX
再次查看已有公钥, 最后一个就是我们刚导入的.
4. 查看一个rpm包能否通过验证
rpm -K nginx-1.0.5-1.i686.rpm
如果最后显示的是OK, 那就OK, 如果显示的是'MISSING KEYS...'那就说明我们导入公钥有问题
5. 在yum中验证签名
确保公钥在/etc/pki/rpm-gpg/目录下.
在yum的repo配置文件里相应的源中加入:
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-XXX
之后使用那个源时yum会要求导入gpgkey.
转载于:https://my.oschina.net/u/3251865/blog/848844