构建rpm包

为什么要制作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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值