Linux 定製rpm包

 定製rpm

說明這些操作全部在管理服務內操作

定製rpm,搭建內網yum倉庫通過kickstart批量系統安裝,這是互聯網企業運維自動化的必要技能,自動化運維的基石。

1.1 面試題

有100臺服務器想安裝系統。你有什麼方案快速部署並優化嗎?需要多少時間搞定?

1.1.1 解決方案

(1) tar打包:先編譯安裝、打包、批量分發、解包;

(2) saltstackpuppetansible批量部署;

(3) 定製rpm所、搭建yum倉庫、yum安裝;

(4) openstack虛擬機鏡像和docker窗口分發。

1.2 安裝軟件的方式

1.2.1 編譯安裝

優點

 按需開啓功能

 可定製(定製安裝目錄和軟件功能)、一情況下不需要網絡、可選擇軟件版本

缺點

 需要查找並實驗出適合的編譯參數

 軟件版本升級時,要注意某些參數已經取消掉了

 MySQLPHP等軟件編譯耗時過長

 慢、複雜、需要查找編譯參數、找依賴麻煩、純編譯依賴比較複雜

1.2.2 yum安裝

優點

 全自動化安裝

 簡單、便捷

 不需要爲依賴問題發愁了

缺點

 自主性太差

 需要網絡、網絡不好時下載速度慢

 沒有辦法定製、軟件的功能、存放位置都已經固定好了,不易變更

1.2.3 二進制安裝

優點:簡單、快

缺點:不能定製、包容量大

1.2.4 定製rpm包

流程根據需求編譯軟件==>製件rpm==>搭建內網yum倉庫==>yum安裝

優點:結合編譯安裝與yum安裝兩者的優點

缺點 rpm包的通用性差,只能適用於公司的環境,第一步編譯安裝複雜、打包後不能再次更改、一般人不會定製rpm

1.3 RPM簡介

英文全稱是Red Hat Package ManagerRed Hat包管理器。

幾乎所有的Linux發行版本都使用這種形式的軟件包管理安裝、更新和卸載軟件。

rpm命令有五種基本功能(但不包括創建軟件包):安裝、卸載、升級、查詢、驗證。

1.4 FPM打包工具

FPM的作者是jordansissel

FPMGitHubhttps://github.com/jordansissel/fpm 

FPM功能簡單理解:就是將一種類型的包轉換成另一種類型。

1.4.1 支持的源類型包

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

1.4.2 支持的目標類型包

rpm       #<==轉換爲rpm包
deb       #<==轉換爲deb包
solaris   #<==轉換爲solaris包
puppet    #<==轉換爲puppet模塊

1.4.3 FPM安裝

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

#<==安裝ruby模塊
yum -y install ruby rubygems ruby-devel
#<==添加阿里雲的Rubygems倉庫
gem source -a http://mirrors.aliyun.com/rubygems/
#<==移除原生的Ruby倉庫
gem source -r https://rubygems.org/
#<==安裝fpm
gem install json -v 1.7.7
gem install cabin -v 0.6
gem install backports -v 2.6.2
gem install arr-pm -v 0.0.9
gem install clamp -v 0.6
#gem install childprocess -v 0.5.9
gem install fpm -v 1.3.3
#<==指定安裝fpm 1.3.3版本的軟件

1.4.4 FPM參數

詳細使用見fpm --help

常用參數如下

-s                #<==source,指定源類型
-t                #<==target,指定目標類型,即想要製作爲什麼包
-n                #<==name,指定包的名字
-v                #<==version,指定包的版本號
-C                #<==change,指定打包的相對路徑
-d                #<==depend,指定依賴於哪些包
-f                #<==force,第二次打包時目錄下如果有同名安裝包存在,則覆蓋它
-p                #<==輸出的安裝包的目錄,不想放在當前目錄下就需要指定
--post-install    #<==軟件包安裝完成之後所要運行的腳本;同--after-install
--pre-install     #<==軟件包安裝完成之前所要運行的腳本;同--before-install
--post-uninstall  #<==軟件包卸載完成之後所要運行的腳本;同--after-remove
--pre-uninstall   #<==軟件包卸載完成之前所要運行的腳本;同--before-remove

1.5 實戰定製nginx的RPM包

1.5.1 系統環境

[root@m01 ~]# cat /etc/redhat-release     #<==系統版本
CentOS release 6.7 (Final)
[root@m01 ~]# uname -r                    #<==64位系統,及內核版本
2.6.32-573.el6.x86_64
[root@m01 ~]# getenforce                  #<==關selinux
Disabled
[root@m01 ~]# /etc/init.d/iptables status #<==關防火牆
iptables:未運行防火牆。

