Centos定製化RPM包

第1章 定製化RPM

1.1 FPM介紹:

fpm工具用來快速構建安裝包,例如rpm,deps以及OSX packages等等。例如我們已經在本機上編譯並安裝了某個軟件,那麼通過fpm工具,可以將安裝文件達成一個rpm包。fpm支持的源文件的格式有gem、python module、pear、目錄、rpm、deb、node packages等等。fpm支持的輸出格式有deb、rpm、solaris、freebsd、tar、目錄、Mac OS X .pkg files等等。

使用rpmbuild製作包時,需要編寫SPEC文件,比較麻煩。尤其是當我們有一個已經編譯好的軟件,部署機器上可以直接啓動的程序,非常適合使用fpm工具來快速製作rpm安裝包。


1.2 安裝軟件的三種方式:

1、編譯安裝軟件,優點是可以定製化安裝目錄、按需開啓功能等,缺點是需要查找並實驗出適合的編譯參數,諸如MySQL之類的軟件編譯耗時過長。

2、yum安裝軟件,優點是全自動化安裝,不需要爲依賴問題發愁了,缺點是自主性太差,軟件的功能、存放位置都已經固定好了,不易變更。

===>如果你現在還爲是使用編譯安裝軟件還是使用yum安裝軟件發愁,那你就out了。

3、編譯源碼,根據自己的需求做成定製RPM包–>搭建內網yum倉庫–yum安裝。結合前兩者的優點,暫未發現什麼缺點。可能的缺點就是RPM包的通用性差,只能適用於本公司的環境。另外一般人不會定製RPM包。這是中大型互聯網企業運維自動化的必要技能。

這裏也不介紹rpm的概念,想了解的朋友可以查看http://www.ibm.com/developerworks/cn/linux/l-rpm/。

這裏也不介紹rpmbuild這個打包工具了,想了解的朋友自行谷歌百度。但我不建議大家花太多的時間去學習這個命令,比較晦澀,而且我會在下面介紹更簡單的命令。


1.3 FPM支持的源類型包:

1、dir 將目錄打包成所需要的類型,可以用於源碼編譯安裝的軟件包

2、rpm 對rpm進行轉換

3、gem 對rubygem包進行轉換

4、python 將python模塊打包成相應的類型


1.4 支持的目標類型包

1、rpm 轉換爲rpm包

2、deb 轉換爲deb包

3、solaris 轉換爲solaris包

4、puppet 轉換爲puppet模塊


FPM安裝

FPM是ruby寫的,因此係統環境需要ruby,且ruby版本號大於1.8.5

yum -y install ruby rubygems ruby-devel #<====== yum安裝即可

gem sources list #<=====查看當前使用的rubygems倉庫

gem sources --add https://ruby.taobao.org/ --remove http://rubygems.org/ #<====添加淘寶的Rubygems倉庫,外國的源慢,移除原生的Ruby倉庫

gem install json -v 1.8.3 #<======= 安裝fpm,gem從rubygem倉庫安裝軟件類似yum從yum倉庫安裝軟件。首先安裝低版本的json,高版本的json需要ruby2.0以上,然後安裝低版本的fpm,夠用。

gem install ffi -v 1.9.18

gem install fpm -v 1.3.3 #<======安裝FPM

yum install -y rpm-build #<====RPM包相關的軟件


1.5 FPM的參數:

詳細使用見fpm –help

常用參數

-s 指定源類型

-t 指定目標類型,即想要製作爲什麼包

-n 指定包的名字

-v 指定包的版本號

-C 指定打包的相對路徑 Change directory to here before searching forfiles

-d 指定依賴於哪些包

-f 第二次打包時目錄下如果有同名安裝包存在,則覆蓋它

-p 輸出的安裝包的目錄,不想放在當前目錄下就需要指定

--post-install 軟件包安裝完成之後所要運行的腳本;同--after-install

--pre-install 軟件包安裝完成之前所要運行的腳本;同--before-install

--post-uninstall 軟件包卸載完成之後所要運行的腳本;同--after-remove

--pre-uninstall 軟件包卸載完成之前所要運行的腳本;同--before-remove


1.6 使用實例–實戰定製nginx的RPM包

1.6.1 編譯安裝Nginx

yum -y install pcre-devel openssl-devel #<====安裝Nginx的依賴關係

yum -y install gcc #<====安裝gcc編輯器

useradd nginx -M -s /sbin/nologin #<======添加Nginx的管理用戶

wget http://nginx.org/download/nginx-1.14.0.tar.gz #<======下載Nginx-1.14.0軟件包

tar xf nginx-1.14.0.tar.gz #<======解壓軟件包

cd nginx-1.14.0 #<=====進入解壓後的目錄

./configure --prefix=/application/nginx-1.14.0 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module #<======開始編譯

make && make install #<======編譯安裝

