「RPMパッケージって, 具体的には何が入っているの?」みたいな話が社内であったので, RPMパッケージの中身を見る方法について調べてみました.
今回は, Vagrantで動かしているCentOS 7.0上で, mariadb
とmariadb-devel
を題材にして, RPMパッケージの中身を見つつ, mariadb
とmariadb-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パッケージを展開する
ちなみに, 実際にパッケージに含まれるファイルを見たい場合, rpm2cpio
とcpio
を利用すれば, 次のように展開することが出来ます.
$ 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含めて, パッケージ管理ツールは無意識に(当たり前に)使っている感じがしますが, その中身はこういう風になっているんだなあ, と学びがありました.