案例(以pam包为例)
制作patch(1~5)
--1 准备需要的rpm源码包,最终会获得一个src.rpm包
yumdownload --source pam
或者 wget http://xxxx.xxxx.com/pam-1.1.5-0.17.2.src.rpm
--2 解压,并把已经有的补丁打到源码中(可见,rpm包的构成就是 基线代码+针对基线代码各版本的patch)
rpm -ivh pam-1.1.5-0.17.2.src.rpm (生成~/rpmbuild目录)
rpmbuild -bp ~/rpmbuild/SPECS/anaconda.spec (在rpmbuild中生成BUILD BUILDROOT RPMS SOURCES SPECS SRPMS)
--3 备份BUILD中的源码
cp -R ~/rpmbuild/Linux-PAM-1.1.5 ~/rpmbuild/Linux-PAM-1.1.5.bak
--4 在~/rpmbuild/Linux-PAM-1.1.5中进行想做的修改
--5 制作patch
diff -Nur ~/rpmbuild/BUILD/Linux-PAM-1.1.5.bak ~/rpmbuild/BUILD/Linux-PAM-1.1.5 > new.patch
把patch打入生成新的rpm包(6~7)
--6 重构项目
mv new.patch ~/rpmbuild/SOURCES
vim ~/rpmbuild/SPECS/pam.spec 【修改版本号,patch信息,changelog等】
rpmbuild -ba ~/rpmbuild/SPECS/pam.spec (把当前的所有patch打到基线上)
--7 获取所有输出
重构后,会生成如下rpm包(这里把新版本定为0.17.99)
/var/tmp/build-root/standard-x86_64/usr/src/packages/SRPMS/pam-1.1.5-0.17.99.src.rpm
/var/tmp/build-root/standard-x86_64/usr/src/packages/RPMS/x86_64/pam-devel-1.1.5-0.17.99.x86_64.rpm
/var/tmp/build-root/standard-x86_64/usr/src/packages/RPMS/x86_64/pam-doc-1.1.5-0.17.99.x86_64.rpm
/var/tmp/build-root/standard-x86_64/usr/src/packages/RPMS/x86_64/pam-1.1.5-0.17.99.x86_64.rpm
使用新的rpm包(8)
--8 更新pam(更新动作不要解析依赖关系,所以只要基线版本OK,即使目标环境上什么都没有,也能更新!)
rpm -Uvh pam-1.1.5-0.17.99.x86_64.rpm
rpm的使用
1)yum search xxx
使用此命令罗列成出来的所有软件中,后缀表示适用于不同的架构。
而其中以noarch结尾的表示,软件和架构无关,一般情况下,这样的包都是“脚本”。
2)xxx.rpm --- 编译好的软件包
xxx.src.rpm --- 未编译的软件包(源码包)
3)xxx-1.1.1-n.i386.rpm
软件名-版本号-第n此对外发布.架构.rpm包类型
4) rpm的优点:
1)rpm包里面有编译好的程序和配置文件,不需要重新编译;
2)rpm包解压的时候会检查系统硬盘容量、操作系统版本等,确保可用性;
3)rpm包里面有相关文档
5)rpm包中有记录依赖关系的文件,包在解压的时候会去验证以来关系,并在本机上查找相应的依赖是否安装,如果没有则报错!等待解决依赖关系
(这就是rpm让人诟病的“软件的属性依赖”)
6)如何解决rpm的属性依赖问题 -----> yum
为了方便软件的重复利用,很多软件都是以动态库的方式对外提供,比如pam
这也是为什么很多时候能看到xxx.rpm和xxx-devel.rpm两个包,带devel的是给开发者使用的,里面有“静态库”或者“动态库”
同属于某个软件,rpm是可直接使用的编译好的软件,devel.rpm是开发使用的相关库
7)yum的工作流程
yum会先下载目标rpm包;然后解析rpm包中的依赖关系文件,再把依赖关系发送到yum源(服务器)上;服务器端会根据依赖关系文件下发所有相关的
依赖包;最后把所有的依赖rpm包按照顺序安装好。
8)/var/lib/rpm:rpm的数据库就在这个目录下
1)软件升级时,各个版本之间的比较,在这里找;
2)系统已经安装了哪些软件,在这里找;
3)软件的数字签名,也在这里找;
其实就相当于rpm的私有数据库
9)rpm下载软件的相关内容都放在什么地方:
/etc : 配置文件存放的地方
/usr/bin : 可执行文件
/usr/lib : 动态库
/usr/share/doc : 基本的软件使用手册和说明文件
/usr/share/man : man page文件
(注:可见,rpm是按照linux的套路来分配一个软件的相关文件的)
10)rpm的基本命令
11) rpm的其他命令(放在最后)
12)从光盘安装某个软件的流程
挂载光盘,使用: mount /dev/cdrom /media
找出档案的实际路径:find /media -name 'pam-devel*'
测试此软件是否具有相依性: rpm -ivh pam-devel... --test
直接安装: rpm -ivh pam-devel...
卸除光盘: umount /dev/cdrom
13)使用rpm更新软件(而不是yum,一般还是使用yum)
-Uvh 如果未安装,则安装,并更新;如果已安装,则更新
-Fvh 如果未安装,不安装,
一般是先下载最新版本的rpm包,然后使用上面的命令执行最新版本的包
14)数字签名
[root@www ~]# rpm -Va
[root@www ~]# rpm -V 已安装的软件名称
[root@www ~]# rpm -Vp 某个 RPM 档案的档名
[root@www ~]# rpm -Vf 在系统上面的某个档案
选项不参数:
-V :后面加的是软件名称,若该软件所吨的档案被更劢过,才会列出来;
-Va :列出目前系统上面所有可能被更劢过的档案;
-Vp :后面加的是文件名,列出该软件内可能被更劢过的档案;
-Vf :列出某个档案是否被更劢过~
范例一:列出你的 Linux 内的 logrotate 这个软件是否被更劢过?
[root@www ~]# rpm -V logrotate
# 如果没有出现仸何讯息,恭喜你,该软件所提供的档案没有被更劢过。
# 如果有出现仸何讯息,才是有出现状况啊!
范例二:查询一下,你的 /etc/crontab 是否有被更劢过?
[root@www ~]# rpm -Vf /etc/crontab
S.5....T c /etc/crontab
# 瞧!因为有被更劢过,所以会列出被更劢过的信息类型!
15) 使用rpm卸载软件
rpm -e
如果要卸载的软件被其他软件使用,那么会报错,当然,可以使用--nodeps来强制卸载,但是别的软件可能就用不了了
使用rpm更新数据库
rpm --rebuilddb
rpmbuild(使用 软件源码构建rpm包)
1) rpm命令处理rpm包,rpmbuild处理srpm包
2) rpmbuild --rebuild xxx.src.rpm ---------- 把src.rpm整体编译并打包成rpm包,不安装!
rpmbuild --recomplie xxx.src.rpm ---------- 把src.rpm整体编译并打包成rpm包,并且安装!
yumdownloader下载之后
#rm -rf /root/rpmbuild
#rpm -i ***.src.rpm
#cd /root/rpmbuild
#rpmbuild -bp SPECS/**.spec
修改部分rpm包,并重新发布iso
1)下载目的ISO,装机
2)找到对应的rpm包
3)修改
3.1 解压
rpm -ivh config-os-cloudedge-1.0-2.src.rpm
3.2 修改
(可选)查询filename属于哪个rpm包:rpm -qf filename
(可选)安装所有依赖:yum-builddep -y config-os-cloudedge.spec
(可选)展开源码:rpmbuild -bp config-os-cloudedge-1.0-2.src.rpm
(可选)vim /SPEC/
3.3 制作新rpm包
rpmbuild -ba config-os-cloudedge.spec
新的包出现在RPMS目录中,这里为config-os-cloudedge-1.0-2.h1.x86_64.rpm
4) 安装新的rpm包
4.1 送到自验机器
scp config-os-cloudedge-1.0-2.src.rpm 自验IP:/自验目录
4.2 安装rpm包
rpm -Uvh config-os-cloudedge-1.0-2.src.rpm
=============================问题==============================
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
不用管,只是缺少了相关的组,不影响使用,代码已经安装完成了