Locked

CentOS_TIPS_007

プライベートパッケージ作成/管理

CentOS用のプライベートパッケージを作成/管理します。

バージョン情報

ここでは、以下のバージョンについて記載しています。

$ cat /etc/redhat-release
CentOS release 6.7 (Final)

ビルド環境作成

rpm-build/rpmdevtoolsをインストールします。

# yum install rpm-build rpmdevtools

適用先のサーバ環境が不明でも、整合性のあるパッケージを用意する必要がある場合はmockを使用します。

# yum --enablerepo=epel install mock

作成したパッケージに署名を入れるためGnuPGをインストール。

# yum install gpg

ビルド用のユーザにスイッチし構築環境を作成。

$ rpmdev-setuptree

鍵の生成。

$ gpg --gen-key

鍵の種類、鍵長、鍵の有効期限は、今回の用途にはデフォルトの値でOKです。
必要に応じて適切な値を入力します。

パスフレーズ入力後、乱数生成の部分で進行が止まる場合、サーバ環境で何らかの操作/処理を行う必要があります。
別のターミナルを開いて適当なコマンド操作を行う等の対応が必要かもしれません。

生成された鍵の確認。

$ gpg --list-keys
{HOMEディレクトリ}/.gnupg/pubring.gpg
-----------------------------
pub   ...../........ YYYY-MM-DD
uid                  {鍵生成時に入力した名前/メールアドレス情報}
sub   ...../........ YYYY-MM-DD

公開鍵をエクスポート。

$ gpg --export -a > RPM-GPG-KEY.private

rpmデータベースに公開鍵を追加。

# rpm --import RPM-GPG-KEY.private

複数のサーバに同じ公開鍵を追加する必要がある場合は、ウェブサーバ上で公開する、公開鍵インストール用のパッケージを用意する、等の対応が望ましいでしょう。

rpmデータベースに格納されている公開鍵の確認。

$ rpm -q gpg-pubkey --qf '%{name}-%{version}-%{release} %{summary}\n'

ホームディレクトリ下の.rpmmacrosファイルに追記します。

$ vi ${HOME}/.rpmmacros
...
%_signature gpg
%_gpg_name {鍵生成時に入力した名前/ID}
%packager youename <yourname@example.jp>

ビルド/署名の適用

作成した「rpms/SPECS」下にspecファイルを、必要に応じて「rpms/SOURCES」下にソースファイルを置くことでビルドが可能です。

$ ls
mod_authn_otp.spec
$ ls ../SOURCES/
mod_authn_otp-1.1.7.tar.bz2
$ rpmbuild --sign -ba mod_authn_otp.spec

mockを使用する場合rpmbuildでsrc.rpmのみ作成/使用します。

$ rpmbuild -bs mod_authn_otp.spec
$ mock --rebuild {構築用ディレクトリ}/rpms/SRPMS/mod_authn_otp-1.1.7-1.src.rpm

rpmファイルは「/var/lib/mock/{構築環境}/result/」下に作成されます。

mockで作成されたrpmファイルに署名します。

$ cp -p /var/lib/mock/{構築環境}/result/mod_authn_otp-1.1.7-1.{uname -i}.rpm {構築用ディレクトリ}/rpms/RPMS/{uname -i}/
$ rpm --addsign {構築用ディレクトリ}/rpms/RPMS/{uname -i}/mod_authn_otp-1.1.7-1.{uname -i}.rpm

署名の確認。

$ rpm -Kv mod_authn_otp-1.1.7-1.i386.rpm
mod_authn_otp-1.1.7-1.i386.rpm:
    ヘッダ V3 DSA signature: OK, key ID ........
    ヘッダ SHA1 ダイジェスト: OK (4269f8eccd5ccea9c211f1fbe7cf0fea8c622c6b)
    MD5 ダイジェスト: OK (23b0a8c5d33eecf25f44b19afb3e6450)
    V3 DSA signature: OK, key ID ........

プライベートリポジトリ作成

自分で作成したパッケージのリポジトリ用ディレクトリを用意します。

# yum install createrepo
# mkdir -p /opt/yum/repos/private/{RPMS,repodata}
# chown {ビルド作業アカウント} -R /opt/yum

作成したパッケージをリポジトリ下に配置します。

$ cp -p {構築用ディレクトリ}/rpms/RPMS/*/*.rpm /opt/yum/repos/private/RPMS/
$ createrepo /opt/yum/repos/private

以下のファイルはローカルでの使用を前提としていますが、複数台に適用する場合はウェブサーバによる公開/適切なURLの記述を行うとよいでしょう。
既存パッケージを上書きすることもあるので、プライオリティを最優先に設定しています。

--- /dev/null
+++ /etc/yum.repos.d/private.repo
@@ -0,0 +1,7 @@
+[private]
+name=private repository
+baseurl=file:/opt/yum/repos/private
+gpgcheck=1
+enabled=1
+priority=1
+