1.5.2 準備操作

[root@m01 ~]# mkdir /application/tools/ -p #<==統一軟件包存放目錄
[root@m01 ~]# sed -i 's#keepcache=0#keepcache=1#g' /etc/yum.conf#<==開啓yum緩存
[root@m01 ~]# find /var/cache/ -type f -name '*rpm'|xargs rm -f
#<==清空本機已有yum緩存
[root@m01 ~]# cd /application/tools/
[root@m01 tools]# wget -q http://nginx.org/download/nginx-1.6.3.tar.gz
#<==下載nginx-1.6.3

1.5.3 編譯安裝nginx

yum install pcre pcre-devel openssl openssl-devel -y
rpm -qa openssl openssl-devel pcre pcre-devel
find /var/cache/ -type f -name '*rpm'|xargs cp -t /tmp/
cd /tmp/ && tar zcf nginx_yum.tar.gz *.rpm
sz nginx_yum.tar.gz
--------------------------------------------------------------------------------
cd /application/tools/
useradd nginx -M -s /sbin/nologin 
tar xf nginx-1.6.3.tar.gz 
cd nginx-1.6.3
./configure --prefix=/application/nginx-1.6.3 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module
echo $?
make && make install
echo $?
ln -s /application/nginx-1.6.3/ /application/nginx
ll -d /application/nginx-1.6.3/ /application/nginx

過程

[root@m01 tmp]# yum install pcre pcre-devel openssl openssl-devel -y
#<==安裝pcre庫,openssl軟件,因爲等下編譯安裝時,需要安裝ssl模塊
[root@m01 tmp]# rpm -qa openssl openssl-devel pcre pcre-devel#<==檢查
openssl-devel-1.0.1e-48.el6_8.1.x86_64
pcre-7.8-7.el6.x86_64
openssl-1.0.1e-48.el6_8.1.x86_64
pcre-devel-7.8-7.el6.x86_64
[root@m01 tools]# find /var/cache/ -type f -name '*rpm'|xargs cp -t /tmp/
#<==另存rpm包,因爲很多人的系統環境可能不一致,需要的rpm包可能不同。
[root@m01 tools]# cd /tmp/ && tar zcf nginx_yum.tar.gz *.rpm#<==打包
 
[root@m01 tmp]# cd /application/tools/#<==切換到軟件包存放目錄
[root@m01 tools]# useradd nginx -M -s /sbin/nologin #<==添加nginx用戶
[root@m01 tools]# tar xf nginx-1.6.3.tar.gz #<==解包
[root@m01 tools]# cd nginx-1.6.3#<==切換到nginx1.6.3目錄下
[root@m01 nginx-1.6.3]# ./configure --prefix=/application/nginx-1.6.3 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module#<==配置過程
內容省略,自行腦補……
[root@m01 nginx-1.6.3]# echo $?#<==檢查配置過程是否出錯
0
[root@m01 nginx-1.6.3]# make && make install#<==編譯&&配置過程
內容省略,自行腦補……
[root@m01 nginx-1.6.3]# echo $?#<==檢查編譯與配置過程是否出錯
0
[root@m01 nginx-1.6.3]# ln -s /application/nginx-1.6.3/ /application/nginx
#<==做軟鏈接
[root@m01 nginx-1.6.3]# ll -d /application/nginx-1.6.3/ /application/nginx
#<==檢查
lrwxrwxrwx 1 root root   25 2016-07-29 17:37 /application/nginx -> /application/nginx-1.6.3/
drwxr-xr-x 6 root root 4096 2016-07-29 17:37 /application/nginx-1.6.3/

1.5.4 編寫腳本

mkdir /server/scripts -p
cd /server/scripts/
cat >>nginx_rpm.sh<<EOF
#!/bin/bash
useradd nginx -M -s /sbin/nologin
ln -s /application/nginx-1.6.3/ /application/nginx
EOF

過程

[root@m01 nginx-1.6.3]# mkdir /server/scripts -p
[root@m01 nginx-1.6.3]# cd /server/scripts/
[root@m01 scripts]# vim nginx_rpm.sh#<==這是安裝完rpm包要執行的腳本
#!/bin/bash
useradd nginx -M -s /sbin/nologin
ln -s /application/nginx-1.6.3/ /application/nginx

1.5.5 打包

