独自のRPMパッケージやyumリポジトリの作成


構築環境

  • 公開サーバ(独自パッケージとリポジトリを作成) web1.example.com
  • クライアントサーバ(独自RPMインストール)   python.example.com

手順

1.作業に必要なコマンドのパッケージをインストール
2.テストパッケージ用のターボールを準備
3.作業用のサブディレクトリを作成
4.specファイルを作成
5.パッケージを生成
6.RPMパッケージに署名を行う
7.HTTPでの公開作業
8.公開サーバに独自のyumリポジトリを作成
9.クライアント側から独自yumリポジトリにアクセス
10.チェック

1.作業に必要なコマンドのパッケージをインストール

1)rpmbuildコマンドのパッケージをインストールする
# yum install rpm-build -y

2)署名のGnuPG(gpg)をインストール
# yum install gpg -y

3)リポジトリ生成のパッケージをインストール
 # yum install createrepo -y

2.テストパッケージ用のターボールを準備

1)作業ディレクトリ作成
$ mkdir -p rpm_cmd/whdate
$ cd rpm_cmd

2)コマンド作成
$ vim /home/vagrant/rpm_cmd/whdate/whatdate.sh
#!/bin/sh

SRC_PATH=$(cd $(dirname $0)/../src/whdate && pwd)

source ${SRC_PATH}/funWhdate.sh

echo -n '曜日を入力して下さい。その曜日の日付を算出します。0が日曜日:'
read  wday

# 曜日の日付を返す
date=`fwhdate ${wday}`

# 曜日名を返す
day=`perl ${SRC_PATH}/getDay.pl ${date}`

echo "${date} (${day})"

$ vim /home/vagrant/rpm_cmd/whdate/funWhdate.sh
#!/bin/sh

function fwhdate() {
    #対象の曜日を指定。0が日曜日。
    targetDay=$1

    #曜日取得
    day=`date +%w`

    #対象の曜日までの日数
    numOfdays=`expr $targetDay - $day`

    #対象の日付を取得
    date=`date -d "$numOfdays days" +"%Y-%m-%d"`

    echo ${date}
}

$ vim /home/vagrant/rpm_cmd/whdate/getDay.pl
#!/usr/bin/perl

use strict;

my @wdays = qw(日 月 火 水 木 金 土);
my $val = $ARGV[0];

my($y,$m,$d);
($y,$m,$d) = split(/-/, $val);

if ($m < 3) {$y--; $m+=12;}
my $w=($y+int($y/4)-int($y/100)+int($y/400)+int((13*$m+8)/5)+$d)%7;

print $wdays[$w];

/usr/local/src/whdateにソースを格納
# cd /usr/local/src/
# mkdir whdate
# cp /home/vagrant/rpm_cmd/whdate/whatdate.sh whdate/
# cp /home/vagrant/rpm_cmd/whdate/funWhdate.sh whdate/
# cp /home/vagrant/rpm_cmd/whdate/getDay.pl whdate/

/usr/local/binにシンボリックリンクを配置
# ln -s /usr/local/src/whdate/whatdate.sh  /usr/local/bin/whdate
$ ls -l /usr/local/bin/whdate
lrwxrwxrwx 1 root root 33  9月 16 11:50 2017 /usr/local/bin/whdate -> /usr/local/src/whdate/whatdate.sh

$ whdate
曜日を入力して下さい。その曜日の日付を算出します。0が日曜日:2
2017-09-19 (火)

3)ターボール作成
$ ls -l whdate/
-rwxr-xr-x 1 vagrant vagrant 312  9月  2 21:04 2017 funWhdate.sh
-rw-rw-r-- 1 vagrant vagrant 263  9月  2 20:54 2017 getDay.pl
-rwxr-xr-x 1 vagrant vagrant 285  9月  2 21:03 2017 whatdate.sh

$ tar -zcvf whdate-1.0.tar.gz whdate

$ ls -l *.gz
-rw-rw-r-- 1 vagrant vagrant 771  9月  3 18:52 2017 whdate-1.0.tar.gz

3.作業用のサブディレクトリを作成

$ mkdir -p rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}

