rpm package の概要と作成方法

rpmとは

RedHat社により開発されたパッケージ管理方式。
rpmを使用することで、すでにコンパイルされたバイナリ形式のプログラムを簡単に利用することができる。
 

rpmパッケージ管理のメリット

  1. 環境に合ったSource fileを探して、Downloadして、Buildして、installして、といった面倒な作業を省略できる。
  2. バージョン管理ができる、myscript_.sh.20160701.bkとか負債になりがちな管理をしなくて良くなる。
  3. バージョンアップやアンインストールの手順をrpmのお作法に乗っかることで共通化できる。手順なんか書かなくて良い。
  4. 依存関係を設定できる。予めインストールしてほしいソフトウェアを設定できる。
  5. yum serverに作成したrpmを設置すれば更に管理が快適になる。

 

作成に必要な基礎知識

ソースとバイナリのちがい

  • Source
    • ソフトウェアを人間(システム開発者)が作るときに使われる形式。内容が人間にとってわかりやすいように、それぞれの命令は英語や数学用語に似た言葉で表現され、メモやコメントなども入る。ソースをバイナリに変換する作業のことをコンパイルと呼ぶ。
  • Binary
    • 機械(計算機)が読み取って理解/実行できる形式。数字で表されるため、人間にとってはわかりにくい。

rpmファイル末尾の文字列の意味

名前 - バージョン - リリース . ディストリビューション . アーキテクチャ 
  • telnetの例:telnet-0.17-48.el6.x86_64
telnet
name
ソフトウェアの名前
0.17
version
ソフトウェアバージョン
48
release
リリース、ソフトウェアの内容に変更がなく、ビルド方法が変わる場合に増やすのが一般的
el6
distribution
ディストリビューションを示す番号。el5 => RedHat Enterprize Linux5の意らしい
x86_64
arch
対応するCPU/命令セットアーキテクチャ、i386、x86_64、noarch

rpmパッケージとsrpmパッケージの違い

  • rpmは含まれるプログラムがそのまま利用可能(バイナリ等になっている)なパッケージ。
  • srpmはrpmを作成可能なファイル(spec file, source file,patch fileとかの材料)が含まれるパッケージ。rpmファイルを自分で作成する必要がある。そのまま利用はできないファイルだがカスタマイズできる。

 

rpm package作成のための環境準備

■ビルド用一般ユーザを作成する。
一般ユーザでrpmbuildやるとシステムに損害を与える危険があるので、一般ユーザでやりましょう。buildでシステムファイル消しちゃったなんてことがないように。
useradd dev

■必要なツールのインストール

yum install rpm-build yum-utils yum install rpmdevtools
yum groupinstall 'Development tools'

 
■ビルド用ユーザになって環境準備。ディレクトリ、macro fileが作成される。
[dev@dev01 ~]$ rpmdev-setuptree
[dev@dev01 ~]$ tree
.
└── rpmbuild
    ├── BUILD
    ├── RPMS
    ├── SOURCES
    ├── SPECS
    └── SRPMS

 

メジャーなrpmをdownloadして中身を見る方法

■SRPM用yumリポジトリ作成

パッケージ作成に必須ではないが、メジャーなrpmパッケージにどんなファイルが含まれているか見ておくと大変参考になる。
http://vault.centos.org で公開されている。OS ver等はよしなに修正
[root@dev01 ~]# cat /etc/yum.repos.d/CentOS-SRPM.repo
[os-SRPM]
name=CentOS-6.6 - os SRPM
baseurl=http://vault.centos.org/6.6/os/Source/

[updates-SRPM]
name=CentOS-6.6 - updates SRPM
baseurl=http://vault.centos.org/6.6/updates/Source/

[extras-SRPM]
name=CentOS-6.6 - extras SRPM
baseurl=http://vault.centos.org/6.6/extras/Source/
■RepositoryからのRPM/SRPMのダウンロード/展開方法
yumdownloaderでdownloadして、rpmcpioで展開する。
[root@dev01 test]# yumdownloader httpd
[root@dev01 test]# rpm2cpio httpd-2.2.15-59.el6.centos.x86_64.rpm | cpio -di
6230 blocks
[root@dev01 test]# ls -l
合計 848
drwxr-xr-x 6 root root   4096  6月 25 02:10 2017 etc
-rw-r--r-- 1 root root 854072  3月 24 00:02 2017 httpd-2.2.15-59.el6.centos.x86_64.rpm
drwxr-xr-x 5 root root   4096  6月 25 02:10 2017 usr
drwxr-xr-x 7 root root   4096  6月 25 02:10 2017 var

rpmパッケージ作成手順

■おおまかな流れ

  1. パッケージングするモノを準備する。
  2. Specfileを作成する。
  3. rpm buildでrpm packageを作成する。

1.パッケージするファイルを準備する

Shellscriptを3つほど準備した。package名/各ファイルとなるように準備しておく。
[dev@dev01 rpmbuild]$ pwd
/home/dev/rpmbuild
//admintoolsという名前のパッケージ名ディレクトリ以下に3つお手製スクリプトファイルを準備した。
[dev@dev01 rpmbuild]$ ls -l SOURCES/
total 4
drwxrwxr-x 2 dev dev 4096 Feb  7 21:55 admintools
[dev@dev01 rpmbuild]$ ls -l SOURCES/admintools/
total 12
-rwx------ 1 dev dev 1783 Nov  7 21:48 change_ip
-rwx------ 1 dev dev  154 Feb  7 21:51 getvm
-rwx------ 1 dev dev  662 Nov  7 21:41 post_ip
 
//圧縮アーカイブする。
[dev@dev01 SOURCES]$ tar cvfz admintools-1.00.el6.noarch.tar.gz admintools
admintools/
admintools/change_ip
admintools/getvm
admintools/post_ip
[dev@dev01 SOURCES]$ ll
total 8
drwxrwxr-x 2 dev dev 4096 Feb  7 21:55 admintools
-rw-rw-r-- 1 dev dev 1338 Feb  7 22:08 admintools-1.00.el6.noarch.tar.gz
 
//圧縮元のファイル削除
[dev@dev01 SOURCES]$ rm -fr admintools
[dev@dev01 SOURCES]$ ls -l
total 4
-rw-rw-r-- 1 dev dev 1338 Feb  7 22:08 admintools-1.00.el6.noarch.tar.gz

2.スペックファイルを書く

■specファイル基本ルール
・パッケージするソフトウェアの情報、インストール方法、設置方法などを記載するファイル
・#でコメント化することが可能
・spec fileでは変数マクロが使用可能、できるだけ使用することとドキュメントに記載あり。マクロ一覧は/usr/lib/rpm/macrosに記載されている。rpm --showrcで設定されている全てのマクロを表示できる。
[dev@dev01 test]$ rpm --eval "%_tmppath"
/var/tmp
[dev@dev01 test]$ rpm --eval "%_bindir"
/usr/bin
※.specでファイルを作成しはじめると、勝手にテンプレ的なファイルが作成される。
[dev@dev01 test]$ pwd
/home/dev/test
 
[dev@dev01 test]$ ls
[dev@dev01 test]$ vi hoge.spec

 
 

サンプル等を参考に自分用のテンプレ的なものを作成しておくと捗りそうです。主要なパラメータは以下のとおり。

パラメータ
概要
記述サンプル
Summary:
packageの概要
rpm -qiとかで出てくるあれ。
Summary     : The client program for the Telnet remote login protocol
Name:
パッケージ名
Name: tree
Version:
バージョン。数字とピリオドの組み合わせで、通常3桁で指定(例: 3.45)
Version: 1.5.3
Release:
リリース
Release: 00
Release: 2%{?dist}
License:
ライセンス元
tagutagu-local
%description
パッケージの説明
Summaryよりも詳しいパッケージの解説
%description
The tree utility recursively displays the contents of directories in a
tree-like format.  Tree is basically a UNIX port of the DOS tree
utility.
%prep
Build作業の前の準備
 
%setup
%setup実行後(もしくは前)にcdするディレクトリ名を指定する。
省略したときは、 ${RPM_PACKAGE_NAME}-${RPM_PACKAGE_VERSION}
 
%build
ソースのビルドを行うセクション
%build
make CFLAGS="$RPM_OPT_FLAGS" "CPPFLAGS=$(getconf LFS_CFLAGS)" %{?_smp_mflags}
%install
ソースからのインストールを行うセクション
%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT%{_bindir}
 
make    BINDIR=$RPM_BUILD_ROOT%{_bindir} \
        MANDIR=$RPM_BUILD_ROOT%{_mandir}/man1 \
        install
 
chmod -x $RPM_BUILD_ROOT%{_mandir}/man1/tree.1
%check
ビルドされたバイナリが正常に動作するか検証する手順を行うセクション
 