fpm -s dir -t rpm -n nginx -v 1.6.3 -d 'pcre,pcre-devel,openssl,openssl-devel' --post-install /server/scripts/nginx_rpm.sh -f /application/nginx-1.6.3/
ll -h
sz nginx_rpm.sh
sz nginx-1.6.3-1.x86_64.rpm

過程

[root@m01 scripts]# fpm -s dir -t rpm -n nginx -v 1.6.3 -d 'pcre,pcre-devel,openssl,openssl-devel' --post-install /server/scripts/nginx_rpm.sh -f /application/nginx-1.6.3/
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.6.3-1.x86_64.rpm"}
fpm命令參數詳解:
-s                #<==source,指定源類型
-t                #<==target,指定目標類型,即想要製作爲什麼包
-n                #<==name,指定包的名字
-v                #<==version,指定包的版本號
-d                #<==depend,指定依賴於哪些包,包有多個,用逗號隔開
-f                #<==force,第二次打包時目錄下如果有同名安裝包存在,則覆蓋它
--post-install    #<==軟件包安裝完成之後所要運行的腳本;同--after-install
--pre-install     #<==軟件包安裝完成之前所要運行的腳本;同--before-instal

1.6 rpm常用命令組合

查看

rpm -qpi包名            #<==查看rpm包詳細信息
rpm -qpl包名            #<==查看rpm包裏面的內容
rpm -qpR包名            #<==查看rpm包的依賴
rpm -qp --scripts 包名  #<==查看rpm包帶的執行腳本,執行腳本不是以文件形式存在
rpm -qa                 #<==查看系統內所有已安裝的rpm包

安裝

rpm -ivh包名            #<==安裝rpm包
rpm -ivh --aid 包名     #<==解決rpm包循環依賴的問題

1.6.1 rpm命令的參數

查看

-a        #<==all,所有
-q        #<==query,查詢
-p        #<==package,包
-i        #<==info,信息
-l        #<==list,列表
-R        #<==requires,依賴
--scripts #<==顯示腳本

安裝

-i        #<==install,安裝
-v        #<==顯示詳細信息(Print verbose information)
-h        #<==hash,顯示哈希值
--aid  Add suggested packages to the transaction set(事務集)when needed.

1.7 注意事項

1.7.1 相對路徑問題

fpm打包時,一定要用絕對路徑

fpm -s dir -t rpm -n nginx -v 1.6.3 .#<==當路徑

fpm -s dir -t rpm -n nginx -v 1.6.3 /application/nginx-1.6.3/#<==絕對路徑

使用rpm -qpl查看rpm的內容fpm類似tar打包一樣,只是fpm打的包能夠被yum命令識別而已

過程

[root@m01 scripts]# cd /application/nginx-1.6.3/#<==切換到目錄下,再打包
[root@m01 nginx-1.6.3]# fpm -s dir -t rpm -n nginx -v 1.6.3 .#<==點來代表當前目錄
[root@m01 nginx-1.6.3]# rpm -qpl nginx-1.6.3-1.x86_64.rpm
#<==所有的目錄,都從系統根目錄開始了,所以,一定要用絕對路徑打包
/conf/fastcgi.conf
/conf/fastcgi.conf.default
/conf/fastcgi_params
省略……

1.7.2 鏈接問題

fpm打包時,直接打包原目錄(後面加不加/都沒有問題),不要打包軟鏈接目錄

  • fpm -s dir -t rpm -n nginx -v 1.6.3 /application/nginx(不加/,這個軟鏈接代表個文件)

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

  • 原因,目錄結尾的/問題,這有點類似rm刪除鏈接目錄

  • fpm -s dir -t rpm -n nginx -v 1.6.3 /application/nginx/加/,這個軟鏈接代表目錄

1.8 安裝rpm包

利用backup服務測試

安裝rpm包的三種方法:

1.8.0.1 rpm命令安裝

[root@backup tools]# rpm -ivh nginx-1.6.3-1.x86_64.rpm 
error: Failed dependencies:
        pcre-devel is needed by nginx-1.6.3-1.x86_64
        openssl-devel is needed by nginx-1.6.3-1.x86_64
#<==但會報如上依賴錯誤,需要先yum安裝依賴才能安裝rpm包。
~ 解決方法
#<==先利用yum安裝上面的兩個依賴包,再執行rpm。
yum -y pcre-devel openssl-devel

1.8.0.2 yum命令安裝rpm

[root@backup tools]# yum localinstall nginx-1.6.3-1.x86_64.rpm -y
#<==這個命令會自動先安裝rpm包的依賴,然後再安裝rpm包。

1.8.0.3 搭建內網yum倉庫※※※

yum倉庫搭建(且下下文分解!)


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