$ ls -l rpmbuild/
drwxrwxr-x 2 vagrant vagrant 4096  9月  3 19:38 2017 BUILD
drwxrwxr-x 2 vagrant vagrant 4096  9月  3 19:38 2017 RPMS
drwxrwxr-x 2 vagrant vagrant 4096  9月  3 19:38 2017 SOURCES
drwxrwxr-x 2 vagrant vagrant 4096  9月  3 19:38 2017 SPECS
drwxrwxr-x 2 vagrant vagrant 4096  9月  3 19:38 2017 SRPMS

$ mv whdate-1.0.tar.gz rpmbuild/SOURCES/

4.specファイルを作成

$ vim rpmbuild/SPECS/whdate.spec
%define _topdir /home/vagrant/rpm_cmd/rpmbuild
%define name whdate
%define release 1
%define version 1.0
%define buildroot %{_topdir}/%{name}-%{version}-root

BuildRoot:      %{buildroot}
Summary:        test command
License:        BSD
Vendor: INDETAIL
Name:   %{name}
Version:        %{version}
Release:        %{release}
Source: %{name}-%{version}.tar.gz
Group:  System Environment/Shells
AutoReqProv:    no

%description
test command

# (1) ソースをビルドする前に実行したい処理
%prep
rm -rf $RPM_BUILD_ROOT

# (2) ソースの圧縮ファイルが解凍された時にできるディレクトリ名を指定
#     解凍後のディレクトリの中にcdされる
%setup -n %{name}

%build

# (3) インストールする処理
%install
mkdir -p $RPM_BUILD_ROOT/usr/local/src/%{name}
install -m 755 *.sh $RPM_BUILD_ROOT/usr/local/src/%{name}
install -m 755 *.pl $RPM_BUILD_ROOT/usr/local/src/%{name}

# (4) パッケージ作成後のクリーン処理
%clean
rm -rf $RPM_BUILD_ROOT

# シンボリックリンクを設定
%post
/bin/ln -s /usr/local/src/whdate/whatdate.sh  /usr/local/bin/whdate

# (5) %files %defattr(-,root,root) /usr/local/src/%{name}

5.パッケージを生成

$ rpmbuild -ba --clean rpmbuild/SPECS/whdate.spec
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.t0O6O6
+ umask 022
+ cd /home/vagrant/rpm_cmd/rpmbuild/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY

---------------------------------------------------------------------------------------------------- (1) %prep
+ rm -rf /home/vagrant/rpmbuild/BUILDROOT/whdate-1.0-2.x86_64

---------------------------------------------------------------------------------------------------- (2) %setup
+ cd /home/vagrant/rpm_cmd/rpmbuild/BUILD
+ rm -rf whdate
+ /usr/bin/gzip -dc /home/vagrant/rpm_cmd/rpmbuild/SOURCES/whdate-1.0.tar.gz
+ /bin/tar -xvvf -
drwxrwxr-x vagrant/vagrant   0 2017-09-16 12:01 whdate/
-rwxr-xr-x vagrant/vagrant 312 2017-09-02 21:04 whdate/funWhdate.sh
-rw-rw-r-- vagrant/vagrant 263 2017-09-02 20:54 whdate/getDay.pl
-rwxr-xr-x vagrant/vagrant 351 2017-09-16 11:45 whdate/whatdate.sh
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd whdate
+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
実行中(%build): /bin/sh -e /var/tmp/rpm-tmp.jcsLM2
+ umask 022
+ cd /home/vagrant/rpm_cmd/rpmbuild/BUILD
+ cd whdate
+ LANG=C
+ export LANG
+ unset DISPLAY
+ exit 0
実行中(%install): /bin/sh -e /var/tmp/rpm-tmp.hfbJKY
+ umask 022
+ cd /home/vagrant/rpm_cmd/rpmbuild/BUILD
+ '[' /home/vagrant/rpmbuild/BUILDROOT/whdate-1.0-2.x86_64 '!=' / ']'
+ rm -rf /home/vagrant/rpmbuild/BUILDROOT/whdate-1.0-2.x86_64
++ dirname /home/vagrant/rpmbuild/BUILDROOT/whdate-1.0-2.x86_64
+ mkdir -p /home/vagrant/rpmbuild/BUILDROOT
+ mkdir /home/vagrant/rpmbuild/BUILDROOT/whdate-1.0-2.x86_64
+ cd whdate
+ LANG=C
+ export LANG
+ unset DISPLAY

