RPMパッケージング: はじめてのRPMを作成するための簡単なガイド

この記事はRed Hat DeveloperRPM packaging: A simplified guide to creating your first RPM を、許可をうけて翻訳したものです。


f:id:mrwk:20190618185628p:plain

RPMパッケージングのコンセプトは、初めての人にとっては学ぶべきことが非常に多い印象をうけ、圧倒的されてしまうかもしれません。 この記事では、最小限の知識と経験でRPMを構築することが可能であることを実際に見ていきます。 この記事は出発点として提供しているもので、RPMパッケージ化の完全なガイドではありません。

ASCIIベースのテトリスゲーム

このデモでは、Cで書かれた簡単なASCIIベースのテトリスゲームを選びました、そして比較的簡単なRPMビルドとするためにわずかに調整をします。この記事ではダウンロード可能な例としてVitetrisと呼ばれるゲームを使います。

root以外のユーザーがRPMを構築できるようにするために、RPMパッケージの作成時にエラーが発生しないように、ファイルのオーナーをrootに変更するMakefile内の指定を削除します。 この修正は以下の箇所です。

$ cat Makefile |grep 'INSTALL '
INSTALL = install
#INSTALL = install -oroot -groot # rpmをビルドしている非rootユーザーでは不可能なため、RPMビルドが失敗します。 

この変更を加えたら、tarボールを同じ名前( vitetris-0.57.tar.gz )で作成します。

環境を整える

Red Hat Enterprise Linux (RHEL)7システム上に開発環境をインストールし、RPMをビルドするためには以下のリポジトリが必要です: rhel-7-server-rpmsrhel-7-server-extras-rpmsrhel-7-server-optional-rpms

以下のパッケージをインストールする必要があります:

# yum install -y rpm* gcc gpg* rng-tools 

インストール時に覚えておくべきことを減らすためrpm*gpg*とワイルドカードを使用しています。

ソフトウェアを手動でコンパイルする

RPMパッケージ作成を成功させるために大切なことは、対象のソフトウェアを理解することです。 まず、ソフトウェアを手動で(できれば、非rootユーザで)コンパイルします。 この例では、 rpmbuilder ユーザーを使用しています。

tarボール( vitetris-0.57.tar.gz )を展開してからREADMEファイルを調べます。 この場合、READMEファイルには、ソースコードからゲームをコンパイルすることに関する情報は含まれていません。 一般的には、Cで書かれたオープンソースソフトウェアは、 configuremakemake install の3つのステップでコンパイルできます。 しかし、make単独でソフトウェアがビルドされるかどうかを試してみる価値はあります。

非rootユーザーとして、 makeの実行だけで十分かどうかテストします。

[rpmbuilder@rpm vitetris-0.57]$ make
generating src/src-conf.mk
./src-conf.sh 'cc' '' ''
...
Done.
Now run ./tetris (or make install)

ゲームをテストするには、単に ./tetris を実行して、ゲームがロードされてプレイできるかどうかを確認します。

ソースコードからビルドした後にTetrisを実行する

GPGキーを作成する

RPMパッケージに署名することでパッケージにさらなる信頼の層を追加します。 rpmbuilderユーザーとしてGPGキーを作成するには、 rngdを実行する(生成プロセスを高速化する)ためにrootアクセス権を持つセッションと、 rpmbuilder ユーザーとしてX11転送を行うセッションが必要になります。

以下をrootとして実行します。

# rngd -r /dev/urandom

次のエラーが発生した場合は

Failed to init entropy source 2: Intel RDRAND Instruction RNG

以下を試してください:

# rngd -r /dev/urandom -o /dev/random -f

X11転送を使用してrpmbuilderユーザーとしてホストにログインします(鍵の生成に必要です)。

$ gpg --gen-key
...
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 
Requested keysize is 2048 bits
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 
Key does not expire at all
Is this correct? (y/N) y

GnuPG needs to construct a user ID to identify your key.

Real name: RPM Build User
Email address: rpmbuilder@rpm
Comment: RPM Builder GPG Signing Key
You selected this USER-ID:
"RPM Build User (RPM Builder GPG Signing Key) <rpmbuilder@rpm>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key.

X11転送を有効にしている場合に表示されるプロンプト このプロンプトは、X11転送がオンになっている場合にのみ表示されます。

...
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
pub 2048R/EEF6D9AD 2019-03-02
Key fingerprint = 6ED1 2456 B7ED EEC6 D0DF B870 444A 40A7 EEF6 D9AD
uid RPM Build User (RPM Builder GPG Signing Key) <rpmbuilder@rpm>
sub 2048R/D498F883 2019-03-02

カスタムソフトウェア用のRed Hat Satelliteまたはyumリポジトリ設定で使用するためにキーをエクスポートする必要がある場合は、次のコマンドを使用します。

$ gpg --armor --export
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2.0.22 (GNU/Linux)

Vitetris用のRPMパッケージを作成する

RPMをビルドするには、まずビルドツリーとspecファイルを作成し、ソースコードを配置します。

