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でシステムファイル消しちゃったなんてことがないように。
■必要なツールのインストール

■ビルド用ユーザになって環境準備。ディレクトリ、macro fileが作成される。

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

■SRPM用yumリポジトリ作成

パッケージ作成に必須ではないが、メジャーなrpmパッケージにどんなファイルが含まれているか見ておくと大変参考になる。
http://vault.centos.org で公開されている。OS ver等はよしなに修正
■RepositoryからのRPM/SRPMのダウンロード/展開方法
yumdownloaderでdownloadして、rpmcpioで展開する。

rpmパッケージ作成手順

■おおまかな流れ

  1. パッケージングするモノを準備する。
  2. Specfileを作成する。
  3. rpm buildでrpm packageを作成する。
1.パッケージするファイルを準備する
Shellscriptを3つほど準備した。package名/各ファイルとなるように準備しておく。
2.スペックファイルを書く
■specファイル基本ルール
・パッケージするソフトウェアの情報、インストール方法、設置方法などを記載するファイル
・#でコメント化することが可能
・spec fileでは変数マクロが使用可能、できるだけ使用することとドキュメントに記載あり。マクロ一覧は/usr/lib/rpm/macrosに記載されている。rpm –showrcで設定されている全てのマクロを表示できる。
※.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作業は必要なく、設定内容はかなりシンプルです。
3.rpm build実行

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


実行後にエラーなく終了するとRPMディレクトリ以下にrpm.fileが作成されているのがわかる。
debuginfoの使い方はここがわかりやすい。https://wtnb.mydns.jp/wordpress/archives/3853
 ■パッケージの確認
 以上です。
Bookmark this on Google Bookmarks
LINEで送る
Pocket