天天看點

使用rpm-build制作nginx的rpm包

一、RPM包的分類

RPM有五種基本的操作功能:安裝、解除安裝、更新、查詢和驗證。

linux軟體包分為兩大類:

(1)二進制類包,包括rpm安裝包(一般分為i386和x86等幾種)

(2)源碼類包,源碼包和開發包應該歸位此類(.src.rpm)。

有時候為了友善源碼包的安裝,和我們自己訂制軟體包的需求,我們會把一些源碼包按照我們的需求來做成rpm包,當有了源碼包就可以直接編譯得到二進制安裝包和其他任意包。spec file是制作rpm包最核心的部分,rpm包的制作就是根據spec file來實作的。在制作自定義rpm包的時候最好不要使用管理者進行,因為管理者權限過大,如果一個指令寫錯了,結果可能是災難性的,而制件一個rpm包普通使用者完全可以實作

二、修改宏及自定義工廠中的房間位置

在redhat下,rpm包的預設制作路徑在/usr/src/redhat下,這其中包含了6個目錄(要求全部大寫)

1

2

3

4

5

6

7

<code>Directory     Usage</code>

<code>BUILD        源代碼解壓以後放的位置,隻需提供BUILD目錄,具體裡面放什麼,不用我們管,是以真正的制作工廠中的房間是BUILD目錄</code>

<code>RPMS          制作完成後的rpm包存放目錄,為特定平台指定子目錄(i386,i686,ppc)</code>

<code>SOURCES       收集的源檔案,源材料,更新檔檔案等存放位置    </code>

<code>SPECS         存放spec檔案,作為制作rpm包的領崗檔案,以 rpm名.spec</code>

<code>SRPMS         src格式的rpm包位置 ,既然是src格式的包,就沒有平台的概念了           </code>

<code>BuiltRoot     假根,使用</code><code>install</code><code>臨時安裝到這個目錄,把這個目錄當作根來用的,是以在這個目錄下的目錄檔案,才是真正的目錄檔案。當打包完成後,在清理階段,這個目錄将被删除</code>

但centos并沒有該目錄,是以,我們不得不自定義工作工廠中的房間,即使在redhat下有該目錄,一般也是自定義到普通使用者的家目錄下的

rpmbuild --showrc 顯示所有的宏,以下劃線開頭,一個下劃線:定義環境的使用情況,二個下劃線:通常定義的是指令,為什麼要定義宏,因為不同的系統,指令的存放位置可能不同,是以通過宏的定義找到指令的真正存放位置

檢視預設工作工廠中的房間,是以隻要改變了這個宏,我們就可以自定義工作工廠中的房間了

8

9

<code>[root@localhost /]</code><code># rpmbuild --showrc | grep topdir</code>

<code>-14: _builddir %{_topdir}</code><code>/BUILD</code>

<code>-14: _buildrootdir %{_topdir}</code><code>/BUILDROOT</code>

<code>-14: _desktopdir   %{_datadir}</code><code>/applications</code>

<code>-14: _rpmdir   %{_topdir}</code><code>/RPMS</code>

<code>-14: _sourcedir    %{_topdir}</code><code>/SOURCES</code>

<code>-14: _specdir  %{_topdir}</code><code>/SPECS</code>

<code>-14: _srcrpmdir    %{_topdir}</code><code>/SRPMS</code>

<code>-14: _topdir   %{getenv:HOME}</code><code>/rpmbuild</code>

三、rpm包制作原理圖

四、制作rpm包

1、安裝rpm-build

<code># yum -y install rpm-build</code>

2、增加普通使用者并修改工作工廠中的房間目錄

<code># useradd hero</code>

<code># su - hero</code>

<code>$ vim ~/.rpmmacros</code>

<code>  </code><code>%_topdir        </code><code>/home/hero/rpmbuild</code>

<code># mkdir -pv ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS} </code>

<code># rpmbuild --showrc | grep _topdir    #會發現,工作工廠中的房間已然改變:_topdir    /home/hero/rpmbuild</code>

3、收集源碼檔案