ln -s /application/nginx-1.14.0/ /application/nginx #<======創建安裝目錄的軟鏈接


1.6.2 編寫腳本

[root@ web03 ~]# cd /server/scripts/

[root@ web03 scripts]# vim nginx_rpm.sh # 這是安裝完rpm包要執行的腳本

#!/bin/bash

useradd nginx -M -s /sbin/nologin

ln -s /application/nginx-1.14.0/ /application/nginx

image


1.17安裝rpm包二種方法:

PS:還有一種方法是搭建網內的YUM倉庫,在這裏不介紹。


1.7.1 rpm命令安裝

[root@web03 ~]# rpm -ivh nginx-1.6.2-1.x86_64.rpm

error: Failed dependencies:

pcre-devel is needed by nginx-1.6.2-1.x86_64

openssl-devel is needed by nginx-1.6.2-1.x86_64

但會報如上依賴錯誤,需要先yum安裝依賴才能安裝rpm包。


1.7.2 yum命令安裝rpm包

yum -y localinstall nginx-1.6.2-1.x86_64.rpm

這個命令會自動先安裝rpm包的依賴,然後再安裝rpm包。


1.8 注意事項

1.8.1 相對路徑問題

# 相對路徑

[root@oldboy nginx]# fpm -s dir -t rpm -n nginx -v 1.14.0 .

no value for epoch is set, defaulting to nil {:level=>:warn}

no value for epoch is set, defaulting to nil {:level=>:warn}

Created package {:path=>"nginx-1.14.0-1.x86_64.rpm"}

[root@oldboy nginx]# rpm -qpl nginx-1.14.0-1.x86_64.rpm

/client_body_temp

/conf/extra/dynamic_pools

/conf/extra/static_pools

…………

# 絕對路徑

[root@oldboy ~]# fpm -s dir -t rpm -n nginx -v 1.14.0 /application/nginx-1.14.0/

no value for epoch is set, defaulting to nil {:level=>:warn}

no value for epoch is set, defaulting to nil {:level=>:warn}

Created package {:path=>"nginx-1.14.0-1.x86_64.rpm"}

[root@oldboy ~]# rpm -qpl nginx-1.14.0-1.x86_64.rpm

/application/nginx-1.14.0/client_body_temp

/application/nginx-1.14.0/conf/extra/dynamic_pools

/application/nginx-1.14.0/conf/extra/static_pools

/application/nginx-1.14.0/conf/fastcgi.conf

/application/nginx-1.14.0/conf/fastcgi.conf.default

…………

使用rpm -qpl 命令可以查看rpm包的內容。

注:fpm類似tar打包一樣,只是fpm打的包能夠被yum命令識別而已。


1.8.2 軟鏈接問題

[root@oldboy ~]# fpm -s dir -t rpm -n nginx -v 1.14.0 /application/nginx

no value for epoch is set, defaulting to nil {:level=>:warn}

File already exists, refusing to continue: nginx-1.14.0-1.x86_64.rpm {:level=>:fatal}

# 報錯是因爲當前目錄存在同名的rpm包,可以使用-f參數強制覆蓋。

[root@oldboy ~]# fpm -s dir -t rpm -n nginx -v 1.14.0 -f /application/nginx

no value for epoch is set, defaulting to nil {:level=>:warn}

Force flag given. Overwriting package at nginx-1.14.0-1.x86_64.rpm {:level=>:warn}

no value for epoch is set, defaulting to nil {:level=>:warn}

Created package {:path=>"nginx-1.14.0-1.x86_64.rpm"}

打包看似成功,但查看包的內容,只是這一個軟鏈接文件。

[root@oldboy ~]# rpm -qpl nginx-1.14.0-1.x86_64.rpm

/application/nginx

原因:目錄結尾的/問題,類似rm刪除軟鏈接目錄


1.9 定製LNMP的RPM包思路

編譯安裝好nginx,mysql,php,此處有個問題,就是php的大部分依賴環境是通過yum安裝的,但有一個libiconv-1.14.tar.gz包需要編譯安裝,安裝時已經指定了安裝目錄,只需一同打包即可。

還有一個問題,就是mysql這個目錄比較大,用fpm打包耗時長。平時我們有可能需要對nginx或php做優化,這樣又得重新打包。因此我們可以將mysql分離出來,分別打包。只需在製作nginx+php的rpm包時添加mysql的依賴即可。

# 參考命令

[root@web2 ~]# fpm -s dir -t rpm -n web2 -v 1.1 \

--description 'lnmp.cms,bbs.blog' \

-d ‘libxslt-devel,nfs-utils,rpcbind,mysql,libmcrypt-devel,mhash,mhash-devel,mcrypt' \

--post-install /server/scripts/lnmp-init.sh \

/application /usr/local/libiconv/ /app/logs/ /data0/ /server/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章