---------------------------------------------------------------------------------------------------- (3) %install
+ mkdir -p /home/vagrant/rpmbuild/BUILDROOT/whdate-1.0-2.x86_64/usr/local/src/whdate
+ install -m 755 funWhdate.sh whatdate.sh /home/vagrant/rpmbuild/BUILDROOT/whdate-1.0-2.x86_64/usr/local/src/whdate
+ install -m 755 getDay.pl /home/vagrant/rpmbuild/BUILDROOT/whdate-1.0-2.x86_64/usr/local/src/whdate
+ /usr/lib/rpm/find-debuginfo.sh --strict-build-id /home/vagrant/rpm_cmd/rpmbuild/BUILD/whdate
+ /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: whdate-1.0-2.x86_64
Processing files: whdate-debuginfo-1.0-2.x86_64
伸張ファイルの検査中: /usr/lib/rpm/check-files /home/vagrant/rpmbuild/BUILDROOT/whdate-1.0-2.x86_64
書き込み完了: /home/vagrant/rpm_cmd/rpmbuild/SRPMS/whdate-1.0-2.src.rpm
書き込み完了: /home/vagrant/rpm_cmd/rpmbuild/RPMS/x86_64/whdate-1.0-2.x86_64.rpm
書き込み完了: /home/vagrant/rpm_cmd/rpmbuild/RPMS/x86_64/whdate-debuginfo-1.0-2.x86_64.rpm
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.rn8nnJ
+ umask 022
+ cd /home/vagrant/rpm_cmd/rpmbuild/BUILD
+ cd whdate

---------------------------------------------------------------------------------------------------- (4) %clean
+ rm -rf /home/vagrant/rpmbuild/BUILDROOT/whdate-1.0-2.x86_64
+ exit 0
実行中(--clean): /bin/sh -e /var/tmp/rpm-tmp.vLZExF
+ umask 022
+ cd /home/vagrant/rpm_cmd/rpmbuild/BUILD
+ rm -rf whdate
+ exit 0

$ ls -l rpmbuild/RPMS/x86_64/
-rw-rw-r-- 1 vagrant vagrant 3128  9月  3 20:36 2017 whdate-1.0-1.x86_64.rpm
-rw-rw-r-- 1 vagrant vagrant 1672  9月  3 20:36 2017 whdate-debuginfo-1.0-1.x86_64.rpm

6.RPMパッケージに署名を行う

1)署名に必要な鍵を生成
$ cd rpm_cmd/
$ gpg --gen-key
gpg (GnuPG) 2.0.14; Copyright (C) 2009 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

ご希望の鍵の種類を選択してください:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (署名のみ)
   (4) RSA (署名のみ)
選択は?(何も入力せずにEnter)
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)(何も入力せずにEnter)
要求された鍵長は2048ビット
鍵の有効期限を指定してください。
         0 = 鍵は無期限
        = 鍵は n 日間で満了
      w = 鍵は n 週間で満了
      m = 鍵は n か月間で満了
      y = 鍵は n 年間で満了
鍵の有効期間は? (0)(何も入力せずにEnter)
Key does not expire at all
これで正しいですか? (y/N) y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

本名: vagrant
電子メール・アドレス: vagrant@test.com
コメント: vagrant
次のユーザーIDを選択しました:
    “vagrant (vagrant) <vagrant@test.com>”

名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O
秘密鍵を保護するためにパスフレーズがいります。
 lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
 x パスフレーズを入力                                  x
 x                                                     x
 x                                                     x
 x Passphrase vagrant_test____________________________ x
 x                                                     x
 x                                                     x
 mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj

can't connect to `/home/vagrant/.gnupg/S.gpg-agent': そのようなファイルやディレクトリはありません
今から長い乱数を生成します。キーボードを打つとか、マウスを動かす
とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で
乱雑さの大きないい乱数を生成しやすくなるので、お勧めいたします。
今から長い乱数を生成します。キーボードを打つとか、マウスを動かす
とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で
乱雑さの大きないい乱数を生成しやすくなるので、お勧めいたします。

何もしないとずっと終わらないので、別ターミナルで「gpg --gen-key 乱数生成をもっと効率的にする」を実施

gpg: 鍵7E691742を絶対的に信用するよう記録しました
公開鍵と秘密鍵を作成し、署名しました。

gpg: 信用データベースの検査
gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル
gpg: 深さ: 0  有効性:   1  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u
pub   2048R/7E691742 2017-09-03
                 指紋 = B599 5CB7 0526 0BD0 DDBA  BC5F 5F6C CAEB 7E69 1742
uid                  vagrant (vagrant) <vagrant@test.com>
sub   2048R/99353801 2017-09-03


2)生成した鍵の情報の確認
$ gpg --list-keysy
/home/vagrant/.gnupg/pubring.gpg
--------------------------------
pub   2048R/7E691742 2017-09-03
uid                  vagrant (vagrant) <vagrant@test.com>
sub   2048R/99353801 2017-09-03

3)公開鍵をファイルにエクスポート
$ gpg --export -a 'vagrant' > RPM-GPG-KEY-vagrant
$ ls RPM-GPG-KEY-vagrant
RPM-GPG-KEY-vagrant

4)エクスポートした公開鍵をRPMが使用するデータベースに登録
$ sudo rpm --import RPM-GPG-KEY-vagrant

5)RPMのデータベースに登録されている公開鍵一覧
$ rpm -q gpg-pubkey --qf '%{name}-%{version}-%{release} --> %{summary}\n'
gpg-pubkey-c105b9de-4e0fd3a3 --> gpg(CentOS-6 Key (CentOS 6 Official Signing Key) <centos-6-key@centos.org>)
gpg-pubkey-4bd6ec30-4ff1e4fa --> gpg(Puppet Labs Release Key (Puppet Labs Release Key) <info@puppetlabs.com>)
gpg-pubkey-7e691742-59abfa30 --> gpg(vagrant (vagrant) <vagrant@test.com>)  ←追加されたキー

以上で鍵の準備は完了

6)RPMのマクロ設定ファイルを作成
$ cd ~
$ vim .rpmmacros
%_signature gpg
%_gpg_name vagrant
7)RPMパッケージに署名を行う
$ rpm --addsign rpmbuild/RPMS/x86_64/whdate-1.0-1.x86_64.rpm
パスフレーズの入力:vagrant_test
パスフレーズは正常です。
rpmbuild/RPMS/x86_64/whdate-1.0-1.x86_64.rpm:

8)署名を検証する
$ rpm --checksig rpmbuild/RPMS/x86_64/whdate-1.0-1.x86_64.rpm
rpmbuild/RPMS/x86_64/whdate-1.0-1.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

7.HTTPでの公開作業

1)以下を参考にhttpdをインストール
参考 CentOS 6 - Apache httpd - httpd インストール : Server World
$ vim /etc/httpd/conf/httpd.conf DocumentRoot "/var/www/html" 
2)公開先ディレクトリーの作成
# mkdir /var/www/html/packages

3)公開先に公開鍵をコピー
# cp /home/vagrant/rpm_cmd/RPM-GPG-KEY-vagrant /var/www/html/packages

4)公開パッケージ用ディレクトリの作成とコピー
# mkdir /var/www/html/packages/whdate
# cp /home/vagrant/rpm_cmd/rpmbuild/RPMS/x86_64/whdate-1.0-1.x86_64.rpm /var/www/html/packages/whdate

8.公開先に独自のyumリポジトリを作成

1)yumリポジトリを作成
# createrepo /var/www/html/packages

2)repodata/が作成されメタデータファイルが作成される
# ls /var/www/html/packages/repodata
401dc19bda88c82c403423fb835844d64345f7e95f5b9835888189c03834cc93-filelists.xml.gz
6bf9672d0862e8ef8b8ff05a2fd0208a922b1f5978e6589d87944c88259cb670-other.xml.gz
77a287c136f4ff47df506229b9ba67d57273aa525f06ddf41a3fef39908d61a7-other.sqlite.bz2
8596812757300b1d87f2682aff7d323fdeb5dd8ee28c11009e5980cb5cd4be14-primary.sqlite.bz2
dabe2ce5481d23de1f4f52bdcfee0f9af98316c9e0de2ce8123adeefa0dd08b9-primary.xml.gz
f8606d9f21d61a8bf405af7144e16f6d7cb1202becb78ba5fea7d0f1cd06a0b2-filelists.sqlite.bz2

9.クライアント側から独自yumリポジトリにアクセス

1)こちらを参考、クライアントサーバから公開サーバにsshログイン出来るよう設定する