(1)檔案清單

<code>[root@localhost SOURCES]</code><code># pwd</code>

<code>/home/hero/rpmbuild/SOURCES</code>

<code>[root@localhost SOURCES]</code><code># ls</code>

<code>fastcgi_params  init.nginx  nginx-1.7.7.</code><code>tar</code><code>.gz  nginx.conf</code>

(2)nginx-1.7.7.tar.gz 源碼包

<code>$ </code><code>cp</code> <code>/opt/src/nginx-1</code><code>.7.7.</code><code>tar</code><code>.gz </code><code>/home/hero/rpmbuild/SOURCES/</code>

(3)init.nginx 腳本檔案

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

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

<code>#!/bin/sh</code>

<code>#</code>

<code># nginx - this script starts and stops the nginx daemon</code>

<code># chkconfig:   - 85 15</code>

<code># description:  Nginx is an HTTP(S) server, HTTP(S) reverse \</code>

<code>#               proxy and IMAP/POP3 proxy server</code>

<code># processname: nginx</code>

<code>## config:      /etc/nginx/nginx.conf</code>

<code># config:      /usr/local/nginx/conf/nginx.conf</code>

<code># config:      /etc/sysconfig/nginx</code>

<code>## pidfile:     /var/run/nginx/nginx.pid</code>

<code># pidfile:     /usr/local/nginx/logs/nginx.pid</code>

<code># Source function library.</code>

<code>. </code><code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/functions</code>

<code># Source networking configuration.</code>

<code>. </code><code>/etc/sysconfig/network</code>

<code># Check that networking is up.</code>

<code>[ </code><code>"$NETWORKING"</code> <code>= </code><code>"no"</code> <code>] &amp;&amp; </code><code>exit</code> <code>0</code>

<code>nginx=</code><code>"/usr/local/nginx/sbin/nginx"</code>

<code>prog=$(</code><code>basename</code> <code>$nginx)</code>

<code>#NGINX_CONF_FILE="/etc/nginx/nginx.conf"</code>

<code>NGINX_CONF_FILE=</code><code>"/usr/local/nginx/conf/nginx.conf"</code>

<code>[ -f </code><code>/etc/sysconfig/nginx</code> <code>] &amp;&amp; . </code><code>/etc/sysconfig/nginx</code>

<code>lockfile=</code><code>/var/lock/subsys/nginx</code>

<code>make_dirs() {</code>

<code>   </code><code># make required directories</code>

<code>   </code><code>user=`nginx -V 2&gt;&amp;1 | </code><code>grep</code> <code>"configure arguments:"</code> <code>| </code><code>sed</code> <code>'s/[^*]*--user=\([^ ]*\).*/\1/g'</code> <code>-`</code>

<code>   </code><code>options=`$nginx -V 2&gt;&amp;1 | </code><code>grep</code> <code>'configure arguments:'</code><code>`</code>

<code>   </code><code>for</code> <code>opt </code><code>in</code> <code>$options; </code><code>do</code>

<code>       </code><code>if</code> <code>[ `</code><code>echo</code> <code>$opt | </code><code>grep</code> <code>'.*-temp-path'</code><code>` ]; </code><code>then</code>

<code>           </code><code>value=`</code><code>echo</code> <code>$opt | </code><code>cut</code> <code>-d </code><code>"="</code> <code>-f 2`</code>

<code>           </code><code>if</code> <code>[ ! -d </code><code>"$value"</code> <code>]; </code><code>then</code>

<code>               </code><code># echo "creating" $value</code>

<code>               </code><code>mkdir</code> <code>-p $value &amp;&amp; </code><code>chown</code> <code>-R $user $value</code>

<code>           </code><code>fi</code>

<code>       </code><code>fi</code>

<code>   </code><code>done</code>

<code>}</code>

