案例(以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的基本命令

      -i    --      (install)安装rpm包
-v -- (verbose)安装细节
-h -- 方便可视化
-qa -- 列出已安装的所有软件
-qf filename -- 查看某个文件由那个软件产生(一般用来操作配置文件,以确定配置文件属于那个软件包)
-q xxx -- 查看是否安装了xxx
-ql xxx -- 查看xxx软件文件的目录(比如执行程序在哪,配置文件在哪,说明书在哪)
-qc xxx -- xxx软件的所有配置文件列表
-qd xxx -- xxx软件的说明书列表
-qR xxx -- xxx软件依赖的文件在哪

安装本地包: rpm -ivh xxx.rpm
安装多个包: rpm -ivh xxx.rpm yyy.rpm *.rpm
安装网络上的包: rpm -ivh http://xxx.com/dir/xxx.rpm

11) rpm的其他命令(放在最后)

--nodeps        依赖关系解决不了,但还是一定要安装(可能会出现依赖包缺失,软件用不起来)

--replacefiles 强制替换现有的软件残留文件,比如已经卸载xxx软件了,但是卸载时候还有一些残留的配置
文件,此时安装就会提示“由于某个软件已经在本机上存在,所以安装失败”,这个时候就可以
直接替换掉(替换动作不可逆)

--replacepkgs 强制安装软件,比如某个软件已经安装了,这时候可以直接替换掉原有的软件

--force --replacefiles + --replacepkgs , 简单粗暴,强制安装

--test 测试是否能够安装,如果不可,罗列原因(只测试,不安装)

--justdb 更新软件在数据库中的数据

--nosignature 跳过数字签名检查

--prefix <dir> 重定向软件安装目录,比如默认是以根目录作为软件的安装根目录,这里可以重定向/home目
录作为软件安装的根目录,伴随效应就是会在/home目录下单独创建一套目录

--noscripts 不执行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

不用管,只是缺少了相关的组,不影响使用,代码已经安装完成了