2)公開鍵を取得
$ wget http://web1.example.com/packages/RPM-GPG-KEY-vagrant
$ sudo mv RPM-GPG-KEY-vagrant /etc/pki/rpm-gpg/

3)公開鍵をインポート
# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-vagrant

4)インポートされたgpgキーを確認
# rpm -qa gpg-pubkey*
gpg-pubkey-4bd6ec30-4ff1e4fa
gpg-pubkey-0608b895-4bd22942
gpg-pubkey-62c00297-5974a581
gpg-pubkey-8fbb13f7-597f3a62
gpg-pubkey-7e691742-59abfa30  ←インポートしたやつ
gpg-pubkey-c105b9de-4e0fd3a3

5)インポートしたgpgキー情報の確認
# rpm -qi gpg-pubkey-7e691742-59abfa30 | head 9Name        : gpg-pubkey                   Relocations: (not relocatable)
Version     : 7e691742                          Vendor: (none)
Release     : 59abfa30                      Build Date: 2017年09月10日 21時07分04秒
Install Date: 2017年09月10日 21時07分04秒      Build Host: localhost
Group       : Public Keys                   Source RPM: (none)
Size        : 0                                License: pubkey
Signature   : (none)
Summary     : gpg(vagrant (vagrant) <vagrant@test.com>)

6)yumの設定
# vim /etc/yum.repos.d/vagrant.repo
[vagrant]
name=vagrant original RPM packages
baseurl=http://web1.example.com/packages
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-vagrant
enabled=1
gpgcheck=1

7)独自リポジトリからインストール
# yum --enablerepo=vagrant install whdate -y
更新:
  whdate.x86_64 0:1.0-1

完了しました!

10.チェック

インストールされている
# rpm -qa | grep whdate
whdate-1.0-3.x86_64

ソースが展開されている
# ls -l /usr/local/src/whdate
-rwxr-xr-x 1 root root 312  9月 22 19:39 2017 funWhdate.sh
-rwxr-xr-x 1 root root 263  9月 22 19:39 2017 getDay.pl
-rwxr-xr-x 1 root root 351  9月 22 19:39 2017 whatdate.sh

シンボリックリンクが貼られている
# ls -l /usr/local/bin/whdate
lrwxrwxrwx 1 root root 33  9月 22 19:41 2017 /usr/local/bin/whdate -> /usr/local/src/whdate/whatdate.sh

実行出来る
$ whdate
曜日を入力して下さい。その曜日の日付を算出します。0が日曜日:2
2017-09-19 (火)

補足.エラー対応


【事象】
yum install 時、「パッケージ hoge-1.0-0.el6.x86_64.rpm は署名されていません」といわれたら
【対応】
yumのキャッシュをクリアーしてみる
# yum clean all

【事象】
yum install 時、「何もしません」といわれたら
【対応】
リポジトリの更新
# createrepo /var/www/html/packages

【事象】
yum install 時、依存性の処理でエラーになったら
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> Package whdate.x86_64 0:1.0-2 will be インストール
--> 依存性の処理をしています: /usr/local/bin/perl のパッケージ: whdate-1.0-2.x86_64
--> 依存性の処理をしています: /usr/local/bin/perl のパッケージ: whdate-1.0-2.x86_64
--> 依存性解決を終了しました。
エラー: パッケージ: whdate-1.0-2.x86_64 (vagrant)
             要求: /usr/local/bin/perl
 問題を回避するために --skip-broken を用いることができません
 これらを試行できます: rpm -Va --nofiles --nodigest

【原因】
perlは /usr/bin にあるのに パッケージ生成時に /usr/local/bin が Require されてしまうため、yum install で依存性エラーになってしまう
$ which perl
/usr/bin/perl

$ rpmbuild -ba --clean rpmbuild/SPECS/whdate.specProcessing files: whdate-1.0-1.x86_64
Requires(interp): /bin/sh
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires(post): /bin/sh
Requires: /bin/sh /usr/local/bin/perl perl(strict)
Processing files: whdate-debuginfo-1.0-1.x86_64

【対応】
自動で依存関係設定しないように AutoReqProvタグ を追記する
$ vim rpmbuild/SPECS/whdate.spec
Version:        %{version}
Release:        %{release}
Source: %{name}-%{version}.tar.gz
Group:  System Environment/Shells
AutoReqProv:    no