<code>start() {</code>

<code>    </code><code>[ -x $nginx ] || </code><code>exit</code> <code>5</code>

<code>    </code><code>[ -f $NGINX_CONF_FILE ] || </code><code>exit</code> <code>6</code>

<code>    </code><code>make_dirs</code>

<code>    </code><code>echo</code> <code>-n $</code><code>"Starting $prog: "</code>

<code>    </code><code>daemon $nginx -c $NGINX_CONF_FILE</code>

<code>    </code><code>retval=$?</code>

<code>    </code><code>echo</code>

<code>    </code><code>[ $retval -</code><code>eq</code> <code>0 ] &amp;&amp; </code><code>touch</code> <code>$lockfile</code>

<code>    </code><code>return</code> <code>$retval</code>

<code>stop() {</code>

<code>    </code><code>echo</code> <code>-n $</code><code>"Stopping $prog: "</code>

<code>    </code><code>killproc $prog -QUIT</code>

<code>    </code><code>[ $retval -</code><code>eq</code> <code>0 ] &amp;&amp; </code><code>rm</code> <code>-f $lockfile</code>

<code>restart() {</code>

<code>    </code><code>configtest || </code><code>return</code> <code>$?</code>

<code>    </code><code>stop</code>

<code>    </code><code>sleep</code> <code>1</code>

<code>    </code><code>start</code>

<code>reload() {</code>

<code>    </code><code>echo</code> <code>-n $</code><code>"Reloading $prog: "</code>

<code>    </code><code>killproc $nginx -HUP</code>

<code>    </code><code>RETVAL=$?</code>

<code>force_reload() {</code>

<code>    </code><code>restart</code>

<code>configtest() {</code>

<code>  </code><code>$nginx -t -c $NGINX_CONF_FILE</code>

<code>rh_status() {</code>

<code>    </code><code>status $prog</code>

<code>rh_status_q() {</code>

<code>    </code><code>rh_status &gt;</code><code>/dev/null</code> <code>2&gt;&amp;1</code>

<code>case</code> <code>"$1"</code> <code>in</code>

<code>    </code><code>start)</code>

<code>        </code><code>rh_status_q &amp;&amp; </code><code>exit</code> <code>0</code>

<code>        </code><code>$1</code>

<code>        </code><code>;;</code>

<code>    </code><code>stop)</code>

<code>        </code><code>rh_status_q || </code><code>exit</code> <code>0</code>

<code>    </code><code>restart|configtest)</code>

<code>    </code><code>reload)</code>

<code>        </code><code>rh_status_q || </code><code>exit</code> <code>7</code>

<code>    </code><code>force-reload)</code>

<code>        </code><code>force_reload</code>

<code>    </code><code>status)</code>

<code>        </code><code>rh_status</code>

<code>    </code><code>condrestart|try-restart)</code>

<code>            </code><code>;;</code>

<code>    </code><code>*)</code>

<code>        </code><code>echo</code> <code>$</code><code>"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"</code>

<code>        </code><code>exit</code> <code>2</code>

<code>esac</code>

(4)fastcgi_params 參數

<code>fastcgi_param  GATEWAY_INTERFACE  CGI</code><code>/1</code><code>.1;</code>

<code>fastcgi_param  SERVER_SOFTWARE    nginx;</code>

<code>fastcgi_param  QUERY_STRING       $query_string;</code>

<code>fastcgi_param  REQUEST_METHOD     $request_method;</code>

<code>fastcgi_param  CONTENT_TYPE       $content_type;</code>

<code>fastcgi_param  CONTENT_LENGTH     $content_length;</code>

<code>fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;</code>

<code>fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;</code>

<code>fastcgi_param  REQUEST_URI        $request_uri;</code>

<code>fastcgi_param  DOCUMENT_URI       $document_uri;</code>

<code>fastcgi_param  DOCUMENT_ROOT      $document_root;</code>

<code>fastcgi_param  SERVER_PROTOCOL    $server_protocol;</code>

<code>fastcgi_param  REMOTE_ADDR        $remote_addr;</code>

<code>fastcgi_param  REMOTE_PORT        $remote_port;</code>

<code>fastcgi_param  SERVER_ADDR        $server_addr;</code>

<code>fastcgi_param  SERVER_PORT        $server_port;</code>

<code>fastcgi_param  SERVER_NAME        $server_name;</code>

4、在 SPECS 目錄下建立 nginx.spec

113

114

115

116

117

118

119

120

121

122

123

124

125

126

<code>$ </code><code>cd</code> <code>rpmbuild</code><code>/SPECS/</code>

<code>$ vim nginx.spec     </code><code>#此時,裡面就是一個模闆,直接填就可以了</code>

<code>### 1.The introduction section </code>

<code>Name: nginx          </code><code># 軟體包名稱</code>

<code>Version: 1.7.7       </code><code># 版本号,(不能使用-)</code>

<code>Release: 3%{?dist}   </code><code># release号,對應下面的changelog,如 nginx-1.7.7-3.el6.x86_64.rpm</code>

<code>Summary: nginx-1.7.7.</code><code>tar</code><code>.gz to nginx-1.7.7.rpm   </code><code># 簡要描述資訊,最好不要超過50個字元,如要詳述,使用下面的%description</code>

<code>Group: Applications</code><code>/Archiving</code>      <code># 要全用這裡面的一個組:less /usr/share/doc/rpm-version/GROUPS</code>

<code>License: GPLv2                     </code><code># 一定帶上(最好是對方源碼包的License)BSD,GPL,GPLv2</code>

<code>URL: http:</code><code>//nmshuishui</code><code>.blog.51cto.com/</code>

<code>Packager: nmshuishui &lt;[email protected]&gt;</code>

<code>Vendor: nmshuishui</code>

<code>Source0: %{name}-%{version}.</code><code>tar</code><code>.gz     </code><code># source主要是引用一下自己定義好的腳本,配置檔案之類的内容。</code>

<code>Source1: init.nginx                    </code><code># nginx在主配置檔案裡面做了很多優化,包括cpu搶占,各種緩存政策,tcp,程序數等。</code>

<code>Source2: nginx.conf                    </code><code># 每增加一個 Source ,都需要在 %install 段和 %files 段做相應配置,如果是啟動腳本的話,最好在腳本段配置一下</code>

<code>Source3: fastcgi_params</code>

<code>BuildRoot: %_topdir</code><code>/BUILDROOT</code> 

<code>BuildRequires: gcc</code>

<code>Requires: openssl,openssl-devel,pcre-devel,pcre  </code><code># 定義nginx依賴的包,需要yum安裝</code>

<code>%description              </code><code># 軟體包詳述</code>

<code>Custom a rpm by yourself!Build nginx-1.7.7.</code><code>tar</code><code>.gz to nginx-1.7.7.rpm</code>

<code>###  2.The Prep section 準備階段,主要就是把源碼包解壓到build目錄下,設定一下環境變量,并cd進去</code>

<code>%prep </code>

<code>%setup -q    </code><code># 這個宏的作用靜默模式解壓并cd </code>

<code>###  3.The Build Section 編譯制作階段,這一節主要用于編譯源碼</code>

<code>%build</code>

<code>%configure          </code><code>#在 RMP 建立時候, 由于 nginx 不按照正常定義, 不可以定義 %{_prefix} 之類參數, 也不可以使用 %configure 這個參數進行 rpm 編譯  </code>

<code>                    </code><code>#一旦定義該參數, 會導緻編譯自動增加下面參數, 導緻報錯</code>

<code>                    </code><code># + ./configure --build=x86_64-redhat-linux-gnu --host=x86_64-redhat-linux-gnu --target=x86_64-redhat-linux-gnu --program-prefix=</code>

<code>                    </code><code>#是以,這裡需要 ./configure,且需把%configure删掉</code>

<code>                    </code><code>#而且這裡需要安裝 pcre-devel包,如果沒有的話,會提示關于pcre的錯誤,直接安裝此包就可以了</code>

<code>.</code><code>/configure</code> <code>\</code>

<code>--prefix=</code><code>/usr/local/nginx</code> <code>\</code>

<code>--user=www \</code>

<code>--group=www \</code>

<code>--with-http_ssl_module \</code>

<code>--with-http_flv_module \</code>

<code>--with-http_stub_status_module \</code>

<code>--with-http_gzip_static_module \</code>

<code>--http-client-body-temp-path=</code><code>/var/tmp/nginx/client/</code> <code>\</code>

<code>--http-proxy-temp-path=</code><code>/var/tmp/nginx/proxy/</code> <code>\</code>

<code>--http-fastcgi-temp-path=</code><code>/var/tmp/nginx/fcgi/</code> <code>\</code>

<code>--http-uwsgi-temp-path=</code><code>/var/tmp/nginx/uwsgi</code> <code>\</code>

<code>--http-scgi-temp-path=</code><code>/var/tmp/nginx/scgi</code> <code>\</code>

<code>--with-pcre</code>

<code>make</code> <code>%{?_smp_mflags}            </code><code># make後面的意思是:如果就多處理器的話make時并行編譯 </code>

<code>###  4.Install section  這一節主要用于完成實際安裝軟體必須執行的指令,可包含4種類型腳本</code>

<code>%</code><code>install</code>

<code>rm</code> <code>-rf %{buildroot}</code>

<code>make</code> <code>install</code> <code>DESTDIR=%{buildroot}</code>

<code>%{__install} -p -D -m 0755 %{SOURCE1} %{buildroot}</code><code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/nginx</code>

<code>%{__install} -p -D %{SOURCE2} %{buildroot}</code><code>/usr/local/nginx/conf/nginx</code><code>.conf</code>

<code>%{__install} -p -D %{SOURCE3} %{buildroot}</code><code>/usr/local/nginx/conf/fastcgi_params</code>

<code>%pre</code>

<code>if</code> <code>[ $1 == 1 ];</code><code>then</code>                                                         <code># $1有3個值,代表動作,安裝類型,處理類型</code>

<code>        </code><code>/usr/sbin/useradd</code> <code>-r www -s </code><code>/sbin/nologin</code> <code>2&gt; </code><code>/dev/null</code>              <code># 1:表示安裝</code>

<code>fi</code>                                                                          <code># 2:表示更新      </code>

<code>                                                                            </code><code># 0:表示解除安裝</code>

<code>%post</code>

<code>if</code> <code>[ $1 == 1 ];</code><code>then</code>

<code>        </code><code>/sbin/chkconfig</code> <code>--add %{name}</code>

<code>        </code><code>/sbin/chkconfig</code> <code>%{name} on</code>

<code>        </code><code>echo</code> <code>'</code><code># Add  #下面主要是核心參數的優化,包括tcp的快速釋放和重利用等。   </code>

<code>net.ipv4.tcp_max_syn_backlog = 65536</code>

<code>net.core.netdev_max_backlog =  32768</code>

<code>net.core.somaxconn = 32768</code>

<code> </code> 

<code>net.core.wmem_default = 8388608</code>

<code>net.core.rmem_default = 8388608</code>

<code>net.core.rmem_max = 16777216</code>

<code>net.core.wmem_max = 16777216</code>

<code>net.ipv4.tcp_timestamps = 0</code>

<code>net.ipv4.tcp_synack_retries = 2</code>

<code>net.ipv4.tcp_syn_retries = 2</code>

<code>net.ipv4.tcp_tw_recycle = 1</code>

<code>net.ipv4.tcp_tw_reuse = 1</code>

<code>net.ipv4.tcp_mem = 94500000 915000000927000000</code>

<code>net.ipv4.tcp_max_orphans = 3276800</code>

<code>#net.ipv4.tcp_fin_timeout = 30</code>

<code>#net.ipv4.tcp_keepalive_time = 120</code>

<code>net.ipv4.ip_local_port_range = 1024  65535' &gt;&gt; </code><code>/etc/sysctl</code><code>.conf</code>

<code>sysctl -p 2&gt;&amp;1 </code><code>/dev/null</code>

<code>fi</code>

<code>%preun</code>

<code>if</code> <code>[ $1 == 0 ];</code><code>then</code>

