HDP3.1.5源码编译打rpm包全流程讲解1:编译源码
nohup mvn package -DskipTests assembly:single validate -Denforcer.skip=true >../mvnLog 2>&1&
编译成功后,在habse-assembly⽬录下有⼀个包
其余的组件也得编译。
源码中有assembly模块的基本编译完在此⽬录下都会⽣成⼀个包
再拿Phoenix来举个例⼦
源码⽬录如下
编译
mvn clean package -DskipTests
编译后如下,也有个
HDP3.1.5各组件编译出的包我们先留着,⼀会要⽤
2:获取旧版本源⽂件⽬录
这⾥拿了个HDP3.1.0版本来举例⼦
如下是 HDP3.1.0下hbase_3_1_0_0_78-2.0.2.3.1.0.0-78版本的rpm包列表,可以看到,除过第⼀个最⼤的rpm包,还有另外的六个⽐较⼩的rpm包
所谓源⽂件⽬录就是从rpm包获取到的⼀个⽬录,就是上图所指的usr*⼀系列⽬录。我们需要利⽤这些⽬录为下⼀步中制作新版本
3.1.5RPM打包⽬录做准备
怎么获得这些⽬录呢?
这⾥有两个命令需要记⼀下
2.1:rpm包获取对应的源⽂件⽬录
源⽂件⽬录:其实就是之前HDP3.1.0这种旧版本rpm打包前的⽂件⽬录
rpm2cpio hbase_3_1_0_0_78-2.0.2.3.1.arch.rpm | cpio -div
这样⼦就会获得⼀个usr⽬录,就像上图中usr1⽬录⼀样。
其余的usr_*⽬录是我将剩余的rpm包获得的usr⽬录改名字以便区分
2.2:rpm包获取对应的.spec⽂件
.spec⽂件:这个spec⽂件是指的之前HDP3.1.0这种旧版本rpm打包前参考的脚本,⾥⾯包含很多宏定义以及步骤化的指令,当然也可以包含linux⽂件操作命令,后续会详解
rpmrebuild -e -p --spec-only=hbase_3_1_0_0_78-master-2.0.2.3.1.0.0-78.spec hbase_3_1_0_0_78-master-2.0.2.3.1.arch.rpm
执⾏完上述命令后会进⼊⼀个vim编辑器,我们:wq保存当前⽬录即可
就会⽣成hbase_3_1_0_0_78-master-2.0.2.3.1.0.0-78.spec⽂件了
有了这两个东西,怎么⽤的,这⾥给⼤家先提下
usr⽬录⽤来⽤作对⽐,然后将之前编译好的源码解压,构建⼀个相同⽂件⽬录的usr⽬录,最终进⾏3.1.5的rpm制作
spec⽂件⽤作改写,来⽣成我们HDP3.1.5独有的spec⽂件 ,最终进⾏3.1.5的rpm制作
顺便提⼀下,上⾯rpm2cpio与rpmrebuild命令如果command not found的话,就需要你安装了
3:创建RPM打包⽬录
这个⽬录我选择⼿动创建(⽹上说可以使⽤⼯具⾃动⽣成,懒得整,⾃⼰make就⾏)
在⽤户家⽬录创建rpmbuild⽬录,在该⽬录下⽣成如下6个⽬录
⽬录名说明
BUILD编译rpm包的临时⽬录
BUILDROOT编译后⽣成的软件临时安装⽬录
RPMS最终⽣成的可安装rpm包的所在⽬录
SOURCES所有源代码和补丁⽂件的存放⽬录
SPECS存放SPEC⽂件的⽬录(重要)
SRPMS软件最终的rpm源码格式存放路径
⽬录名说明
4:rpm打包流程概述
这⾥说明下哈,上述⽬录树是常规打rpm包的⽬录,⼤概流程如下
4.1:常规打rpm包流程
将源码塞进SOURCES⽬录下
直接编写SPEC⽂件
然后直接开始打rpm包(rpmbuild命令)
他会按照spec⽂件的脚本内容先将源码解压到BUILD⽬录中
然后再BUILD⽬录下进⾏编译
之后将编译完需要的⽂件copy到BUILDROOT⽬录下并制作rpm包
最后将BUILDROOT⽬录下内容⾃动清除
4.2:改进⽅式
但是3.1这⾥有问题
⼀是⾃动编译HDP3.1.5的过程不可控,⼆是SPEC⽂件编写困难
所以本⽂采⽤⼀种捷径⽅式
梳理⽼版本rpm抽取出的usr源⽂件⽬录;
将源码编译完后的⽬录进⾏改造,构建⼀个新版本的源⽂件⽬录并放置在BUILD⽬录下;
对照⽼版本的SPEC⽂件,进⾏新版本SPEC⽂件的改写
执⾏改写的spec⽂件(rpmbuild),在RPMS中获得对应架构的rpm包
5:⾃定义BUILD⽬录
这⾥就是像上⾯流程中所说的那样,对照⽼版本rpm抽取出的usr源⽂件⽬录对源码编译完成后的⽬录(第1⼤步的解压后的⽂件)进⾏改造。
怎么改造呢,下⾯拿hbase来举个例⼦
如下图,HDP3.1.0版本中的hbase是2.0.2版本,rpm包有7个,⼀个最⼤的主rpm包,剩余为7个⽐较⼩的rpm包
我们在2.1步骤中已经使⽤rpm2cpio命令获得了他们对应的usr⽬录,这⾥将usr⽬录进⾏了重命名⽅便区别,如下图
5.1:梳理HDP3.1.0rpm包的源⽂件⽬录
我们尝试⽤tree命令看下最⼤的那个rpm包⽣成的usr1⽬录
usr1/
└── hdp
└──3.1.0.0-78
├── etc
│├── default
││└── hbase
│├── hbase
││└── conf.dist
││├── hadoop-metrics2-hbase.properties
││├── d
││├── hbase-env.sh
││├── l
││├── l
││├── log4j.properties
││└── regionservers
│└── security
│└── limits.d
│└── f
└── hbase
├── bin
│├── considerAsDead.sh
│├── draining_servers.rb
│├── get-active-master.rb
│├── hbase
│├── hbase-cleanup.sh
│├── d
│├── hbase-common.sh
│├── d
│├── hbase-config.sh
│├── hbase-daemon.sh
│├── hbase.distro
│├── hbase-jruby
│├── hirb.rb
│├── region_mover.rb
│├── region_status.rb
│├── replication
││└── copy_tables_desc.rb
│├── shutdown_regionserver.rb
│├── d
│├── d
│└──test
│└── process_based_cluster.sh
├── conf -> /etc/hbase/conf
├── doc
│├──
│├──
│└──
├── etc
│└── rc.d
│└── init.d
│└──其余rpm包的源⽂件安装
├── hbase-webapps
│├── master
││├── index.html
││└── WEB-INF
││└── l
│├── regionserver
││├── index.html
源代码电影讲解
││└── WEB-INF
││└── l
│├── rest
││├── index.html
││└── WEB-INF
││└── l
│├── static
││├── css
│││├── bootstrap.css
│││├── bootstrap.min.css
│││├── bootstrap-theme.css
│││├── bootstrap-theme.min.css
│││└── hbase.css
││├── fonts
│││├── │││├── glyphicons-halflings-regular.svg │││├── f
│││└── glyphicons-halflings-regular.woff ││├── hbase_logo_med.gif
││├── hbase_logo.png
││├── hbase_logo_small.png
││├── js
│││├── bootstrap.js
│││├── bootstrap.min.js
│││├── jquery.min.js
│││└── tab.js
││└── jumping-orca_rotated_12percent.png │└── thrift
│├── index.html
│└── WEB-INF
│└── l
├── include
│└── thrift
│├── hbase1.thrift
│└── hbase2.thrift
├── lib
│├── animal-sniffer-annotations-1.17.jar
│├── XXX.jar
│├── ruby