Linux下RPMパッケージ作成プロセス

15979 ワード

開始前の準備
rpmbuildパッケージのインストール
  • yum-y install rpm-build生成関連ディレクトリ
  • rpm関連ディレクトリを生成するには、手動で作成するか、rpmbuildコマンドで作成できます.次のようになります.
    [root@yang data]# rpmbuild zabbix_agentd_ops.spec 
    error: File /root/rpmbuild/SOURCES/zabbix-3.0.3.tar.gz: No such file or directory
    
       ,    ,    rpmbuild        
    
    [root@yang ~]# tree rpmbuild/
    rpmbuild/
    ├── BUILD
    ├── BUILDROOT
    ├── RPMS
    ├── SOURCES
    ├── SPECS
    └── SRPMS
    

    SPECファイルの作成
    SPECキーワード
    Name:パッケージ名、後から%{name}で参照できます
    Summary:パッケージの内容概要
    Version:ソフトウェアの実際のバージョン番号、例えば:1.0.1など、後で%{version}参照を使用できます.
    Release:シーケンス番号をパブリッシュします.たとえば、1 linuxingなど、何回目のパッケージを明記します.後で%{release}参照を使用できます.
    Group:ソフトウェアグループ、標準グループの使用を推奨
    License:ソフトウェアライセンス方式、通常GPL
    Source:ソースパッケージは、Source 1、Source 2などのソースを複数持つことができ、後に%{source 1}、%{source 2}で参照することもできます
    BuildRoot:これはインストールまたはコンパイル時に使用される「仮想ディレクトリ」であり,マルチユーザ環境を考慮して,%{tmppath}/{name}-%{version}-%{release}-rootまたは%{tmppath}/%{name}-%{version}-%{release}-buildroot-%id_u} -n}.このパラメータはrpmを生成する過程でmake installを実行すると上記のパスにソフトウェアをインストールし、パッケージ化する際も「仮想ディレクトリ」に依存して「ルートディレクトリ」として操作するため重要である.$RPM_は後で使用できますBUILD_ROOT方式参照.
    URL:ソフトウェアのホームページ
    Vendor:RedFlag Co,Ltdなどの発行元またはパッケージ組織の情報
    Disstribution:リリースID
    Patch:パッチソース、Patch 1、Patch 2などを使用して複数のパッチを識別できます.%patch 0または%{patch 0}参照を使用します.
    Prefix:%{_prefix}これは主に,今後rpmパッケージをインストールする際に,必ずしもrpmにパッケージされたディレクトリにソフトウェアをインストールするとは限らない場合を解決するためである.これにより、rpmインストール時に位置を再指定する機能を実現するには、ここで識別を定義し、%installスクリプトを作成するときに参照する必要があります.
    Prefix:%{sysconfdir}この理由は上記と同様ですが、%{prefix}は/usrを指すため、他のファイル、例えば/etcの下のプロファイルでは%{_sysconfdir}で識別する必要があります.
    Build Arch:コンパイルされたターゲットプロセッサアーキテクチャを指し、noarch IDは指定されていませんが、通常は/usr/lib/rpm/marcrosの内容がデフォルトです.
    Requires:rpmパケットに依存するパッケージ名は、>=または<=で特定のバージョンより大きいまたは小さいことを表すことができます.たとえば、libpng-devel>=1.0.20 zlib※">="の両辺はスペースで区切らなければなりませんが、異なるソフトウェア名もスペースで区切られています.例えば、PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequiresなどはすべて異なる段階に対する依存指定である
    Provides:本ソフトウェアの特定の機能を特定し、他のrpmを識別する
    Packager:パッケージング者の情報
    %descriptionソフトウェアの詳細
    SPECスクリプト本体
    %prep前処理スクリプト
    %setup-n%{name}-%{version}**ソースパケットを解凍して置くのは通常/usr/src/asianux/SOURCESのパケットから/usr/src/asianux/BUILD/%{name}-%{version}に解凍します.一般に%setup-cでよいが,複数のソースパケットを同時にコンパイルする場合と,ソースのtarパケットの名前が解凍したディレクトリと一致しない場合の2つがある,−nパラメータを用いて指定する必要がある.
    %patchパッチは通常、ソースtarにパッチが一緒に適用されます.gzパッケージに、またはSOURCESディレクトリの下に配置します.一般的なパラメータは次のとおりです.
  • %patch-p 1は、前に定義されたPatchパッチを使用して行われ、-p 1はpatchを無視する第1層目
  • である.
  • %Patch2 -p1 -b xxx.patchは指定されたパッチを適用し、-bはバックアップファイル
  • を生成することを指す.
    補足
  • %setupはオプションを追加せず、パッケージのみを開きます. 
  • %setup-n newdirは、パッケージをnewdirディレクトリに解凍します. 
  • %setup-c解凍する前にディレクトリを生成します. 
  • %setup-b numはnum番目のsourceファイルを解凍します. 
  • %setup-T defaultの解凍操作は使用されません. 
  • %setup-T-b 0は、0番目のソースファイルを解凍します. 
  • %setup-c-n newdirディレクトリ名newdirを指定し、このディレクトリにrpmスイートを生成します. 
  • %patch最も簡単なパッチ方式で、patch levelを自動的に指定します. 
  • %patch 0は0番目のパッチファイルを使用します.%patchに相当しますか?p 0. 
  • %patch-sパッチ適用時の情報は表示されません. 
  • %patch-Tパッチ適用時に生成された出力ファイルをすべて削除します.

  • %configureこれはキーワードではなくrpm定義の標準マクロコマンドです.ソースコードのconfigure構成を実行し、/usr/src/asianux/BUILD/%{name}-%{version}ディレクトリで行い、標準書き方で/usr/lib/rpm/marcrosで定義したパラメータを参照することを意味します.もう1つの非標準的な書き方は、ソースコードのパラメータを参照してカスタマイズできます.たとえば、次のようになります.
      CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix}
    

     
    %buildはパッケージの構築を開始し、/usr/src/asianux/BUILD/%{name}-%{version}ディレクトリでmakeの作業を行います.
    %installは仮想ルートディレクトリにソフトウェアをインストールし始めました./usr/src/asianux/BUILD/%{name}-%{version}ディレクトリでmake installの操作を行います.これは重要です.ここのパスが間違っていると、下の%fileでファイルを探している間に失敗します.一般的な内容は次のとおりです.
  • %makeinstallこれはキーワードではなく、rpm定義の標準マクロコマンドです.非標準表記も使用できます:make DEstdIR=$RPM_BUILD_ROOT installまたは参照make prefix=$RPM_BUILD_ROOT install
  • で説明する必要があるのは、ここの%installは主に後の%fileサービスのためである.したがって、従来のシステムコマンド:install-d$RPM_を参照することもできます.BUILD_ROOT/およびcp-a*$RPM_BUILD_ROOT/

  • %clean一時ファイルのクリーンアップ
    %pre rpmインストール前に実行したスクリプト
    %post rpmインストール後に実行されるスクリプト
    %preun rpmアンインストール前に実行されたスクリプト
    %postun rpmアンインストール後に実行されるスクリプト
    %files定義ファイルまたはディレクトリはrpmに格納されます
    %defattr(-,root,root)**パッケージファイルのプロパティを指定します(mode,owner,group).-デフォルト値を表し、テキストファイルに対して0644、実行可能ファイルに対して0755
    %changelog変更ログ
    例:
    %define zabbix_user zabbix                    #    ,   zabbix_user  zabbix,%{zabbix_user}  
    Name:    zabbix                                #      ,    %{name}  
    Version:    3.0.3                            #        ,   %{version}  
    Release:    1%{?dist}                        #     ,           
    Summary:    zabbix_agentd                    #       
    
    Group:        zabbix                            #     
    License:    GPL                                #      
    URL:        www.yang.com                    #     
    Source0:    zabbix-3.0.3.tar.gz                #    ,   Source0,Source1  
    
    BuildRequires:        gcc, gcc-c++            #  rpm  ,       
    Requires:    gcc, gcc-c++, chkconfig            #  rpm  ,       
    
    %description                                #  rpm      
    Zabbix agentd 3.0.3
    
    %pre                                        #rpm         
    grep zabbix /etc/passwd > /dev/null
    if [ $? != 0 ] 
    then useradd zabbix -M -s /sbin/nologin
    fi
    [ -d /etc/zabbix   ]||rm -rf /etc/zabbix*
    
    
    %post                                        #rpm         
    sed -i "/^ServerActive=/c\ServerActive=172.30.17.35" /etc/zabbix/etc/zabbix_agentd.conf
    sed -i "/^Server=/c\Server=172.30.17.35" /etc/zabbix/etc/zabbix_agentd.conf
    sed -i "/Timeout=3/c\Timeout=30" /etc/zabbix/etc/zabbix_agentd.conf
    sed -i "/HostMetadata=/c\HostMetadata=PostgreSQL" /etc/zabbix/etc/zabbix_agentd.conf
    sed -i "/^Hostname=/c\Hostname=PostgreSQL" /etc/zabbix/etc/zabbix_agentd.conf
    echo "UnsafeUserParameters=1" >>/etc/zabbix/etc/zabbix_agentd.conf
    echo "EnableRemoteCommands=1" >>/etc/zabbix/etc/zabbix_agentd.conf
    echo "Include=/etc/zabbix/etc/zabbix_agentd.conf.d/*.conf" >>/etc/zabbix/etc/zabbix_agentd.conf
    chkconfig zabbix_agentd on
    
    %preun                                        #rpm        
    systemctl stop zabbix_agentd
    %postun                                        #rpm        
    userdel  zabbix
    rm -rf /etc/zabbix*
    %prep                                        #     
    %setup -q                                    #   cd     
    
    
    %build                                        #           
    ./configure --prefix=/etc/%{name}-%{version}   --enable-agent
    make -j16 %{?_smp_mflags}
    
    %install                                    #       ,       
    test -L %{buildroot}/etc/%{name} && rm -f %{buildroot}/etc/%{name}
    install -d %{buildroot}/etc/profile.d
    install -d %{buildroot}/etc/init.d
    make install DESTDIR=%{buildroot}
    echo 'export PATH=/etc/zabbix/bin:/etc/zabbix/sbin:$PATH' > %{buildroot}/etc/profile.d/%{name}.sh
    ln -sf /etc/%{name}-%{version}             %{buildroot}/etc/%{name}
    cp %{_buildrootdir}/postgresql.conf         %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/postgresql.conf
    cp %{_buildrootdir}/tcp_connections.sh      %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/tcp_connections.sh
    cp %{_buildrootdir}/iostat-collect.sh          %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-collect.sh 
    cp %{_buildrootdir}/iostat-parse.sh          %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-parse.sh
    cp %{_buildrootdir}/iostat-zabbix.conf      %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-zabbix.conf 
    cp %{_buildrootdir}/zabbix_agentd         %{buildroot}/etc/init.d/zabbix_agentd
    
    %files                                        #  rpm              。     %defattr (-,root,root)     。           ,   (mode,owner,group),-     ,      0644,      0755。
    /etc/%{name}
    /etc/%{name}-%{version}/*
    /etc/init.d/zabbix_agentd
    /etc/profile.d/%{name}.sh
    
    %changelog                                    #           。       
    %clean 
    rm -rf %{buildroot}                         #      
    

    RPMパッケージ作成拡張
    zabbixの起動制御スクリプトまたは他のプロファイルを追加する場合は、SOURCEの下に配置し、過去をコピーします.
  • 起動スクリプトをSOURCEディレクトリ
  • に配置する
          [root@yang ~/rpmbuild/SOURCES]# ll
          total 15116
          -rwxr-xr-x 1 root root      362 Aug  1 12:03 hostmonitor.conf
          -rwxr-xr-x 1 root root      505 Aug  1 12:03 iostat-collect.sh
          -rwxr-xr-x 1 root root      953 Aug  1 12:03 iostat-parse.sh
          -rw-r--r-- 1 root root      772 Aug  1 12:03 iostat-zabbix.conf
          -rwxr-xr-x 1 root root      813 Aug  1 12:03 nginx_monitor.sh
          -rw-r--r-- 1 root root    14868 Aug  1 12:03 postgresql.conf
          -rw-r--r-- 1 root root       77 Aug  1 12:03 process.discovery
          -rw-r--r-- 1 root root      552 Aug  1 12:03 redis_check.conf
          -rw-r--r-- 1 root root      356 Aug  1 12:03 redis_cluster_check.py
          -rw-r--r-- 1 root root      363 Aug  1 12:03 redis_multiport_check.py
          -rwxr-xr-x 1 root root      783 Aug  1 12:03 tcp_connections.sh
          -rw-r--r-- 1 root root      852 Aug  1 12:03 userparameter_nginx.conf
          -rw-r--r-- 1 root root      172 Aug  1 12:03 userparameter_process.conf
          -rw-r--r-- 1 root root 15407273 Jul 20 10:53 zabbix-3.0.3.tar.gz
          -rwxr-xr-x 1 root root     2182 Aug  1 12:03 zabbix_agentd
  • SPECファイルの編集
  • Source 0では、次のように増加しました:
  •         Source0:        zabbix-3.0.3.tar.gz
            Source1:        zabbix_agentd
            Source2:        nginx_monitor.sh
            Source3:        userparameter_nginx.conf
            Source4:        hostmonitor.conf
            Source5:        process.discovery
            Source6:        userparameter_process.conf
            Source7:        redis_check.conf
            Source8:        redis_cluster_check.py
            Source9:        redis_multiport_check.py
            Source10:       tcp_connections.sh
            Source11:       iostat-collect.sh
            Source12:       iostat-parse.sh
            Source13:       iostat-zabbix.conf
  • 取付領域は、下り:
  • のように増加する.
            make install DESTDIR=%{buildroot}
            install -p -D -m 0755 %{SOURCE1}        %{buildroot}/etc/init.d/zabbix_agentd
            install -p -D         %{SOURCE2}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/nginx_monitor.sh
            install -p -D         %{SOURCE3}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/userparameter_nginx.conf
            install -p -D         %{SOURCE4}        %{buildroot}/etc/nginx/conf.d/hostmonitor.conf
            install -p -D         %{SOURCE5}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/process.discovery
            install -p -D         %{SOURCE6}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/userparameter_process.conf
            install -p -D         %{SOURCE7}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_check.conf
            install -p -D         %{SOURCE8}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_cluster_check.py
            install -p -D         %{SOURCE9}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_multiport_check.py
            install -p -D         %{SOURCE10}       %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/tcp_connections.sh
            install -p -D         %{SOURCE11}       %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-collect.sh
            install -p -D         %{SOURCE12}       %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-parse.sh
            install -p -D         %{SOURCE13}       %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-zabbix.conf
  • %file領域増加例えば下り:
  •         %files
            %defattr (-,root,root,0755)
            /etc/%{name}
            /etc/%{name}-%{version}/*
            /etc/profile.d/%{name}.sh
            /etc/nginx/conf.d/hostmonitor.conf
            %attr(0755,root,root) /etc/rc.d/init.d/zabbix_agentd

    以下は完全なSPECファイルです.
    Name:    zabbix    
    Version:    3.0.3        
    Release:    1%{?dist}
    Summary:    zabbix_agentd
    
    Group:        zabbix
    License:    GPL
    URL:        www.yang.com
    Source0:    zabbix-3.0.3.tar.gz
    Source1:    zabbix_agentd
    Source2:    nginx_monitor.sh
    Source3:    userparameter_nginx.conf
    Source4:    hostmonitor.conf
    Source5:    process.discovery
    Source6:    userparameter_process.conf
    Source7:    redis_check.conf
    Source8:    redis_cluster_check.py
    Source9:    redis_multiport_check.py
    Source10:    tcp_connections.sh
    Source11:    iostat-collect.sh
    Source12:    iostat-parse.sh
    Source13:    iostat-zabbix.conf
    
    BuildRequires:        gcc, gcc-c++
    Requires:    gcc, gcc-c++, chkconfig
    
    %description
    Zabbix agentd 3.0.3
    
    %pre
    grep zabbix /etc/passwd > /dev/null
    if [ $? != 0 ] 
    then useradd zabbix -M -s /sbin/nologin
    fi
    [ -d /etc/zabbix   ]||rm -rf /etc/zabbix
    [ -d /etc/zabbix   ]||rm -rf /etc/zabbix-3.0.3
    
    
    %post
    sed -i "/^ServerActive=/c\ServerActive=172.30.17." /etc/zabbix/etc/zabbix_agentd.conf
    sed -i "/^Server=/c\Server=172.30.17." /etc/zabbix/etc/zabbix_agentd.conf
    sed -i "/Timeout=3/c\Timeout=30" /etc/zabbix/etc/zabbix_agentd.conf
    sed -i "/HostMetadata=/c\HostMetadata=OPS-TMP" /etc/zabbix/etc/zabbix_agentd.conf
    sed -i "/^Hostname=/c\Hostname=OPS-TMP" /etc/zabbix/etc/zabbix_agentd.conf
    echo "UnsafeUserParameters=1" >>/etc/zabbix/etc/zabbix_agentd.conf
    echo "EnableRemoteCommands=1" >>/etc/zabbix/etc/zabbix_agentd.conf
    echo "Include=/etc/zabbix/etc/zabbix_agentd.conf.d/*.conf" >>/etc/zabbix/etc/zabbix_agentd.conf
    chkconfig zabbix_agentd on
    
    %preun
    systemctl stop zabbix_agentd
    %postun
    userdel  zabbix
    rm -rf /etc/zabbix*
    %prep
    %setup -q
    
    
    %build
    ./configure --prefix=/etc/%{name}-%{version}   --enable-agent
    make -j16 %{?_smp_mflags}
    
    %install
    test -L %{buildroot}/etc/%{name} && rm -f %{buildroot}/etc/%{name}
    install -d %{buildroot}/etc/profile.d
    make install DESTDIR=%{buildroot}
    install -p -D -m 0755 %{SOURCE1}     %{buildroot}/etc/init.d/zabbix_agentd
    install -p -D         %{SOURCE2}     %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/nginx_monitor.sh
    install -p -D         %{SOURCE3}     %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/userparameter_nginx.conf
    install -p -D         %{SOURCE4}     %{buildroot}/etc/nginx/conf.d/hostmonitor.conf
    install -p -D         %{SOURCE5}     %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/process.discovery
    install -p -D         %{SOURCE6}     %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/userparameter_process.conf
    install -p -D         %{SOURCE7}     %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_check.conf
    install -p -D         %{SOURCE8}     %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_cluster_check.py
    install -p -D         %{SOURCE9}     %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_multiport_check.py
    install -p -D         %{SOURCE10}     %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/tcp_connections.sh
    install -p -D         %{SOURCE11}    %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-collect.sh
    install -p -D         %{SOURCE12}    %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-parse.sh
    install -p -D            %{SOURCE13}       %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-zabbix.conf
    
    echo 'export PATH=/etc/zabbix/bin:/etc/zabbix/sbin:$PATH' > %{buildroot}/etc/profile.d/%{name}.sh
    ln -sf /etc/%{name}-%{version}             %{buildroot}/etc/%{name}
    
    %files
    %defattr (-,root,root,0755)
    /etc/%{name}
    /etc/%{name}-%{version}/*
    /etc/profile.d/%{name}.sh
    /etc/nginx/conf.d/hostmonitor.conf
    %attr(0755,root,root) /etc/rc.d/init.d/zabbix_agentd
    %changelog
    %clean 
    rm -rf %{buildroot}