使用rpm-build制作nginx的rpm包
阿新 • • 發佈:2019-03-18
pcr ipv4 cto nts 生成密鑰 files sco 導入 -m 2014-11-27 11:05:49
一、RPM包的分類
RPM有五種基本的操作功能:安裝、卸載、升級、查詢和驗證。
linux軟件包分為兩大類:
(1)二進制類包,包括rpm安裝包(一般分為i386和x86等幾種)
(2)源碼類包,源碼包和開發包應該歸位此類(.src.rpm)。
有時候為了方便源碼包的安裝,和我們自己訂制軟件包的需求,我們會把一些源碼包按照我們的需求來做成rpm包,當有了源碼包就可以直接編譯得到二進制安裝包和其他任意包。spec file是制作rpm包最核心的部分,rpm包的制作就是根據spec file來實現的。在制作自定義rpm包的時候最好不要使用管理員進行,因為管理員權限過大,如果一個命令寫錯了,結果可能是災難性的,而制件一個rpm包普通用戶完全可以實現
二、修改宏及自定義車間位置
在redhat下,rpm包的默認制作路徑在/usr/src/redhat下,這其中包含了6個目錄(要求全部大寫)
Directory Usage BUILD 源代碼解壓以後放的位置,只需提供BUILD目錄,具體裏面放什麽,不用我們管,所以真正的制作車間是BUILD目錄 RPMS 制作完成後的rpm包存放目錄,為特定平臺指定子目錄(i386,i686,ppc) SOURCES 收集的源文件,源材料,補丁文件等存放位置 SPECS 存放spec文件,作為制作rpm包的領崗文件,以 rpm名.spec SRPMS src格式的rpm包位置 ,既然是src格式的包,就沒有平臺的概念了 BuiltRoot 假根,使用install臨時安裝到這個目錄,把這個目錄當作根來用的,所以在這個目錄下的目錄文件,才是真正的目錄文件。當打包完成後,在清理階段,這個目錄將被刪除
但centos並沒有該目錄,因此,我們不得不自定義工作車間,即使在redhat下有該目錄,一般也是自定義到普通用戶的家目錄下的
rpmbuild --showrc 顯示所有的宏,以下劃線開頭,一個下劃線:定義環境的使用情況,二個下劃線:通常定義的是命令,為什麽要定義宏,因為不同的系統,命令的存放位置可能不同,所以通過宏的定義找到命令的真正存放位置
查看默認工作車間,所以只要改變了這個宏,我們就可以自定義工作車間了
[root@localhost /]# rpmbuild --showrc | grep topdir
-14: _builddir %{_topdir}/BUILD
-14: _buildrootdir %{_topdir}/BUILDROOT
-14: _desktopdir %{_datadir}/applications
-14: _rpmdir %{_topdir}/RPMS
-14: _sourcedir %{_topdir}/SOURCES
-14: _specdir %{_topdir}/SPECS
-14: _srcrpmdir %{_topdir}/SRPMS
-14: _topdir %{getenv:HOME}/rpmbuild
三、rpm包制作原理圖
四、制作rpm包
1、安裝rpm-build
# yum -y install rpm-build
2、增加普通用戶並修改工作車間目錄
# useradd hero
# su - hero
$ vim ~/.rpmmacros
%_topdir /home/hero/rpmbuild
# mkdir -pv ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
# rpmbuild --showrc | grep _topdir #會發現,工作車間已然改變:_topdir /home/hero/rpmbuild
3、收集源碼文件
(1)文件列表
[root@localhost SOURCES]# pwd
/home/hero/rpmbuild/SOURCES
[root@localhost SOURCES]# ls
fastcgi_params init.nginx nginx-1.7.7.tar.gz nginx.conf
(2)nginx-1.7.7.tar.gz 源碼包
$ cp /opt/src/nginx-1.7.7.tar.gz /home/hero/rpmbuild/SOURCES/
(3)init.nginx 腳本文件
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse # proxy and IMAP/POP3 proxy server
# processname: nginx
## config: /etc/nginx/nginx.conf
# config: /usr/local/nginx/conf/nginx.conf
# config: /etc/sysconfig/nginx
## pidfile: /var/run/nginx/nginx.pid
# pidfile: /usr/local/nginx/logs/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
#NGINX_CONF_FILE="/etc/nginx/nginx.conf"
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`nginx -V 2>&1 | grep "configure arguments:" | sed ‘s/[^*]*--user=\([^ ]*\).*/\1/g‘ -`
options=`$nginx -V 2>&1 | grep ‘configure arguments:‘`
for opt in $options; do
if [ `echo $opt | grep ‘.*-temp-path‘` ]; then
value=`echo $opt | cut -d "=" -f 2`
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: