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

RPM包定制

mod 企業 系統 適用於 rec 1-1 編譯參數 tps onf

概述

問題:當領導給你 100 臺已經安裝好系統的服務器,然後讓優化,讓你提出一個快速部署方案。
解答:
  1.tar 打包 先編譯安裝 打包--》分發--》解包(比如 mysql 打包後直接就可以使用
  2.SaltStack,puppet
  3.定制 rpm yum 倉庫 yum 安裝
  4.openstack 虛擬機鏡像和 docker 容器分發

回顧下安裝軟件的三種方式:
1、編譯安裝軟件,優點是可以定制化安裝目錄、按需開啟功能等,缺點是需要查找並實驗出適合的編譯參數,諸如MySQL之類的軟件編譯耗時過長。
2、yum安裝軟件,優點是全自動化安裝,不需要為依賴問題發愁了,缺點是自主性太差,軟件的功能、存放位置都已經固定好了,不易變更。===>如果你現在還為是使用編譯安裝軟件還是使用yum安裝軟件發愁,那你就out了。

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

一:YUM 安裝
  優點:簡單,便捷,解決源碼包安裝依賴問題,全自動化安裝
  缺點:沒有辦法定制,需要網絡,網絡環境差的情況話,下載速度慢
二:編譯安裝
  優點:可以定制軟件包(定制安裝目錄和軟件功能),一定情況下不需要網絡,可自由選擇軟件版本 
  缺點:安裝過程慢,安裝復雜,需要查找編譯參數(對於一些編譯錯誤,找人求助也討人嫌),軟件編譯依賴性強

三:二進制安裝
  優點:簡單,快捷
  缺點:不能定制,包容量大(mysql 的二進制包 200M 左右)
四:定制 rpm 包 yum 倉庫 yum 安裝
  優點:可以根據自己的需求編譯軟件>>制作 rpm 包>>搭建 yum 倉庫>>上傳 rpm 包到 yum倉庫>>客戶端安裝軟件  
  缺點:第一步編譯安裝復雜,打包完成以後無法更改,一般人不會這個方法

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

rpmbuild 是 redhat 系統原生打包命令,這個命令的使用復雜不推薦使用此方法打包 rpm 包,太復雜啦,有想了解到的朋友可以參考:http://dreamway.blog.51cto.com/1281816/1110874或者自行百度,我們這裏使用一個簡單的FPM工具定制RPM包

FPM的安裝與使用

主機環境:CentOS 6.5

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

1. 支持的源類型包

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

2. 支持的目標類型包

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

3. FPM參數 (使用 fpm --help 查看更多幫助)

1 2 3 4 5 6 7 8 9 10 11 12 -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

4.安裝FPM工具

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

***在安裝ruby包時,可能無法使用yum的方式安裝上rubygems包,只能下載rubygems的rpm包進行安裝***

下載地址:http://rpmfind.net/linux/rpm2html/search.php?query=rubygems

技術分享圖片
rpm -ivh rubygems-1.3.7-5.el6.noarch.rpm  --nodeps  //這種方式安裝會忽略runygems的依賴包,不建議使用
或者
yum -y localinstall rubygems-1.3.7-5.el6.noarch.rpm  //建議使用這種方式安裝,它會先安裝依賴包,再安裝rubygems包,需要配置yum源
技術分享圖片

安裝 fpm 打包工具時提示以下錯誤:

ERROR: Error installing fpm:
ruby-xz requires Ruby version >= 1.9.3.

上面的提示表示您 Ruby 版本過低,需要安裝 1.9.3 的版本,解決思路只需安裝低版本的 fpm工具即可

解決方法:

技術分享圖片
gem install json -v 1.8.3
gem install fpm -v 1.3.3
或者
gem install fpm    //先直接安裝一次,再安裝一個低版本的
gem install fpm -v 1.3.3
技術分享圖片

案例:Nginx服務定制RPM

1. 編譯安裝Nginx服務

技術分享圖片
yum -y install pcre-devel openssl-devel            //安裝Nginx依賴包
useradd -M -s /sbin/nologin nginx            //添加Nginx運行用戶
tar zxvf nginx-1.8.1.tar.gz -C /usr/src/        //編譯安裝Nginx
cd /usr/src/nginx-1.8.1/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module
make && make install
ln -s /usr/local/nginx/sbin/* /usr/local/sbin/        //優化Nginx程序執行路徑
nginx                //啟動Nginx服務,並驗證
技術分享圖片

2.開始定制Nginx服務的RPM包

(1)停止Nginx服務

技術分享圖片
[root@aery ~]# lsof -i :80
 COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
 nginx   8439  root    6u  IPv4  38775      0t0  TCP *:http (LISTEN)
 nginx   8440 nginx    6u  IPv4  38775      0t0  TCP *:http (LISTEN)
[root@aery ~]# killall -9 nginx
[root@aery ~]# lsof -i :80
技術分享圖片

(2)編寫腳本,用來 nginx 打包完成後,安裝後自動執行的腳本

技術分享圖片
[root@aery ~]# mkdir -p /server/scripts
[root@aery ~]# vim /server/scripts/nginx.sh
 #!/bin/bash
 useradd -M -s /sbin/nologin nginx
 ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
技術分享圖片

(3)將 nginx 服務打包成 rpm 包,並指定需要安裝的依賴包

技術分享圖片
[root@aery ~]# fpm -s dir -t rpm -n nginx -v 1.8.1 -d ‘pcre-devel,openssl-devel‘ --post-install /server/scripts/nginx.sh -f /usr/local/nginx/
 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.8.1-1.x86_64.rpm"}
技術分享圖片

(4)將打包完成的 rpm 包下載下來,上傳到需要安裝的服務器上即可實現 yum 安裝,或者是上傳到 yum 倉庫中提供給 yum 客戶端安裝

安裝 RPM包的三種方法

1) rpm命令安裝

[root@aery ~]# rpm -ivh nginx-1.8.1-1.x86_64.rpm 
error: Failed dependencies:
    pcre-devel is needed by nginx-1.8.1-1.x86_64

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

2) yum命令安裝

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

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

3)我們可以將打包完成的 rpm 上傳 YUM 倉庫。然後進行 yum 安裝即可

YUM倉庫搭建參考:http://www.cnblogs.com/zhichaoma/p/7581957.html

技術分享圖片
#服務端
[root@aery ~]# cp nginx-1.8.1-1.x86_64.rpm /yum_source/   //將nginx的rpm包放到yum倉庫中
[root@aery ~]# createrepo --update /yum_source/      //更新域名倉庫

#客戶端
[root@aery ~]# yum clean all            //清除 yum 以前的緩存
[root@aery ~]# yum makecache            //更新 YUM 緩存
[root@aery ~]# yum list | grep nginx        //檢查是否可以從yum源中找到Nginx的rpm包
nginx.x86_64                           1.8.1-1                           @inside
[root@aery ~]# yum -y install nginx        //安裝Nginx
[root@aery ~]# nginx                 //啟動Nginx服務
[root@aery ~]# lsof -i :80            //檢查 Nginx服務是否啟動
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   3900  root    6u  IPv4  29101      0t0  TCP *:http (LISTEN)
nginx   3901 nginx    6u  IPv4  29101      0t0  TCP *:http (LISTEN)
技術分享圖片

最後使用客戶機驗證客戶機的服務是否可以訪問(關閉客戶機的iptables)

對mysql數據庫進行定制RPM時的思路是,不要初始化數據庫

RPM常用命令組合

1 2 3 4 5 6 7 8 9 10 11 man rpm #查看 rpm 幫助 rpm -qpi nginx-1.6.3-1.x86_64.rpm #查看 rpm 包信息 rpm -qpl nginx-1.6.3-1.x86_64.rpm #查看 rpm 包內容 rpm -qpR nginx-1.6.3-1.x86_64.rpm #查看 rpm 包的依賴 rpm -qp --scripts nginx-1.6.3-1.x86_64.rpm #查看 rpm 包帶的執行腳本,執行腳 本以文件形式存在 rpm 包中 rpm -ivh nginx-1.6.3-1.x86_64.rpm #安裝 rpm 包 rpm -ivh --aid *.rpm #--aid 參數解決 rpm 包 循環依賴的問題,即當前目錄有所有相互依賴的 rpm 包,就可以用這種方法。 rpm -Uvh *.rpm #如果依賴版本有更新的則自動更新 yum localinstall *.rpm #自動安裝 rpm 的依賴包

RPM包定制