$ rpmdev-setuptree
$ rpmdev-newspec rpmbuild/SPECS/vitetris.spec
rpmbuild/SPECS/vitetris.spec created; type minimal, rpm version >= 4.11.
$ cp vitetris-0.57.tar.gz rpmbuild/SOURCES/

specファイルに初期詳細を追加する

まず以下の詳細を記述します。

Name:           vitetris
Version:        0.57
Release:        1%{?dist}
Summary:        ASCII based tetris game

License:        BSD
URL:            https://www.victornils.net/tetris/
Source0:        vitetris-0.57.tar.gz

BuildRequires:  gcc

不要なセクションを削除

  • このソフトウェアには依存関係がないため、Requires セクションを削除します
  • このソフトウェアはconfigureなしで構築できるので、 %configureセクションを削除します。(makeを実行する前にconfigureが必要な場合は保持します。)

descriptionを追加

好きなものを追加できますが、以下のような説明を書きます:

%description
vitetris is a multiplayer ASCII-based Tetris game

初期ビルドをテストする

表示された情報でビルドをテストして、表示されるエラーを確認します。

$ rpmbuild -ba rpmbuild/SPECS/vitetris.spec
...
RPM build errors:
Installed (but unpackaged) file(s) found:
/usr/local/bin/tetris
/usr/local/share/applications/vitetris.desktop
/usr/local/share/doc/vitetris/README
/usr/local/share/doc/vitetris/licence.txt
/usr/local/share/pixmaps/vitetris.xpm

前のステップのファイルのリストをspecファイルに追加する

次のように、前の手順で表示されたファイルのリストを%filesセクションに追加します。

%files
/usr/local/bin/tetris
/usr/local/share/applications/vitetris.desktop
%doc /usr/local/share/doc/vitetris/README
/usr/local/share/doc/vitetris/licence.txt
/usr/local/share/pixmaps/vitetris.xpm

文書であることを示す %doc がREADMEの前に置かれています。 RPMはこれなしでもビルドできます。

ビルドを再実行

$ rpmbuild -ba rpmbuild/SPECS/vitetris.spec
Wrote: /home/rpmbuilder/rpmbuild/SRPMS/vitetris-0.57-1.el7.src.rpm
Wrote: /home/rpmbuilder/rpmbuild/RPMS/x86_64/vitetris-0.57-1.el7.x86_64.rpm
Wrote: /home/rpmbuilder/rpmbuild/RPMS/x86_64/vitetris-debuginfo-0.57-1.el7.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.AqR4Aq
+ umask 022
+ cd /home/rpmbuilder/rpmbuild/BUILD
+ cd vitetris-0.57
+ /usr/bin/rm -rf /home/rpmbuilder/rpmbuild/BUILDROOT/vitetris-0.57-1.el7.x86_64
+ exit 0

RPMパッケージに署名する

RPMへの署名は以下のようにするだけです:

$ rpmsign --addsign /home/rpmbuilder/rpmbuild/RPMS/x86_64/vitetris-0.57-1.el7.x86_64.rpm 
Enter pass phrase: 
Pass phrase is good. 
/home/rpmbuilder/rpmbuild/RPMS/x86_64/vitetris-0.57-1.el7.x86_64.rpm:

このエラーが発生した場合:

You must set "%_gpg_name" in your macro file

公開鍵の値を%_gpg_name で指定します。

$ gpg --list-keys 
/home/rpmbuilder/.gnupg/pubring.gpg
-----------------------------------
pub 2048R/EEF6D9AD 2019-03-02
uid RPM Build User (RPM Builder GPG Signing Key) <rpmbuilder@rpm>
sub 2048R/D498F883 2019-03-02

$ echo "%_gpg_name EEF6D9AD" >> .rpmmacros

再試行します:

$ rpmsign --addsign /home/rpmbuilder/rpmbuild/RPMS/x86_64/vitetris-0.57-1.el7.x86_64.rpm
Enter pass phrase: 
Pass phrase is good.
/home/rpmbuilder/rpmbuild/RPMS/x86_64/vitetris-0.57-1.el7.x86_64.rpm:

rootユーザーとしてRPMのインストール/アンインストールをテストします。

# rpm -i /home/rpmbuilder/rpmbuild/RPMS/x86_64/vitetris-0.57-1.el7.x86_64.rpm
warning: /home/rpmbuilder/rpmbuild/RPMS/x86_64/vitetris-0.57-1.el7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID eef6d9ad: NOKEY

# /usr/local/bin/tetris

RPMをアンインストールします。

# rpm -qa |grep tetris
vitetris-0.57-1.el7.x86_64
=# rpm -e vitetris-0.57-1.el7.x86_64
# /usr/local/bin/tetris
-bash: /usr/local/bin/tetris: No such file or directory

おわりに

パッケージ化しようとしているソフトウェアによっては、カスタムRPMパッケージ作成は困難な場合があります。 この記事では、多くの場合にデフォルト設定で十分RPMを構築できることをデモンストレーションするため、できる限り作業を少なくしています。

もっと詳しく知りたい方は、 Red HatのRPM Packaging guideを参照してください。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません