33
曖昧 RPM 講座 2010/5/29(SAT.) T2Y

曖昧 RPM 講座

Embed Size (px)

DESCRIPTION

about RPM Package Manager

Citation preview

Page 1: 曖昧 RPM 講座

曖昧 RPM 講座2010/5/29(SAT.) T2Y

Page 2: 曖昧 RPM 講座

アジェンダ

RPM とは

構造とバージョン

コマンドと関連ユーティリティ

RPM パッケージング

spec ファイルとソース RPM

yum リポジトリ

RHEL と Linux ディストリビュージョン

Red Hat 系ディストリビューション

Page 3: 曖昧 RPM 講座

RPM とは

RPM Package Manager

Red Hat Package Manager (以前?)

パッケージ本体は cpio 形式でアーカイブ

バイナリ RPM(RPMS) とソース RPM(SRPMS)

パッケージ情報は Berkeley DB に格納

RPM そのものはC 言語で開発

Java/Perl/Python/Ruby バインディング

cpio 形式?tar 同様、複数ファイルを1つにまとめるアーカイブ

Page 4: 曖昧 RPM 講座

RPM の構造(大体こんな感じ)

/var/lib/rpm

/usr/bin/python/usr/bin/pydoc/usr/bin/python-config/usr/lib/python2.6/BaseHTTPServer.py/usr/lib/python2.6/ …/usr/share/doc/python/2.6.2/LICENSE/usr/share/doc/python/2.6.2/README/usr/share/man/man1/python.1.bz2

ヘッダ情報

cpio archive

RPM パッケージrpmdb

# rpm2cpio

# rpm -q

# rpm -i/-U

# rpmbuildspec

ファイル

Page 5: 曖昧 RPM 講座

RPM のバージョン(1)

RPM のメンテナ Jeff Johnson(元 Red Hat)-> rpm5.org 設立へ

Red Hat 退社後も独自にメンテナンスを継続

再生への道を歩み始めたRPM開発 http://sourceforge.jp/magazine/07/02/20/0049233

RPMがrpm5.orgで"再出発" http://sourceforge.jp/magazine/07/06/19/014239

rpm-4.4.2 RHEL5(CentOS5)

Suse/Mandriva/Turbolinux など独自メンテ

Page 6: 曖昧 RPM 講座

RPM のバージョン(2)

RPM5 Stable: 5.2.x, Current 5.3?

コードベースのリファクタリング

機能 移植性の向上(プラットホーム/コンパイラ)

LZMA/XAR(XML Archive)のサポート

SQLite のサポート

spec ファイルのカスタムタグ

Fedora13/RHEL6 beta rpm-4.8.0

Page 7: 曖昧 RPM 講座

RPM の四方山話

rpmdb が壊れたー(> <)

昔(RH8, RH9)はよく壊れたもんだ、、、

/var/lib/rpm/__db.xxx のキャッシュを削除すれば直るかも?(場合によっては rpm –rebuilddb)

… タイトル付けたのに他になかった、、、

Page 8: 曖昧 RPM 講座

rpm コマンド(1)

# rpm -q rpmrpm-4.4.2.3-18.el5

# rpm -q --qf "%{name}-%{version}-%{release}¥n" rpmrpm-4.4.2.3-18.el5

# cat .rpmmacros

%_query_all_fmt %%{epoch}:%%{name}-%%{version}-%%{release}.%%{arch}

# rpm -q rpm(none):rpm-4.4.2.3-18.el5.x86_64

クエリフォーマットのカスタマイズ

Page 9: 曖昧 RPM 講座

rpm コマンド(2)

# rpm -ql bc/usr/bin/bc/usr/bin/dc/usr/share/doc/bc-1.06…

# rpm -q --dump bc/usr/bin/bc 73408 1170191017 cf850a96f48201ce8ed3c4d8eebef728 0100755 root root 0 0 0 X/usr/bin/dc 39608 1170191017 70a963cb04ecf28673568ae8ae2e24c7 0100755 root root 0 0 0 X/usr/share/doc/bc-1.06 4096 1170191017 00000000000000000000000000000000 040755 root root 0 0 0 X…

ファイル情報を出力する

Page 10: 曖昧 RPM 講座

rpm コマンド(3)

python パッケージが提供する機能# rpm -q --provides python...python = 2.4.3-27.el5

機能 “python” を要求するパッケージ# rpm -q --whatrequires pythonrhpl-0.194.1-1authconfig-5.3.21-6.el5yum-3.2.22-20.el5.centos...

依存関係(provides/require)を調べる

python パッケージが要求する機能# rpm -q --requires python/bin/sh/usr/bin/env…

機能 “/bin/sh” を提供するパッケージ# rpm -q --whatprovides "/bin/sh"bash-3.2-24.el5

Page 11: 曖昧 RPM 講座

rpm コマンド(4)

rpm パッケージが require している機能を提供するパッケージを調べる# rpm -q --requires rpm | sed s"/[<> ].*//"g | xargs -i rpm -q --whatprovides --qf"%{provides}: %{name}-%{version}-%{release}¥n" {} | sort –uANSI_X3.110.so: glibc-2.5-42config(bash): bash-3.2-24.el5config(coreutils): coreutils-5.97-23.el5…