<code>        </code><code>/usr/sbin/userdel</code> <code>-r www 2&gt; </code><code>/dev/null</code>

<code>        </code><code>/etc/init</code><code>.d</code><code>/nginx</code> <code>stop &gt; </code><code>/dev/null</code> <code>2&gt;&amp;1</code>

<code>%postun</code>

<code>###  5.clean section 清理段,clean的主要作用就是删除BUILD</code>

<code>%clean</code>

<code>###  6.file section 檔案清單段,這個階段是把前面已經編譯好的内容要打包了,其中exclude是指要排除什麼不打包進來。</code>

<code>%files              </code>

<code>%defattr(-,root,root,0755)</code>

<code>/usr/local/nginx/</code>

<code>%attr(0755,root,root) </code><code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/nginx</code>

<code>%config(noreplace) </code><code>/usr/local/nginx/conf/nginx</code><code>.conf</code>

<code>%config(noreplace) </code><code>/usr/local/nginx/conf/fastcgi_params</code>

<code>###  7.chagelog section  日志改變段, 這一段主要描述軟體的開發記錄</code>

<code>%changelog</code>

<code>*  Thu Wed 26 2014 nmshuishui &lt;[email protected]&gt; - 1.7.7-3</code>

<code>- Initial version</code>

5、制作rpm包

<code>rpmbuild -bp nginx.spec 制作到%prep段</code>

<code>rpmbuild -</code><code>bc</code> <code>nginx.spec 制作到%build段</code>

<code>rpmbuild -bi nginx.spec 執行 spec 檔案的 </code><code>"%install"</code> <code>階段 (在執行了 %prep 和 %build 階段之後)。這通常等價于執行了一次 </code><code>"make install"</code>

<code>rpmbuild -bb nginx.spec 制作二進制包</code>

<code>rpmbuild -ba nginx.spec 表示既制作二進制包又制作src格式包</code>

五、rpm包的簽名

1、查詢軟體包資訊

<code>[root@localhost ~]</code><code># rpm -qi nginx</code>

<code>Name        : nginx                        Relocations: (not relocatable)</code>

<code>Version     : 1.7.7                             Vendor: nmshuishui</code>

<code>Release     : 3.el6                         Build Date: Wed 26 Nov 2014 06:39:00 PM CST</code>

<code>Install Date: Wed 26 Nov 2014 06:42:19 PM CST      Build Host: localhost</code>

<code>Group       : Applications</code><code>/Archiving</code>        <code>Source RPM: nginx-1.7.7-3.el6.src.rpm</code>

<code>Size        : 793593                           License: GPLv2</code>

<code>Signature   : (none)    </code><code># rpm包未簽名狀态</code>

<code>Packager    : nmshuishui &lt;[email protected]&gt;</code>

<code>URL         : http:</code><code>//nmshuishui</code><code>.blog.51cto.com/</code>

<code>Summary     : nginx-1.7.7.</code><code>tar</code><code>.gz to nginx-1.7.7.rpm</code>

<code>Description :</code>

2、使用gpg方式生成簽名密鑰

<code>[root@localhost ~]</code><code># gpg --gen-key</code>

<code>Your selection?1&lt;Enter&gt;  </code><code>#預設即可</code>

<code>What keysize </code><code>do</code> <code>you want? (2048) 1024&lt;Enter&gt;  </code><code>#選擇密鑰長度</code>

<code>Key is valid </code><code>for</code><code>? (0) 1y&lt;Enter&gt;  </code><code>#有效期</code>

<code>Is this correct? (y</code><code>/N</code><code>) y&lt;Enter&gt;  </code><code>#确認</code>

<code>Real name: nmshuishui&lt;Enter&gt;  </code><code>#密鑰名稱</code>

<code>Email address: [email protected]&lt;Enter&gt;  </code><code>#郵件</code>

<code>Comment: GPG-RPM-KEY&lt;Enter&gt;  </code><code>#備注</code>

<code>Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O&lt;ENTER&gt; </code><code>#okay确認</code>

<code>Enter passphrase  OK &lt;Enter&gt;  </code><code>#按Enter輸入密碼                    </code>

