主に 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
いじょう。