關于FPM的介紹
https://docs.google.com/present/view?id=0Aa9liCTsAyzRZGNtd3dkOTRfMTdmczY2azlkcg&hl=en
FPM功能簡單說就是将一種類型的包轉換成另一種類型。
支援的源類型包:“dir”:将目錄打包成所需要的類型,可以用于源碼編譯安裝的軟體包
“rpm”:對rpm進行轉換
“gem”:對rubygem包進行轉換
“python”:将python子產品打包成相應的類型
支援的目标類型包:
“rpm”:轉換為rpm包
“deb”:轉換為deb包
“solaris”:轉換為solaris包
“puppet”:轉換為puppet子產品
這裡主要介紹如何将源碼安裝的包轉換為RPM/DEB包,其他功能感興趣的可以試試。
安裝環境:
系統Centos6.5 64位,預設的ruby為1.8.7版本;
封裝mysql5.6.29二進制安裝包;
FPM安裝
FPM的安裝非常簡單,安裝FPM前需要先安裝ruby,rubygem
# FPM是Ruby子產品
1
<code>yum -y </code><code>install</code> <code>ruby rubygems ruby-devel</code>
#移除原生的Ruby倉庫, 添加淘寶的Ruby倉庫:
2
<code>gem sources --add https:</code><code>//gems</code><code>.ruby-china.org/ --remove </code>
<code>https:</code><code>//rubygems</code><code>.org/</code>
<a href="https://rubygems.org/" target="_blank"></a>
#檢視系統預設的ruby源:
3
4
<code>[root@localhost ruby-2.1.10]</code><code># gem sources -l</code>
<code>*** CURRENT SOURCES ***</code>
<code>http:</code><code>//rubygems</code><code>.org/ </code>
<code> </code><code>https:</code><code>//gems</code><code>.ruby-china.org/</code>
5
6
<code>gem sources --add https:</code><code>//gems</code><code>.ruby-china.org/ --remove https:</code><code>//rubygems</code><code>.org/</code>
<code>[root@localhost ruby-2.1.10]</code><code># gem sources --remove http://rubygems.org/</code>
<code>http:</code><code>//rubygems</code><code>.org/ removed from sources</code>
<code>https:</code><code>//gems</code><code>.ruby-china.org/</code>
#安裝Fpm軟體包
報錯如下:
<code>[root@localhost data]</code><code># gem install fpm #時間較久,然後還報了錯</code>
<code>Building native extensions. This could take a </code><code>while</code><code>...</code>
<code>ERROR: Error installing fpm:</code>
<code>ruby-xz requires Ruby version >= 1.9.3.</code>
#處理辦法:解除安裝系統自帶的ruby軟體包版本:
<code>yum remove ruby -y</code>
ruby官網下載下傳高于1.9.3的ruby軟體包進行安裝:
#安裝編譯軟體gcc make
<code>yum </code><code>install</code> <code>gcc </code><code>make</code> <code>-y</code>
#編譯安裝三部曲:
<code>tar</code> <code>zxf ruby-2.1.10.</code><code>tar</code><code>.gz</code>
<code>.</code><code>/configure</code> <code>--prefix=</code><code>/usr/local/ruby2</code><code>.1</code>
<code>make</code> <code>-j 4 && </code><code>make</code> <code>install</code>
#添加環境變量:
<code># cat /etc/profile.d/ruby2.1.sh </code>
<code>export</code> <code>PATH=$PATH:</code><code>/usr/local/ruby2</code><code>.1</code><code>/bin</code>
#檢視ruby版本:
<code>[root@localhost ~]</code><code># source /etc/profile</code>
<code>[root@localhost ~]</code><code># ruby -v</code>
<code>ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux]</code>
<code>[root@localhost ruby-2.1.10]</code><code># gem install fpm</code>
<code>-</code><code>bash</code><code>: </code><code>/usr/bin/gem</code><code>: No such </code><code>file</code> <code>or directory</code>
處理辦法:安裝依賴;
<code>yum </code><code>install</code> <code>rubygems</code>
繼續安裝fpm報錯如下:
<code># gem install fpm</code>
<code>ERROR: While executing gem ... (Gem::Exception)</code>
<code> </code><code>Unable to require openssl, </code><code>install</code> <code>OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources</code>
<code># yum install openssl</code>
<code>#yum install rpm-build</code>
當然看到這個報錯的時候,第一反應openssl和rpmbuild庫沒裝,yum install openssl rpm-build,發現報錯依舊,緊接看網上的文檔編譯zlib,我當然沒這麼幹。
再次安裝依舊報錯,處理辦法:修改源:放棄https 使用http;
7
8
<code>[root@localhost ~]</code><code># gem sources -a http://gems.ruby-china.org</code>
<code>http:</code><code>//gems</code><code>.ruby-china.org added to sources</code>
<code>[root@localhost ~]</code><code># gem source --remove https://gems.ruby-china.org</code>
<code>https:</code><code>//gems</code><code>.ruby-china.org removed from sources</code>
<code>[root@localhost ~]</code><code># gem source -l</code>
<code>http:</code><code>//rubygems</code><code>.org/</code>
<code>http:</code><code>//gems</code><code>.ruby-china.org</code>
#再次安裝發現就沒問題;這個安裝很耗時,時間很久。
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<code>[root@localhost bin]</code><code># gem install fpm</code>
<code>Fetching: archive-</code><code>tar</code><code>-minitar-0.5.2.gem (100%)</code>
<code>Successfully installed archive-</code><code>tar</code><code>-minitar-0.5.2</code>
<code>Fetching: cabin-0.9.0.gem (100%)</code>
<code>Successfully installed cabin-0.9.0</code>
<code>Fetching: arr-pm-0.0.10.gem (100%)</code>
<code>Successfully installed arr-pm-0.0.10</code>
<code>Fetching: backports-3.6.8.gem (100%)</code>
<code>Successfully installed backports-3.6.8</code>
<code>Fetching: ffi-1.9.18.gem (100%)</code>
<code>Successfully installed ffi-1.9.18</code>
<code>Fetching: childprocess-0.6.3.beta.1.gem (100%)</code>
<code>Successfully installed childprocess-0.6.3.beta.1</code>
<code>Fetching: clamp-1.0.1.gem (100%)</code>
<code>Successfully installed clamp-1.0.1</code>
<code>Fetching: dotenv-2.2.0.gem (100%)</code>
<code>Successfully installed dotenv-2.2.0</code>
<code>Fetching: insist-1.0.0.gem (100%)</code>
<code>Successfully installed insist-1.0.0</code>
<code>Fetching: mustache-0.99.8.gem (100%)</code>
<code>Successfully installed mustache-0.99.8</code>
<code>Fetching: stud-0.0.22.gem (100%)</code>
<code>Successfully installed stud-0.0.22</code>
<code>Fetching: pleaserun-0.0.28.gem (100%)</code>
<code>Successfully installed pleaserun-0.0.28</code>
<code>Fetching: io-like-0.3.0.gem (100%)</code>
<code>Successfully installed io-like-0.3.0</code>
<code>Fetching: ruby-xz-0.2.3.gem (100%)</code>
<code>Successfully installed ruby-xz-0.2.3</code>
<code>Fetching: fpm-1.8.1.gem (100%)</code>
<code>Successfully installed fpm-1.8.1</code>
<code>Parsing documentation </code><code>for</code> <code>archive-</code><code>tar</code><code>-minitar-0.5.2</code>
<code>Installing ri documentation </code><code>for</code> <code>archive-</code><code>tar</code><code>-minitar-0.5.2</code>
<code>Parsing documentation </code><code>for</code> <code>arr-pm-0.0.10</code>
<code>Installing ri documentation </code><code>for</code> <code>arr-pm-0.0.10</code>
<code>Parsing documentation </code><code>for</code> <code>backports-3.6.8</code>
<code>Installing ri documentation </code><code>for</code> <code>backports-3.6.8</code>
<code>Parsing documentation </code><code>for</code> <code>cabin-0.9.0</code>
<code>Installing ri documentation </code><code>for</code> <code>cabin-0.9.0</code>
<code>Parsing documentation </code><code>for</code> <code>childprocess-0.6.3.beta.1</code>
<code>Installing ri documentation </code><code>for</code> <code>childprocess-0.6.3.beta.1</code>
<code>Parsing documentation </code><code>for</code> <code>clamp-1.0.1</code>
<code>Installing ri documentation </code><code>for</code> <code>clamp-1.0.1</code>
<code>Parsing documentation </code><code>for</code> <code>dotenv-2.2.0</code>
<code>Installing ri documentation </code><code>for</code> <code>dotenv-2.2.0</code>
<code>Parsing documentation </code><code>for</code> <code>ffi-1.9.18</code>
<code>Installing ri documentation </code><code>for</code> <code>ffi-1.9.18</code>
<code>Parsing documentation </code><code>for</code> <code>fpm-1.8.1</code>
<code>Installing ri documentation </code><code>for</code> <code>fpm-1.8.1</code>
<code>Parsing documentation </code><code>for</code> <code>insist-1.0.0</code>
<code>Installing ri documentation </code><code>for</code> <code>insist-1.0.0</code>
<code>Parsing documentation </code><code>for</code> <code>io-like-0.3.0</code>
<code>Installing ri documentation </code><code>for</code> <code>io-like-0.3.0</code>
<code>Parsing documentation </code><code>for</code> <code>mustache-0.99.8</code>
<code>Installing ri documentation </code><code>for</code> <code>mustache-0.99.8</code>
<code>Parsing documentation </code><code>for</code> <code>pleaserun-0.0.28</code>
<code>Installing ri documentation </code><code>for</code> <code>pleaserun-0.0.28</code>
<code>Parsing documentation </code><code>for</code> <code>ruby-xz-0.2.3</code>
<code>Installing ri documentation </code><code>for</code> <code>ruby-xz-0.2.3</code>
<code>Parsing documentation </code><code>for</code> <code>stud-0.0.22</code>
<code>Installing ri documentation </code><code>for</code> <code>stud-0.0.22</code>
<code>Done installing documentation </code><code>for</code> <code>archive-</code><code>tar</code><code>-minitar, arr-pm, backports, cabin, childprocess, clamp, dotenv, ffi, fpm, insist, io-like, mustache, pleaserun, ruby-xz, stud after 8 seconds</code>
<code>15 gems installed</code>
<code>You have new mail </code><code>in</code> <code>/var/spool/mail/root</code>
二進制安裝幹淨的Mysql環境,二進制安裝速度很快:
#建立mysql資料存儲目錄
<code>mkdir</code> <code>/data/mysqldata</code>
#添加mysql使用者和mysql組
<code>groupadd -r mysql</code>
<code>useradd</code> <code>-g mysql -r -s </code><code>/sbin/nologin</code> <code>-M -d </code><code>/data/mysqldata</code> <code>mysql</code>
<code>chown</code> <code>-R mysql:mysql </code><code>/data/mysqldata</code>
#初始化Mysql安裝Mysql:
<a href="https://s5.51cto.com/wyfs02/M00/8F/26/wKioL1jU4ImQIOooAAGR5CiCLrA021.png" target="_blank"></a>
#建立mysql啟動腳本
<code>cp</code> <code>/data/mysql/support-files/mysql</code><code>.server </code><code>/etc/init</code><code>.d</code><code>/mysqld</code>
<code>chmod</code> <code>777 </code><code>/etc/init</code><code>.d</code><code>/mysqld</code>
#修改/etc/init.d/mysqld内容,内容如下:
<code>#basedir=/data/mysql</code>
<code>#datadir=/data/mysqldata</code>
#加入系統庫核系統變量
<code>ln</code> <code>-sv </code><code>/data/mysql/include</code> <code>/usr/include/mysql</code>
<code>echo</code> <code>'/data/mysql/lib'</code> <code>> </code><code>/etc/ld</code><code>.so.conf.d</code><code>/mysql</code><code>.conf</code>
<code>ldconfig</code>
<code>echo</code> <code>'export PATH=/data/mysql/bin/:$PATH'</code> <code>> </code><code>/etc/profile</code><code>.d</code><code>/mysql</code><code>.sh</code>
<code>source</code> <code>/etc/profile</code>
<code>service mysqld start</code>
如圖,安裝完成stopmysql服務,開始封裝Mysql rpm包:
<a href="https://s1.51cto.com/wyfs02/M02/8F/28/wKiom1jU4QqT_gd0AAEDuNj-wdE973.png" target="_blank"></a>
#開始封裝Mysql Rpm包:
<code>[root@localhost tmp]</code><code># fpm -s dir -t rpm -v 5.6.29 -n mysql --before-install /tmp/before.sh --after-install /tmp/after.sh --after-remove /tmp/remove.sh -d 'libaio' /data/mysql/ /data/mysqldata/ /etc/init.d/mysqld</code>
<code>Created package {:path=></code><code>"mysql-5.6.29-1.x86_64.rpm"</code><code>}</code>
如圖:
<a href="https://s4.51cto.com/wyfs02/M01/8F/28/wKiom1jU4lvyOtZqAABIb17cHsU224.png" target="_blank"></a>
封裝的時間較久
注意:運作腳本的參數一定要在封裝目錄之前,否則會報錯的。
Fpm的參數選項:
-n 自定義軟體包的名稱
-C fpm去哪個目錄搜尋檔案
-v 生成的rpm包的版本
-d 生成的rpm包依賴什麼軟體,通常為-d 'name' 或者-d 'name > version'
-a 系統架構名稱,如果是noarch則為'-a all'或者'-a native'
--description 軟體包的描述
--conflicts 與其他什麼軟體包沖突n
-f 第二次打包時目錄下如果有同名安裝包存在,則覆寫它
-p 輸出的安裝包的目錄,不想放在目前目錄下就需要指定
--post-install 軟體包安裝完成之後所要運作的腳本;同--after-install
--pre-install 軟體包安裝完成之前所要運作的腳本;同--before-install
--post-uninstall 軟體包解除安裝完成之後所要運作的腳本;同--after-remove
--pre-uninstall 軟體包解除安裝完成之前所要運作的腳本;同--before-remove
#安裝之前的要執行的腳本:
<a href="https://s5.51cto.com/wyfs02/M01/8F/26/wKioL1jU4czwXV91AABk8RIw5sc121.png" target="_blank"></a>
#安裝之後要執行的腳本:
<a href="https://s1.51cto.com/wyfs02/M02/8F/26/wKioL1jU4fPxFFvLAACJpAk79Yc336.png" target="_blank"></a>
#解除安裝Rpm包後要執行的腳本:
<a href="https://s3.51cto.com/wyfs02/M00/8F/26/wKioL1jU4iHwa9eEAABB6Fa9Kzw013.png" target="_blank"></a>
#cpoy到一台全新的機器測試:
<a href="https://s2.51cto.com/wyfs02/M00/8F/26/wKioL1jU4pzyv-yFAADtqV80EfM062.png" target="_blank"></a>
到此封裝制作完成,感興趣的朋友可以自己動手嘗試下。
本文轉自青衫解衣 51CTO部落格,原文連結:http://blog.51cto.com/215687833/1910102