rpm パッケージが require している機能を提供するパッケージの依存チェーンを辿る# cmd="rpm -q --requires rpm"; for i in $(seq 0 2); do cmd="$cmd | cut -d' ' -f1 | xargs rpm -q --whatprovides | xargs rpm -q --requires | sort -u"; done; eval $cmd | grep pythonpython(abi) = 2.4

依存チェーンを辿る

Page 12: 曖昧 RPM 講座

rpm2cpio コマンド

# mkdir work; cd work# rpm2cpio ../bc-1.06-21.src.rpm | cpio -divbc-1.06-info_exp_bessel.patchbc-1.06-readline42.patchbc-1.06-s390.patchbc-1.06.tar.bz2bc.spec469 blocks# lsbc-1.06-info_exp_bessel.patchbc-1.06-readline42.patchbc-1.06-s390.patchbc-1.06.tar.bz2bc.spec

rpm パッケージを展開する

Page 13: 曖昧 RPM 講座

RPM API(1)

rpm-python (python バインディング) がお奨め rpm-python を利用する主なパッケージ Anaconda (インストーラ)

yum (アップデータ)

system-config-xxx (管理ツール)

rpm プログラミング with python を読み砕く http://d.hatena.ne.jp/t2y-1979/20080705/1215185168

http://d.hatena.ne.jp/t2y-1979/20080711/1215757916

http://d.hatena.ne.jp/t2y-1979/20080821/1219321380

Fedora wiki の構成が変更されて原文がどっかに行っちゃった、、、

Page 14: 曖昧 RPM 講座

RPM API(2)

その他の言語バインディング

rpm-libs (C 言語)

rpm/rpm-build パッケージ以外は使われていない?

perl-rpm

http://search.cpan.org/dist/Perl-RPM/

ruby-rpm

http://sourceforge.jp/projects/freshmeat_ruby-rpm/

Java-rpm?

そんなのあったっけ?

Page 15: 曖昧 RPM 講座

RPM API(3) -バージョン比較-

RPM のAPI を使用しなければならない

1.2-1

1.2.1-1 (RPM 的にはこれが最も高い)

1.2a-1

Pilot python Fl.4 -rpm version compare-

http://blog.miraclelinux.com/asianpen/2009/03/pilot-python-fl.html

rpm モジュールを使用したサンプル

Page 16: 曖昧 RPM 講座

RPM パッケージング

パッケージング + リポジトリ構築

spec ファイルを作成する

ビルド環境を構築する

yum リポジトリを作成、更新する

Debian GNU/Linux上でRPMパッケージ・Yumリポジトリを作って公開する方法: milter managerを例にして by ククログ

http://www.clear-code.com/blog/2010/3/3.html

chroot 環境を作るのに rinse が便利そう?

Page 17: 曖昧 RPM 講座

rpmbuild コマンド

詳細は man rpmbuild を参照

spec ファイルの検証ができる# rpmbuild --nobuild bc.spec

%prep を実行する(ソースを展開してパッチが当たるかテスト)# rpmbuild -bp bc.spec

バイナリ RPM とソース RPM をビルドする# rpmbuild -ba bc.spec# rpmbuild -bs bc.spec (ソース RPM のみビルド)# rpmbuild -bb bc.spec (バイナリ RPM のみビルド)

ビルドツリーやソースの削除# rpmbuild --clean bc.spec || --rmsource bc.spec

Page 18: 曖昧 RPM 講座

トリガースクリプトの仕様(1)

spec ファイルでRPM パッケージのインストール(アンインストール)時に特別な処理を実行する %pre : インストール前に実行 %post : インストール後に実行 %preun : アンインストール前に実行 %postun : アンインストール後に実行

環境変数 $1 で制御する “rpm -i” : %pre, %post に対して $1 = 1 “rpm -U” : %pre, %post に対して $1 = 2

: %preun, %postun に対して $1 = 1 “rpm -e” : %preun, %postun に対して $1 = 0

Page 19: 曖昧 RPM 講座

トリガースクリプトの仕様(2)

(たぶん歴史的に)仕様が複雑になってる

rpm-4.4 以降は %pretrans, %posttrans が使えるようになったらしい

http://rpm5.org/docs/api/triggers.html

http://fedoraproject.org/wiki/Packaging/ScriptletSnippets#Syntax

Page 20: 曖昧 RPM 講座

トリガースクリプトの使用例

なるべくシンプルに使った方が良い

%post : インストール後に実行

初期化設定、サービス追加、サーバ再起動

%postun : アンインストール後に実行

ここでサーバ再起動はやらない方が良いかも

なるべくやらない方が良いこと

設定ファイルを書きかえる

シンボリックリンクを張り替える

http://vinelinux.org/manuals/making-rpm-9.html

Page 22: 曖昧 RPM 講座

トリガースクリプトの弊害(2)

RPM パッケージのアップグレードは以下の順番で実行される1. 全ての %pretrans を実行2. 新パッケージをインストール

