1. 程式人生 > >RPM---定制化RPM包

RPM---定制化RPM包

x86_64 軟件 amp val exists direct fas works 現在

回顧下安裝軟件的三種方式:

1、編譯安裝軟件,優點是可以定制化安裝目錄、按需開啟功能等,缺點是需要查找並實驗出適合的編譯參數,諸如MySQL之類的軟件編譯耗時過長。
2、yum安裝軟件,優點是全自動化安裝,不需要為依賴問題發愁了,缺點是自主性太差,軟件的功能、存放位置都已經固定好了,不易變更。
===>如果你現在還為是使用編譯安裝軟件還是使用yum安裝軟件發愁,那你就out了。
3、編譯源碼,根據自己的需求做成定制RPM包–>搭建內網yum倉庫–yum安裝。結合前兩者的優點,暫未發現什麽缺點。可能的缺點就是RPM包的通用性差,只能適用於本公司的環境。另外一般人不會定制RPM包。這是中大型互聯網企業運維自動化的必要技能。

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

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

FPM打包工具

FPM的作者是jordansissel
FPM的github:https://github.com/jordansissel/fpm
FPM功能簡單說就是將一種類型的包轉換成另一種類型。

1. 支持的源類型包

  1. dir 將目錄打包成所需要的類型,可以用於源碼編譯安裝的軟件包
  2. rpm 對rpm進行轉換
  3. gem 對rubygem包進行轉換
  4. python 將python模塊打包成相應的類型

2. 支持的目標類型包

  1. rpm 轉換為rpm包
  2. deb 轉換為deb包
  3. solaris 轉換為solaris包
  4. puppet 轉換為puppet模塊

3. FPM安裝

  1. fpm是ruby寫的,因此系統環境需要ruby,且ruby版本號大於1.8.5。
  2. # 安裝ruby模塊
  3. yum -y install ruby rubygems ruby-devel
  4. # 添加阿裏雲的Rubygems倉庫,外國的源慢
  5. gem sources -a http://mirrors.aliyun.com/rubygems/
  6. # 移除原生的Ruby倉庫
  7. gem sources --remove http://rubygems.org/
  8. # 安裝fpm
  9. gem install fpm

4. FPM參數

詳細使用見fpm –help

常用參數

  1. -s 指定源類型
  2. -t 指定目標類型,即想要制作為什麽包
  3. -n 指定包的名字
  4. -v 指定包的版本號
  5. -C 指定打包的相對路徑 Change directory to here before searching forfiles
  6. -d 指定依賴於哪些包
  7. -f 第二次打包時目錄下如果有同名安裝包存在,則覆蓋它
  8. -p 輸出的安裝包的目錄,不想放在當前目錄下就需要指定
  9. --post-install 軟件包安裝完成之後所要運行的腳本;同--after-install
  10. --pre-install 軟件包安裝完成之前所要運行的腳本;同--before-install
  11. --post-uninstall 軟件包卸載完成之後所要運行的腳本;同--after-remove
  12. --pre-uninstall 軟件包卸載完成之前所要運行的腳本;同--before-remove

使用實例–實戰定制nginx的RPM包

1. 安裝nginx

  1. yum -y install pcre-devel openssl-devel
  2. useradd nginx -M -s /sbin/nologin
  3. tar xf nginx-1.6.2.tar.gz
  4. cd nginx-1.6.2
  5. ./configure --prefix=/application/nginx-1.6.2 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module
  6. make && make install
  7. ln -s /application/nginx-1.6.2/ /application/nginx

2. 編寫腳本

  1. [root@oldboy ~]# cd /server/scripts/
  2. [root@oldboy scripts]# vim nginx_rpm.sh # 這是安裝完rpm包要執行的腳本
  3. #!/bin/bash
  4. useradd nginx -M -s /sbin/nologin
  5. ln -s /application/nginx-1.6.2/ /application/nginx

3. 打包

  1. [root@oldboy ~]# fpm -s dir -t rpm -n nginx -v 1.6.2 -d ‘pcre-devel,openssl-devel‘ --post-install /server/scripts/nginx_rpm.sh -f /application/nginx-1.6.2/
  2. no value for epoch is set, defaulting to nil {:level=>:warn}
  3. no value for epoch is set, defaulting to nil {:level=>:warn}
  4. Created package {:path=>"nginx-1.6.2-1.x86_64.rpm"}
  5. [root@oldboy ~]# ll -h nginx-1.6.2-1.x86_64.rpm
  6. -rw-r--r-- 1 root root 6.7M Nov 1 10:02 nginx-1.6.2-1.x86_64.rpm

4. 安裝rpm包

安裝rpm包的三種方法:

  • rpm命令安裝

    1. [root@LB-nginx-01 ~]# rpm -ivh nginx-1.6.2-1.x86_64.rpm
    2. error: Failed dependencies:
    3. pcre-devel is needed by nginx-1.6.2-1.x86_64
    4. openssl-devel is needed by nginx-1.6.2-1.x86_64
    5. 但會報如上依賴錯誤,需要先yum安裝依賴才能安裝rpm包。
  • yum命令安裝rpm包

    1. yum -y localinstall nginx-1.6.2-1.x86_64.rpm
    2. 這個命令會自動先安裝rpm包的依賴,然後再安裝rpm包。
  • 搭建內網yum倉庫
    YUM倉庫搭建

註意事項

1. 相對路徑問題

  1. # 相對路徑
  2. [root@oldboy nginx]# fpm -s dir -t rpm -n nginx -v 1.6.2 .
  3. no value for epoch is set, defaulting to nil {:level=>:warn}
  4. no value for epoch is set, defaulting to nil {:level=>:warn}
  5. Created package {:path=>"nginx-1.6.2-1.x86_64.rpm"}
  6. [root@oldboy nginx]# rpm -qpl nginx-1.6.2-1.x86_64.rpm
  7. /client_body_temp
  8. /conf/extra/dynamic_pools
  9. /conf/extra/static_pools
  10. …………
  11. # 絕對路徑
  12. [root@oldboy ~]# fpm -s dir -t rpm -n nginx -v 1.6.2 /application/nginx-1.6.2/
  13. no value for epoch is set, defaulting to nil {:level=>:warn}
  14. no value for epoch is set, defaulting to nil {:level=>:warn}
  15. Created package {:path=>"nginx-1.6.2-1.x86_64.rpm"}
  16. [root@oldboy ~]# rpm -qpl nginx-1.6.2-1.x86_64.rpm
  17. /application/nginx-1.6.2/client_body_temp
  18. /application/nginx-1.6.2/conf/extra/dynamic_pools
  19. /application/nginx-1.6.2/conf/extra/static_pools
  20. /application/nginx-1.6.2/conf/fastcgi.conf
  21. /application/nginx-1.6.2/conf/fastcgi.conf.default
  22. …………
  23. 使用rpm -qpl 命令可以查看rpm包的內容。
  24. 註:fpm類似tar打包一樣,只是fpm打的包能夠被yum命令識別而已。

2. 軟鏈接問題

  1. [root@oldboy ~]# fpm -s dir -t rpm -n nginx -v 1.6.2 /application/nginx
  2. no value for epoch is set, defaulting to nil {:level=>:warn}
  3. File already exists, refusing to continue: nginx-1.6.2-1.x86_64.rpm {:level=>:fatal}
  4. # 報錯是因為當前目錄存在同名的rpm包,可以使用-f參數強制覆蓋。
  5. [root@oldboy ~]# fpm -s dir -t rpm -n nginx -v 1.6.2 -f /application/nginx
  6. no value for epoch is set, defaulting to nil {:level=>:warn}
  7. Force flag given. Overwriting package at nginx-1.6.2-1.x86_64.rpm {:level=>:warn}
  8. no value for epoch is set, defaulting to nil {:level=>:warn}
  9. Created package {:path=>"nginx-1.6.2-1.x86_64.rpm"}
  10. 打包看似成功,但查看包的內容,只是這一個軟鏈接文件。
  11. [root@oldboy ~]# rpm -qpl nginx-1.6.2-1.x86_64.rpm
  12. /application/nginx
  13. 原因:目錄結尾的/問題,類似rm刪除軟鏈接目錄

定制LNMP的RPM包思路

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

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

    1. # 參考命令
    2. [root@web2 ~]# fpm -s dir -t rpm -n web2 -v 1.1 \
    3. --description ‘lnmp.cms,bbs.blog‘ \
    4. -d ‘libxslt-devel,nfs-utils,rpcbind,mysql,libmcrypt-devel,mhash,mhash-devel,mcrypt‘ \
    5. --post-install /server/scripts/lnmp-init.sh \
    6. /application /usr/local/libiconv/ /app/logs/ /data0/ /server/

RPM---定制化RPM包