rpmとは
RedHat社により開発されたパッケージ管理方式。rpmを使用することで、すでにコンパイルされたバイナリ形式のプログラムを簡単に利用することができる。
rpmパッケージ管理のメリット
- 環境に合ったSource fileを探して、Downloadして、Buildして、installして、といった面倒な作業を省略できる。
- バージョン管理ができる、myscript_.sh.20160701.bkとか負債になりがちな管理をしなくて良くなる。
- バージョンアップやアンインストールの手順をrpmのお作法に乗っかることで共通化できる。手順なんか書かなくて良い。
- 依存関係を設定できる。予めインストールしてほしいソフトウェアを設定できる。
- 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でシステムファイル消しちゃったなんてことがないように。
1 |
useradd dev |
■必要なツールのインストール
1 2 |
yum install rpm-build yum-utils yum install rpmdevtools yum groupinstall 'Development tools' |
■ビルド用ユーザになって環境準備。ディレクトリ、macro fileが作成される。
1 2 3 4 5 6 7 8 9 |
[dev@dev01 ~]$ rpmdev-setuptree [dev@dev01 ~]$ tree . └── rpmbuild ├── BUILD ├── RPMS ├── SOURCES ├── SPECS └── SRPMS |
メジャーなrpmをdownloadして中身を見る方法
■SRPM用yumリポジトリ作成
パッケージ作成に必須ではないが、メジャーなrpmパッケージにどんなファイルが含まれているか見ておくと大変参考になる。
http://vault.centos.org で公開されている。OS ver等はよしなに修正
1 2 3 4 5 6 7 8 9 10 11 12 |
[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で展開する。
1 2 3 4 5 6 7 8 9 |
[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パッケージ作成手順
■おおまかな流れ
- パッケージングするモノを準備する。
- Specfileを作成する。
- rpm buildでrpm packageを作成する。
1.パッケージするファイルを準備する
Shellscriptを3つほど準備した。package名/各ファイルとなるように準備しておく。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
[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で設定されている全てのマクロを表示できる。
1 2 3 4 |
[dev@dev01 test]$ rpm --eval "%_tmppath" /var/tmp [dev@dev01 test]$ rpm --eval "%_bindir" /usr/bin |
※.specでファイルを作成しはじめると、勝手にテンプレ的なファイルが作成される。
1 2 3 4 5 |
[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作業は必要なく、設定内容はかなりシンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
[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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
[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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//生成された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 |
■パッケージの確認
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[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. |
以上です。