1. %triggerprein を実行2. %pre を実行3. %post を実行

3. 旧パッケージをアンインストール1. %preun を実行2. %postun を実行3. %triggerpostun を実行

4. 任意のパッケージの %triggerpostun を実行5. 全ての %posttrans を実行

bind パッケージに悪いお手本があるよ

Page 23: 曖昧 RPM 講座

パッケージアップデータ

yum(Yellow dog Updater Modified)

Yellow Dog Linux (PPC) のために開発された

Red Hat 系のデファクトスタンダード?

Red Hat : up2date(独自開発)

Suse : YaST(独自開発)

Asianux : axtu(独自開発)

MiracleLinux : mlupdater(独自開発)

どうして yum を使わないの?- yum 本体に認証の仕組みがない- 使い勝手がディストリビューションの差別化につながる

Page 24: 曖昧 RPM 講座

yum コマンド(1)

ネットワーク経由でインストールやアップデートも簡単# yum install python# yum -y update python (-y を付けると自動的にアップグレード)

リポジトリ内を検索# yum search python

パッケージのヘッダ情報を表示# yum info pythonリポジトリ内の全パッケージリストを表示# yum listインストール済のパッケージリストを表示# yum list installed

yum しか知らなくても大丈夫?

Page 25: 曖昧 RPM 講座

yum コマンド(2)

# yum deplist rpmLoaded plugins: fastestmirrorLoading mirror speeds from cached hostfile* addons: ftp.iij.ad.jp* base: ftp.iij.ad.jp* extras: ftp.iij.ad.jp* updates: ftp.iij.ad.jpFinding dependencies: package: rpm.x86_64 4.4.2.3-18.el5dependency: librpm-4.4.so()(64bit)provider: rpm-libs.x86_64 4.4.2.3-18.el5

dependency: logrotateprovider: logrotate.x86_64 3.7.4-9

依存関係を調べるのも yum の方が簡単?

Page 26: 曖昧 RPM 講座

yumdownloader コマンド

RPM パッケージをダウンロードする# yumdownloader bc# yumdownloader --source bc※CentOS でソースをダウンロードするには/etc/yum.repos.d/CentOS-Base.repo ファイルにソース RPMS のダウンロード設定を追加する必要がある

yum-utils もインストールしておきたい

Page 27: 曖昧 RPM 講座

拡張リポジトリ(1)

yum で使用するパッケージを追加できる

/etc/yum.repos.d/ に設定ファイルを置く

拡張リポジトリは “enabled=0” をセットして、通常は使用しないようにした方が良い

CentOS なら EPEL がお奨め

https://fedoraproject.org/wiki/EPEL/Japanese

http://d.hatena.ne.jp/t2y-1979/20090711/1247299328

オプションで使用するリポジトリを明示的に指定# yum search --enablerepo=epel python

Page 28: 曖昧 RPM 講座

拡張リポジトリ(2)

yum のデータ通信は http プロトコル

リポジトリはWeb サーバさえがあれば、簡単に作成できる

特定ユーザ向けにリポジトリへの認証を行うには別の細工が必要

リポジトリの正当性は認証ではなく、個々のパッケージの署名確認?

Page 29: 曖昧 RPM 講座

RHEL の国内サーバシェア

日本ではとにかく RHEL が強い

国内 Linux サーバ市場シェアの84%以上?

IDC Japan 調査レポート

http://www.idcjapan.co.jp/Report/Software/j9360105.html

http://itpro.nikkeibp.co.jp/article/NEWS/20091110/340333/?SS=imgview&FD=-1342976709&ST=oss

Page 30: 曖昧 RPM 講座

Red Hat 系ディストリ

Fedora

Red Hat Enterprise Linux (Fedora ベース)

Oracle Enterprise Linux (RHEL ベース)

Asianux/MiracleLinux (RHEL ベース)

CentOS (RHEL クローン)

Scientific Linux (RHEL クローン)

Mandriva Linux

Momonga Linux

Vine Linux

Page 31: 曖昧 RPM 講座

ディストリの目的(1)

Fedora

コミュニティ主導

Red Hat 社はスポンサー

最新パッケージの統合、レビュー、テスト

迅速な技術革新を試みる

リリースサイクルは6ヶ月

メンテナンス期間は13ヶ月

http://ja.wikipedia.org/wiki/Fedora

Page 32: 曖昧 RPM 講座

ディストリの目的(2)

RHEL(Red Hat Enterprise Linux)

Fedora の実績をベースに開発

Red Hat 社が商用サポート

安定性とアップデートの互換性を重視する

ISV/IHV のCertification が多い

リリースサイクルは18~24ヶ月

メンテナンス期間は7年間

http://ja.wikipedia.org/wiki/Red_Hat_Enterprise_Linux

Page 33: 曖昧 RPM 講座

ディストリの目的(3)

CentOS

Community ENTerprise Operating System

RHELのソースをリビルド

Red Hat 社は無関係

RHEL のCertification がおそらく動く

リリース/メンテナンス期間は RHEL と同じ

RHEL リリース後、約1ヶ月程度でリリース

http://ja.wikipedia.org/wiki/CentOS