天天看點

輕松使用Fpm封裝制作Rpm包 --Linux

關于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 &gt;= 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 &amp;&amp; </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>&gt; </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>&gt; </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=&gt;</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 &gt; 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

繼續閱讀