RPM包定制
概述
問題:當領導給你 100 臺已經安裝好系統的服務器,然後讓優化,讓你提出一個快速部署方案。
解答:
1.tar 打包 先編譯安裝 打包--》分發--》解包(比如 mysql 打包後直接就可以使用
2.SaltStack,puppet
3.定制 rpm yum 倉庫 yum 安裝
4.openstack 虛擬機鏡像和 docker 容器分發
回顧下安裝軟件的三種方式:
1、編譯安裝軟件,優點是可以定制化安裝目錄、按需開啟功能等,缺點是需要查找並實驗出適合的編譯參數,諸如MySQL之類的軟件編譯耗時過長。
2、yum安裝軟件,優點是全自動化安裝,不需要為依賴問題發愁了,缺點是自主性太差,軟件的功能、存放位置都已經固定好了,不易變更。===>如果你現在還為是使用編譯安裝軟件還是使用yum安裝軟件發愁,那你就out了。
一: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包定制