Masteries

技術的なことや仕事に関することを書いていきます.

RPMパッケージの中身を見る

「RPMパッケージって, 具体的には何が入っているの?」みたいな話が社内であったので, RPMパッケージの中身を見る方法について調べてみました.

今回は, Vagrantで動かしているCentOS 7.0上で, mariadbmariadb-develを題材にして, RPMパッケージの中身を見つつ, mariadbmariadb-develの違いをみていこうと思います. ちなみにMySQLではなくてMariaDBが題材になっているのは, CentOS 7.0ではMySQLをインストールすると勝手にMariaDBがインストールされるからです.

というわけで, とりあえずさっくりとMariaDBをインストールします.

$ sudo yum install mariadb mariadb-devel

これで準備は完了です.

RPMパッケージの中身を見る

で, いきなり本題になりますが, RPMのパッケージをyumコマンドなどを利用してインストールすることによって配置されるファイルは, rpm -ql <package>で確認することができます.

まずは, mariadbから見ていきます.

$ rpm -ql mariadb
/etc/my.cnf.d/client.cnf
/usr/bin/aria_chk
/usr/bin/aria_dump_log
/usr/bin/aria_ftdump
/usr/bin/aria_pack
/usr/bin/aria_read_log
/usr/bin/msql2mysql
/usr/bin/my_print_defaults
/usr/bin/mysql
/usr/bin/mysql_find_rows
/usr/bin/mysql_waitpid
/usr/bin/mysqlaccess
/usr/bin/mysqladmin
/usr/bin/mysqlbinlog
/usr/bin/mysqlcheck
/usr/bin/mysqldump
/usr/bin/mysqlimport
/usr/bin/mysqlshow
/usr/bin/mysqlslap
/usr/share/doc/mariadb-5.5.41
/usr/share/doc/mariadb-5.5.41/COPYING
/usr/share/doc/mariadb-5.5.41/COPYING.Google
/usr/share/doc/mariadb-5.5.41/COPYING.LESSER
/usr/share/doc/mariadb-5.5.41/COPYING.Percona
/usr/share/doc/mariadb-5.5.41/README
/usr/share/doc/mariadb-5.5.41/README.mysql-docs
/usr/share/doc/mariadb-5.5.41/README.mysql-license
/usr/share/man/man1/aria_chk.1.gz
/usr/share/man/man1/aria_dump_log.1.gz
/usr/share/man/man1/aria_ftdump.1.gz
/usr/share/man/man1/aria_pack.1.gz
/usr/share/man/man1/aria_read_log.1.gz
/usr/share/man/man1/my_print_defaults.1.gz
/usr/share/man/man1/mysql.1.gz
/usr/share/man/man1/mysql_find_rows.1.gz
/usr/share/man/man1/mysql_waitpid.1.gz
/usr/share/man/man1/mysqlaccess.1.gz
/usr/share/man/man1/mysqladmin.1.gz
/usr/share/man/man1/mysqldump.1.gz
/usr/share/man/man1/mysqlshow.1.gz
/usr/share/man/man1/mysqlslap.1.gz

/usr/bin/mysql/usr/bin/mysqldumpなどのバイナリや, /usr/share/doc/以下のドキュメント, /usr/share/man/以下に配置されるマニュアル(manコマンドで引けるもの)が設置されていることがわかります.

よく使われるパッケージの多くは, パッケージをインストールするマシンと同じアーキテクチャ上で予めコンパイルを実行してバイナリを生成しておき, そのバイナリをマシンに直接配置することによって, インストール時間の短縮を実現しています.

余談ではありますが, PRMパッケージをダウンロードする際などに「x86_64」や「i386」, 「noarch」などの文字列がパス名に含まれていることがありますが, これがそのパッケージが対応しているアーキテクチャです(例えば最近の64bitマシンの場合, 大抵「x86_64」になっていると思います. 「noarch」はアーキテクチャに依存しないもの, 例えばPerlのライブラリなどのパッケージに付いています).

...さて, 続いてmariadb-develの中身を見てみましょう.

$ rpm -ql mariadb-devel
/usr/bin/mysql_config
/usr/include/mysql
/usr/include/mysql/auth_dialog_client.h
/usr/include/mysql/client_plugin.h
/usr/include/mysql/decimal.h
/usr/include/mysql/errmsg.h
/usr/include/mysql/handler_ername.h
/usr/include/mysql/handler_state.h
/usr/include/mysql/keycache.h
/usr/include/mysql/m_ctype.h

    ... 中略 ...

/usr/include/mysql/sql_state.h
/usr/include/mysql/sslopt-case.h
/usr/include/mysql/sslopt-longopts.h
/usr/include/mysql/sslopt-vars.h
/usr/include/mysql/typelib.h
/usr/lib64/mysql/libmysqlclient.so
/usr/lib64/mysql/libmysqlclient_r.so
/usr/lib64/mysql/mysql_config
/usr/share/aclocal/mysql.m4
/usr/share/man/man1/mysql_config.1.gz

mariadb-develでは, /usr/lib64/mysql/libmysqlclient.so /usr/lib64/mysql/libmysqlclient_r.soなどといった共有ライブラリや, これらを利用する際に必要となるヘッダファイル(例えば, /usr/include/mysql/mysql.hなど)が設置されるようになっていることがわかります.

例えばPerlからDBD::mysqlを利用する場合, mariadb-develのインストールが必要になりますが, これはDBD::mysqlがMariaDB(MySQL)を利用する為に, PerlからCのコードを呼び出すXSという仕組みを利用していて, このコードをビルドする際にMariaDBの共有ライブラリやヘッダファイルが必要になるからです.

RPMパッケージを展開する

ちなみに, 実際にパッケージに含まれるファイルを見たい場合, rpm2cpiocpioを利用すれば, 次のように展開することが出来ます.

$ rpm2cpio rpm2cpio mariadb-5.5.41-2.el7_0.x86_64.rpm | cpio -id
$ ls
etc  mariadb-5.5.41-2.el7_0.x86_64.rpm  usr

RPMパッケージをダウンロードする

上記の「パッケージを展開する」を試す為には, RPMパッケージそのもの(拡張子が.rpmのファイル)が必要になりますが, これはyum-utilsをインストールすることで利用できるyumdownloaderを使えば簡単に取得することができます.

$ yumdownloader mariadb-devel
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
(1/2): mariadb-devel-5.5.41-2.el7_0.x86_64.rpm                                | 747 kB  00:00:10
(2/2): mariadb-devel-5.5.41-2.el7_0.i686.rpm                                  | 747 kB  00:00:10

まとめ

というわけで, RPMパッケージの中身を見る方法についてまとめました. RPM含めて, パッケージ管理ツールは無意識に(当たり前に)使っている感じがしますが, その中身はこういう風になっているんだなあ, と学びがありました.