%clean
パッケージ作成後の後始末を行うセクション
%clean
rm -rf $RPM_BUILD_ROOT
%files
rpmパッケージに含めるファイル名を列挙するセクション。
%files
 
%files tools
%defattr
filesに列挙するファイルのパーミッションやuser ID、group IDを設定する。以降に書いたfilesのファイル名に適用される。
%defattr(0775, root,root)
/usr/lib/hoge1
/usr/lib/hoge2
/usr/lib/hoge3
%attr
%filesに列挙するファイルのパーミッションやuser ID、group IDを設定する。 単体指定で使う。
%attr(755,root,root) /usr/lib/hoge
 
■サンプル
今回はシェルスクリプトなのでbuild作業は必要なく、設定内容はかなりシンプルです。
[dev@dev01 SPECS]$ cat adminhost.spec
Summary: admintools for servers
Name: adminhost
Version: 1.07
Release: 00
Group: System Environment/Tools
License: local
Packager: tagutagu
Vendor: local
Source: adminhost-1.07.el6.noarch.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-buildroot

Requires: parted
Requires: wget

%description
This tools is setting for lab virtual machine
* add_hostrecord => register record . for add Already created machine mac & hostname & mac.
* change_ip_old => don't use. too old.
* register_spec => Add spec of machine.
* start-hostsetup => configure network & hostname.also run "register_spec".

%prep
rm -rf ${RPM_BUILD_ROOT}

%setup -n adminhost

%build

%install
mkdir -p ${RPM_BUILD_ROOT}/root/bin
install -D -m 700 register_spec  	${RPM_BUILD_ROOT}/root/bin/register_spec
install -D -m 700 start-hostsetup 	${RPM_BUILD_ROOT}/root/bin/start-hostsetup
install -D -m 700 change_ip_old  	${RPM_BUILD_ROOT}/root/bin/change_ip_old
install -D -m 700 add_hostrecord  	${RPM_BUILD_ROOT}/root/bin/add_hostrecord
install -D -m 700 getvm  		${RPM_BUILD_ROOT}/root/bin/getvm

%clean
rm -rf ${RPM_BUILD_ROOT}

%files
%defattr(0775, root,root)
/root/bin/register_spec
/root/bin/start-hostsetup
/root/bin/change_ip_old
/root/bin/add_hostrecord
/root/bin/getvm

%changelog
* Sat Mar 11 2017 tagutagu - 1.0.6
- add enter.

* Sat Mar 11 2017 tagutagu - 1.0.6
- fix syntax error.

* Sat Mar 11 2017 tagutagu - 1.0.5
- change logic start-hostsetup.

* Mon Mar 05 2017 INDETAIL - 1.0.0
- First release

* Mon Mar 05 2017 tagutagu - 1.0.2
- add for add old machine record.

* Mon Mar 05 2017 tagutagu - 1.0.3
- add for add old machine record. error output is disabled.

* Mon Mar 05 2017 tagutagu - 1.0.4
- add getvm.

3.rpm build実行

rpmbuild -bbはバイナリのみの意 , -baで詳細な実行結果をデバッグできるので、failする場合に利用する。
http://kazmax.zpp.jp/cmd/r/rpmbuild.8.html

