RPM 定製化RPM包

2022-08-04 08:30:09 字數 4807 閱讀 9422

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

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

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

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

fpm的作者是jordansissel

fpm的github:

fpm功能簡單說就是將一種型別的包轉換成另一種型別。

dir 將目錄打包成所需要的型別,可以用於原始碼編譯安裝的軟體包

rpm 對rpm進行轉換

gem 對rubygem包進行轉換

python 將python模組打包成相應的型別

rpm 轉換為rpm包

deb 轉換為deb包

solaris 轉換為solaris包

puppet 轉換為puppet模組

fpm是ruby寫的,因此系統環境需要ruby,且ruby版本號大於1.8.5。

# 安裝ruby模組

yum -y install ruby rubygems ruby-devel

# 新增阿里雲的rubygems倉庫,外國的源慢

gem sources -a

# 移除原生的ruby倉庫

gem sources --remove

# 安裝fpm

gem install 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

yum -y install pcre-devel openssl-devel

useradd nginx -m -s /sbin/nologin

tar xf nginx-1.6.2.tar.gz

cd nginx-1.6.2

make && make install

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

[root@oldboy scripts]# vim nginx_rpm.sh # 這是安裝完rpm包要執行的指令碼

#!/bin/bash

useradd nginx -m -s /sbin/nologin

no value for epoch is set, defaulting to nil

no value for epoch is set, defaulting to nil

created package

[root@oldboy ~]# ll -h nginx-1.6.2-1.x86_64.rpm

-rw-r--r-- 1 root root 6.7m nov 1 10:02 nginx-1.6.2-1.x86_64.rpm

安裝rpm包的三種方法:

# 相對路徑

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

no value for epoch is set, defaulting to nil

no value for epoch is set, defaulting to nil

created package

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

/client_body_temp

/conf/extra/dynamic_pools

/conf/extra/static_pools

…………

# 絕對路徑

no value for epoch is set, defaulting to nil

no value for epoch is set, defaulting to nil

created package

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

…………

使用rpm -qpl 命令可以檢視rpm包的內容。

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

no value for epoch is set, defaulting to nil

file already exists, refusing to continue: nginx-1.6.2-1.x86_64.rpm

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

no value for epoch is set, defaulting to nil

force flag given. overwriting package at nginx-1.6.2-1.x86_64.rpm

no value for epoch is set, defaulting to nil

created package

打包看似成功,但檢視包的內容,只是這乙個軟鏈結檔案。

[root@oldboy ~]# rpm -qpl nginx-1.6.2-1.x86_64.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 \

FPM定製RPM包實踐

問題 當領導給你 100 臺已經安裝好系統的伺服器,然後讓優化,讓你提出乙個快速部署方案。解答 1.tar 打包 先編譯安裝 打包 分發 解包 比如 mysql 打包後直接就可以使用 2.saltstack,puppet,ansible 3.定製 rpm yum 倉庫 yum 安裝 4.openst...

FPM定製RPM包實踐

問題 當領導給你 100 臺已經安裝好系統的伺服器,然後讓優化,讓你提出乙個快速部署方案。解答 1.tar 打包 先編譯安裝 打包 分發 解包 比如 mysql 打包後直接就可以使用 2.saltstack,puppet,ansible 3.定製 rpm yum 倉庫 yum 安裝 4.openst...

rpm 看 rpm 包內容

1 使用 rpm 命令檢視 rpm 包的內容 rpm qpl packetname.rpm 2 解壓 rpm 檔案 rpm2cpio rpm cpio div 3 cpio 命令的用法 用法 cpio option device 例 備份 home目錄 1 建立備份 1 絕對路徑 find home...