<code>&lt;Take this one anyway&gt; &lt;Enter&gt; </code><code>#确認使用此密碼</code>

<code>#####</code>

<code>在生成密鑰的時候,會報這麼一個資訊:can</code><code>'t connect to `/root/.gnupg/S.gpg-agent'</code><code>: No such </code><code>file</code> <code>or directory,可以不用理會它。</code>

<code>接下來就是一些随機數的說明了:We need to generate a lot of random bytes. It is a good idea to perform</code>

<code>some other action (</code><code>type</code> <code>on the keyboard, move the mouse, utilize the</code>

<code>disks) during the prime generation; this gives the random number</code>

<code>generator a better chance to gain enough entropy.</code>

<code>就狂敲鍵盤和移動滑鼠吧,也可以連結一個僞随機數(不過不安全),接下來的活兒就是等了</code>

<code>生成密鑰後會是這樣的:</code>

<code>gpg: checking the trustdb</code>

<code>gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model</code>

<code>gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u</code>

<code>pub   2048R</code><code>/DF63EDFB</code> <code>2014-11-26</code>

<code>      </code><code>Key fingerprint = 338D 476F 29C9 E2D6 6604  1D96 6F73 1E81 DF63 EDFB</code>

<code>uid                  nmshuishui (gen-key) &lt;[email protected]&gt;</code>

<code>sub   2048R</code><code>/263FB359</code> <code>2014-11-26</code>

3、檢視生成的密鑰

<code>[root@localhost ~]</code><code># gpg --list-keys</code>

<code>/root/</code><code>.gnupg</code><code>/pubring</code><code>.gpg</code>

<code>------------------------</code>

4、導出公鑰以供驗證

<code>[root@localhost ~]</code><code># gpg --export -a "nmshuishui" &gt; RPM-GPG-KEY-nmshuishui</code>

5、在~/.rpmmacros宏中定義加密密鑰

<code>[root@localhost ~]</code><code># vim ~/.rpmmacros</code>

<code>%_gpg_name nmshuishui</code>

6、為rpm包簽名

<code>[root@localhost ~]</code><code># rpm --addsign /home/hero/rpmbuild/RPMS/x86_64/nginx-1.7.7-3.el6.x86_64.rpm </code>

<code>Enter pass phrase: </code>

<code>Pass phrase is good.</code>

<code>/home/hero/rpmbuild/RPMS/x86_64/nginx-1</code><code>.7.7-3.el6.x86_64.rpm:</code>

7、将公鑰導入rpm包

<code>[root@localhost ~]</code><code># rpm --import RPM-GPG-KEY-nmshuishui</code>

8、驗證

<code>[root@localhost ~]</code><code># rpm --checksig /home/hero/rpmbuild/RPMS/x86_64/nginx-1.7.7-3.el6.x86_64.rpm</code>

<code>/home/hero/rpmbuild/RPMS/x86_64/nginx-1</code><code>.7.7-3.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK</code>

9、重新安裝nginx,驗證安裝包的簽名資訊

<code>[root@localhost ~]</code><code># rpm -ivh /home/hero/rpmbuild/RPMS/x86_64/nginx-1.7.7-3.el6.x86_64.rpm </code>

<code>Preparing...                </code><code>########################################### [100%]</code>

<code>   </code><code>1:nginx                  </code><code>########################################### [100%]</code>

<code>[root@localhost ~]</code><code># </code>

<code>Install Date: Thu 27 Nov 2014 10:58:44 AM CST      Build Host: localhost</code>

<code>Signature   : RSA</code><code>/SHA1</code><code>, Thu 27 Nov 2014 10:40:02 AM CST, Key ID 6f731e81df63edfb   </code><code># 與 1 比起來,多了簽名資訊</code>

到這裡,一個完整的 rpm 包就制作完成了!

本文轉自 nmshuishui 51CTO部落格,原文連結:http://blog.51cto.com/nmshuishui/1583117,如需轉載請自行聯系原作者

繼續閱讀