[dev@dev01 rpmbuild]$ tree
.
├── BUILD
├── BUILDROOT
├── RPMS
├── SOURCES
│   └── admintools-1.00.el6.noarch.tar.gz
├── SPECS
│   └── admintools.spec
└── SRPMS
 
 
[dev@dev01 rpmbuild]$ rpmbuild -bb SPECS/admintools.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.tvRFsz
+ umask 022
+ cd /home/dev/rpmbuild/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ rm -rf /home/dev/rpmbuild/BUILDROOT/admintools-1.00-00.x86_64
+ cd /home/dev/rpmbuild/BUILD
+ rm -rf admintools
+ /bin/tar -xvvf -
+ /usr/bin/gzip -dc /home/dev/rpmbuild/SOURCES/admintools-1.00.el6.noarch.tar.gz
drwxrwxr-x dev/dev           0 2017-02-07 21:55 admintools/
-rwx------ dev/dev        1783 2016-11-07 21:48 admintools/change_ip
-rwx------ dev/dev         154 2017-02-07 21:51 admintools/getvm
-rwx------ dev/dev         662 2016-11-07 21:41 admintools/post_ip
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd admintools
+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.hsweBi
+ umask 022
+ cd /home/dev/rpmbuild/BUILD
+ cd admintools
+ LANG=C
+ export LANG
+ unset DISPLAY
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.P83bK1
+ umask 022
+ cd /home/dev/rpmbuild/BUILD
+ '[' /home/dev/rpmbuild/BUILDROOT/admintools-1.00-00.x86_64 '!=' / ']'
+ rm -rf /home/dev/rpmbuild/BUILDROOT/admintools-1.00-00.x86_64
++ dirname /home/dev/rpmbuild/BUILDROOT/admintools-1.00-00.x86_64
+ mkdir -p /home/dev/rpmbuild/BUILDROOT
+ mkdir /home/dev/rpmbuild/BUILDROOT/admintools-1.00-00.x86_64
+ cd admintools
+ LANG=C
+ export LANG
+ unset DISPLAY
+ mkdir -p /home/dev/rpmbuild/BUILDROOT/admintools-1.00-00.x86_64/usr/local/sbin/
+ install -m 755 post_ip /home/dev/rpmbuild/BUILDROOT/admintools-1.00-00.x86_64/usr/local/sbin/
+ install -m 755 change_ip /home/dev/rpmbuild/BUILDROOT/admintools-1.00-00.x86_64/usr/local/sbin/
+ install -m 755 getvm /home/dev/rpmbuild/BUILDROOT/admintools-1.00-00.x86_64/usr/local/sbin/
+ /usr/lib/rpm/find-debuginfo.sh --strict-build-id /home/dev/rpmbuild/BUILD/admintools
+ /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-compress
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
Processing files: admintools-1.00-00.x86_64
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires: /bin/bash
Processing files: admintools-debuginfo-1.00-00.x86_64
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/dev/rpmbuild/BUILDROOT/admintools-1.00-00.x86_64
Wrote: /home/dev/rpmbuild/RPMS/x86_64/admintools-1.00-00.x86_64.rpm
Wrote: /home/dev/rpmbuild/RPMS/x86_64/admintools-debuginfo-1.00-00.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.OLaYne
+ umask 022
+ cd /home/dev/rpmbuild/BUILD
+ cd admintools
+ rm -rf /home/dev/rpmbuild/BUILDROOT/admintools-1.00-00.x86_64
+ exit 0

実行後にエラーなく終了するとRPMディレクトリ以下にrpm.fileが作成されているのがわかる。
debuginfoの使い方はここがわかりやすい。https://wtnb.mydns.jp/wordpress/archives/3853

//生成されたrpm fileを確認
[dev@dev01 rpmbuild]$ tree
--
├── BUILDROOT
├── RPMS
│   └── x86_64
│       ├── admintools-1.00-00.x86_64.rpm
│       └── admintools-debuginfo-1.00-00.x86_64.rpm
---

// install確認
[dev@dev01 rpmbuild]$ sudo rpm -ivh  RPMS/x86_64/admintools-1.00-00.x86_64.rpm
Preparing...                ########################################### [100%]
   1:admintools             ########################################### [100%]
[dev@dev01 rpmbuild]$ sudo rpm -ivh  RPMS/x86_64/admintools-debuginfo-1.00-00.x86_64.rpm
Preparing...                ########################################### [100%]
   1:admintools-debuginfo   ########################################### [100%]
 
[dev@dev01 rpmbuild]$ ll /usr/local/sbin/
total 12
-rwxr--r-- 1 root root 1783 Feb  7 22:47 change_ip
-rwxr--r-- 1 root root  154 Feb  7 22:47 getvm
-rwxr--r-- 1 root root  662 Feb  7 22:47 post_ip

 ■パッケージの確認

[dev@dev01 rpmbuild]$ rpm -qa | grep admin
admintools-debuginfo-1.00-00.x86_64
admintools-1.00-00.x86_64
 
[dev@dev01 rpmbuild]$ rpm -qi admintools
Name        : admintools                   Relocations: (not relocatable)
Version     : 1.00                              Vendor: tagutagu
Release     : 00                            Build Date: Tue 07 Feb 2017 10:47:47 PM JST
Install Date: Tue 07 Feb 2017 10:51:25 PM JST      Build Host: dev01.tagutagu.com
Group       : System Environment/Shells     Source RPM: admintools-1.00-00.src.rpm
Size        : 2599                             License: local
Signature   : (none)
Packager    : tagutagu-dev
Summary     : admintools for tagutagu-lab
Description :
This sripts is network-setup of first use for tagutagu_lab_VM.

 

 以上です。

Copyright © 2021 たぐたぐ.com. All rights reserved.