CUBE SUGAR CONTAINER

技術系のこと書きます。

RPM 形式のパッケージからファイルを取り出す

主に RHEL 系の GNU/Linux ディストリビューションで採用されている RPM 形式のパッケージファイルからファイルを取り出す方法について。 必要になってたまに調べることになるのでメモとして残しておく。

使った環境は次のとおり。

$ cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)
$ uname -srm
Linux 3.10.0-1160.71.1.el7.x86_64 x86_64
$ rpm -q rpm
rpm-4.11.3-48.el7_9.x86_64
$ rpm -q cpio
cpio-2.11-28.el7.x86_64

もくじ

下準備

あらかじめ必要なパッケージとして rpm と cpio をインストールしておく。 一般的な環境であれば最初から入っているはず。

$ sudo yum install rpm cpio

また、動作確認のための RPM ファイルとして epel-release をダウンロードしておく。

$ sudo yum install --downloadonly --downloaddir=. epel-release
$ file epel-release-7-11.noarch.rpm 
epel-release-7-11.noarch.rpm: RPM v3.0 bin noarch epel-release-7-11

ファイルを取り出す

RPM 形式のパッケージからファイルを取り出すには、一旦 cpio 形式のアーカイブファイルに変換する。 そして、変換した cpio 形式のアーカイブからファイルを取り出せば良い。

ワンライナーで書くなら次のような感じ。 rpm2cpio(8) で形式を変換して、cpio(1) でファイルを展開する。

$ rpm2cpio epel-release-7-11.noarch.rpm | cpio -idv
./etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
./etc/yum.repos.d/epel-testing.repo
./etc/yum.repos.d/epel.repo
./usr/lib/systemd/system-preset/90-epel.preset
./usr/share/doc/epel-release-7
./usr/share/doc/epel-release-7/GPL
51 blocks

上記で使用している cpio(1) のオプションは、それぞれ次のような意味になっている。

  • -i
    • 抽出 (extract) モード
  • -d
    • 必要に応じてディレクトリを作成する
  • -v
    • 詳細モード

行を分けるなら次のとおり。 標準入力からデータを受け取らない場合、cpio(1) は -F オプションで入力ファイルを選択できる。

$ rpm2cpio epel-release-7-11.noarch.rpm > epel-release-7-11.noarch.rpm.cpio
$ file epel-release-7-11.noarch.rpm.cpio 
epel-release-7-11.noarch.rpm.cpio: ASCII cpio archive (SVR4 with no CRC)
$ cpio -idv -F epel-release-7-11.noarch.rpm.cpio 
./etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
./etc/yum.repos.d/epel-testing.repo
./etc/yum.repos.d/epel.repo
./usr/lib/systemd/system-preset/90-epel.preset
./usr/share/doc/epel-release-7
./usr/share/doc/epel-release-7/GPL
51 blocks

cpio(1) は展開先のディレクトリはオプションで指定できない。 そのため、必要に応じてカレントワーキングディレクトリを変更して実行する必要がある。

$ mkdir out
$ cd out
$ rpm2cpio ../epel-release-7-11.noarch.rpm | cpio -idv
./etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
./etc/yum.repos.d/epel-testing.repo
./etc/yum.repos.d/epel.repo
./usr/lib/systemd/system-preset/90-epel.preset
./usr/share/doc/epel-release-7
./usr/share/doc/epel-release-7/GPL
51 blocks

いじょう。