CUBE SUGAR CONTAINER

技術系のこと書きます。

pyenv を使って Ubuntu に複数バージョンの Python をインストールする

今回は Python のインストールマネージャである pyenv を使って、簡単に複数のバージョンの Python を Ubuntu にインストールする方法を書く。 Python でソフトウェアを開発する際には、バージョン間の差異に配慮する必要がある。 そのため、開発する環境で使う Python のバージョンと実行する環境で使う Python のバージョンは、最低でもマイナーバージョンまでは揃えて開発することが望ましい。 そんなとき、開発ターゲットが色々とあるようなときはインストールマネージャが便利に使える。

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

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04 LTS
Release:    22.04
Codename:   jammy
$ uname -srm
Linux 5.15.0-41-generic aarch64
$ pyenv --version
pyenv 2.3.2

もくじ

pyenv をインストールする

pyenv のインストール方法はいくつかあるけど、今だと pyenv-installer のスクリプトを使うのが一番ラクそう。

$ curl https://pyenv.run | bash

インストールできたら、表示に沿って必要な設定をシェルに追加する。

$ cat << 'EOF' >> ~/.bashrc
export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
EOF
$ exec "$SHELL"

これで pyenv コマンドが使えるようになる。

$ pyenv --version
pyenv 2.3.2

あとは必要に応じて update しておこう。

$ pyenv update

pyenv で Python をビルドする

続いて pyenv を使って Python をビルドする。

ただし、その前に Python のビルドに必要となるパッケージをインストールする必要がある。 必要なパッケージは pyenv の wiki に記載がある。

github.com

上記を参照して必要なパッケージをインストールする。

$ sudo apt-get update; sudo apt-get install make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev

あとは pyenv install コマンドを使って特定のバージョンの Python をビルドできる。

$ pyenv install <version>

今回はシステムの Python が 3.10 系になっている。

$ python3 -V
Python 3.10.4

そのため、例としては Python 3.9 系をビルドしてみよう。 現時点 (2022-07) での最新版である 3.9.13 を指定する。

$ pyenv install 3.9.13

なお、デフォルトではビルドの際のログが最低限しか残らない。 そのため、必要に応じて -v オプションをつけると良い。 テキストファイルにログを残したいときは tee(1) と組み合わせて次のようにする。

$ pyenv install -v 3.9.13 2>&1 | tee build.log

で、ログを確認してみると、実は先述の wiki のパッケージだけだとビルドされない Optional なモジュールがあることが分かる。

$ grep -A 3 "The necessary bits to build these optional modules were not found:" build.log 
The necessary bits to build these optional modules were not found:
_dbm                  _gdbm                                    
To find the necessary bits, look in setup.py in detect_modules() for the module's name.

もし気になるようならビルドに必要なパッケージをインストールし直した上で、再度ビルドすれば良い。

$ sudo apt-get install libgdbm-dev libdb-dev
$ pyenv uninstall -f 3.9.13
pyenv: 3.9.13 uninstalled
$ pyenv install -v 3.9.13 2>&1 | tee build.log

最後に、pyenv で使用する Python のバージョンを ~/.pyenv/version に記載する。 この中で system はシステムにインストールされているデフォルトのバージョンを指す。 複数のパッチバージョンなどをインストールしているときは、ここで使うものを指定できる。

$ cat << 'EOF' > ~/.pyenv/version
system
3.9.13
EOF

これで、python3.9 が実行できるようになった。

$ python3.9 -V
Python 3.9.13

もちろん、先ほど ~/.pyenv/version に書いた通り、システムの Python も引き続き使うことができる。

$ python3 -V
Python 3.10.4

同様のやり方で複数のバージョンの Python をインストールできる。 ちなみに、Miniforge など Conda 系の実装も pyenv からインストールできるので便利。

いじょう。

まとめ

今回は pyenv を使って複数のバージョンの Python を Ubuntu にインストールする方法を紹介した。 なお、pyenv は Ubuntu だけでなく macOS など、色々な Unix 系の OS で利用できる。

また、Python の仮想環境の機能は pyenv の本体には組み込まれていない。 そのため pyenv-virtualenv プラグインを入れたり、自分で venv や virtualenv と組み合わせる必要がある。

blog.amedama.jp

Ubuntu の APT で入る Python 仮想環境系のパッケージを使う

最近は Docker などのコンテナ技術の台頭もあって、プログラミング言語に固有の仮想環境を使う人は以前より減った印象がある。 とはいえ、手元でササッと検証するときなどには便利なことに変わりはない。 今回は、Ubuntu を使って APT で入る Python の仮想環境系のパッケージについてまとめておく。 具体的には以下のとおりで、Conda 系に関しては扱わない。

  • python3-venv
  • python3-virtualenv
  • python3-virtualenvwrapper

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

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04 LTS
Release:    22.04
Codename:   jammy
$ uname -srm
Linux 5.15.0-41-generic aarch64
$ dpkg -l | egrep "(python3-venv|python3-virtualenv)"
ii  python3-venv                    3.10.4-0ubuntu2                         arm64        venv module for python3 (default python3 version)
ii  python3-virtualenv              20.13.0+ds-2                            all          Python virtual environment creator
ii  python3-virtualenv-clone        0.3.0-2                                 all          script for cloning a non-relocatable virtualenv (Python3)
ii  python3-virtualenvwrapper       4.8.4-4                                 all          extension to virtualenv for managing multiple environments (Py3)

もくじ

python3-venv

最初に紹介するのは Python が組み込みで提供する仮想環境の機能である venv モジュール。 Ubuntu の場合は、機能が固有のパッケージに分離されているので、個別にインストールする必要がある。

まずはパッケージをインストールする。

$ sudo apt-get install python3-venv

これで、Python の標準ライブラリとして venv モジュールが使えるようになる。 仮想環境を作るには次のようにする。 <name> には仮想環境の名前を入れるけど、これは要するに後述するディレクトリの名前になる。

$ python3 -m venv <name>

例えば example という名前で環境を作る。

$ python3 -m venv example

すると、実行したディレクトリに example というディレクトリができる。 この中に Python の実行環境が作られる。

$ find example -maxdepth 2 
example
example/bin
example/bin/pip3.10
example/bin/Activate.ps1
example/bin/python3
example/bin/python3.10
example/bin/pip
example/bin/activate
example/bin/activate.csh
example/bin/pip3
example/bin/activate.fish
example/bin/python
example/include
example/lib
example/lib/python3.10
example/pyvenv.cfg
example/lib64

環境を使うにはディレクトリの bin ディレクトリの中にある activate ファイルを source コマンドで読み込む。

$ source example/bin/activate

仮想環境を有効にして pip3 コマンドを使ってインストールされているパッケージを表示してみる。 すると、パッケージがほとんど入っていないまっさらな環境であることがわかる。

(example) $ pip3 list
Package    Version
---------- -------
pip        22.0.2
setuptools 59.6.0

あとはここに任意のパッケージをインストールして使えば良い。 これなら、システムの環境を汚すことなく検証ができる。

仮想環境から抜けるときは deactivate コマンドを実行する。

$ deactivate 

仮想環境を削除したいときは、単に前述のディレクトリを削除すれば良い。

python3-virtualenv

次に紹介するのは virtualenv パッケージで、こちらは venv よりも昔からある。 とはいえ、オプションなどを含めて使い勝手はほとんど venv と変わらない。

ひとまずインストールしておこう。

$ sudo apt-get install python3-virtualenv

仮想環境を作るときは virtualenv コマンドを使う。

$ virtualenv <name>

今回も example という名前で仮想環境を作ってみる。 なお、先ほど venv で作ったディレクトリが残ったままだとうまくいかないはずなので、必要に応じて削除する。

$ virtualenv example

実行すると、こちらも example という名前のディレクトリの中に Python の実行環境が作られる。

$ find example -maxdepth 2 
example
example/bin
example/bin/pip3.10
example/bin/wheel3
example/bin/deactivate.nu
example/bin/python3
example/bin/pip-3.10
example/bin/activate.nu
example/bin/activate_this.py
example/bin/wheel-3.10
example/bin/python3.10
example/bin/pip
example/bin/activate.ps1
example/bin/activate
example/bin/activate.csh
example/bin/wheel3.10
example/bin/wheel
example/bin/pip3
example/bin/activate.fish
example/bin/python
example/.gitignore
example/lib
example/lib/python3.10
example/pyvenv.cfg

仮想環境を有効にするやり方も、venv と同じ。

$ source example/bin/activate

仮想環境の中ではインストールされているパッケージがまっさらなのも同じ。

(example) $ pip3 list
Package    Version
---------- -------
pip        22.0.2
setuptools 59.6.0
wheel      0.37.1

仮想環境から抜ける方法も変わらない。

$ deactivate 

仮想環境を削除するのもディレクトリを削除すれば良いだけ。

python3-virtualenvwrapper

続いて紹介する virtualenvwrapper は、その名のとおり virtualenv のラッパーとして動作するスクリプトになっている。

ひとまずインストールする。

$ sudo apt-get install python3-virtualenvwrapper

インストールできたら、パッケージに含まれるシェルスクリプトを source コマンドであらかじめ読み込む。 これは、必要に応じてシェルの設定ファイルに記述すれば良い。

$ source /usr/share/virtualenvwrapper/virtualenvwrapper.sh

仮想環境を作るには mkvirtualenv コマンドを使う。

$ mkvirtualenv <name>

先ほどと同じように example という名前で作る場合には、次のとおり。

$ mkvirtualenv example

virtualenvwrapper の場合は、カレントワーキングディレクトリの下に仮想環境の入ったディレクトリが作られることはない。 また、環境を作った時点で自動的に環境がアクティベートされる。

(example) $ pip3 list
Package    Version
---------- -------
pip        22.0.2
setuptools 59.6.0
wheel      0.37.1

仮想環境から抜ける方法は virtualenv と変わらない。

(example) $ deactivate 

仮想環境のディレクトリは、デフォルトではホームディレクトリに .virtualenvs というパスにある。 以下に example というディレクトリが確認できる。

$ ls -1 ~/.virtualenvs/
example
get_env_details
initialize
postactivate
postdeactivate
postmkproject
postmkvirtualenv
postrmvirtualenv
preactivate
predeactivate
premkproject
premkvirtualenv
prermvirtualenv

作成済みの仮想環境をまた有効にするときは workon コマンドを使う。

$ workon example
(example) $

仮想環境を削除するときは、あらかじめ仮想環境から抜けた上で rmvirtualenv コマンドを実行する。

(example) $ deactivate
$ rmvirtualenv example

このように virtualenvwrapper は、あくまで virtualenv を便利にするためのラッパースクリプトに過ぎない。

いじょう。

Ubuntu の APT で特定パッケージの依存関係を調べる

今回は Debian 系のパッケージ管理で使われる APT (Advanced Packaging Tool) で特定パッケージの依存関係を調べる方法について。 結論から先に述べると apt-cache depends サブコマンドと apt-cache rdepends サブコマンドを使って調べられる。

使った環境は次のとおり。 最近の Ubuntu であれば特にディストリビューションのバージョンに依存する話ではないはず。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04 LTS
Release:    22.04
Codename:   jammy
$ uname -srm
Linux 5.15.0-41-generic aarch64
$ apt --version
apt 2.4.5 (arm64)

もくじ

依存しているパッケージを調べる

特定のパッケージが依存しているパッケージを調べるには apt-cache depends コマンドが使える。 <pkg-name> にはパッケージ名が入る。

$ apt-cache depends <pkg-name>

例えば python3 パッケージで試してみよう。

$ apt-cache depends python3
python3
  PreDepends: python3-minimal
  Depends: python3.10
  Depends: libpython3-stdlib
  Suggests: python3-doc
  Suggests: python3-tk
  Suggests: python3-venv
  Replaces: python3-minimal

上記において、実際に依存しているパッケージが PreDependsDepends として表示される。 Suggests は推奨なので無くても動作はする。

依存されているパッケージを調べる

反対に、そのパッケージがどのパッケージから依存されているか知りたいときは apt-cache rdepends サブコマンドを使う。

$ apt-cache rdepends <pkg-name>

今度も python3 パッケージで試してみよう。 ただし、めちゃくちゃ数が多いので head(1) を使って先頭だけ表示する。

$ apt-cache rdepends python3 | head
python3
Reverse Depends:
  python3-drslib
  cockpit-ws
  cockpit-storaged
  virtualbox
  virtualbox
  zfs-test
  xdg-desktop-portal-tests
  systemd-tests

なお、同じパッケージ名が複数出るときは、候補となるパッケージのバージョンごとに出てるっぽい

依存(して|されて)いるパッケージを一度に調べる

ちなみに apt-cache showpkg サブコマンドを使えば依存関係を一度に見ることもできる。 ただし、依存関係以外の情報も色々と載っているので、依存関係だけ知りたいときは少し見にくいかも。

$ apt-cache showpkg <pkg-name>

python3 パッケージを試すなら次のようにする。

$ apt-cache showpkg python3

上記を実行すると依存しているパッケージが Dependencies として、依存されているパッケージが Reverse Depends として確認できる。

いじょう。

Multipass の仮想マシンで X Window System のアプリケーションを使う

今回は Multipass で作った仮想マシン上で X Window System のアプリケーションを使う方法について。 やり方としては、Multipass の仮想マシンに ssh(1) を使ってログインできるようにした上で X11 Forwarding すれば良い。

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

$ sw_vers   
ProductName:    macOS
ProductVersion: 12.4
BuildVersion:   21F79
$ uname -srm
Darwin 21.5.0 x86_64
$ multipass version                                                                        
multipass   1.10.0+mac
multipassd  1.10.0+mac

もくじ

下準備

まずはローカルのマシンに X Server (XQuartz) と Multipass をインストールする。 今回は Homebrew を使って入れる場合の例になる。

$ brew install --cask xquartz multipass

XQuartz を初めてインストールする場合には、おそらくユーザの再ログインが必要になる。

そして、インストールした Multipass を使って仮想マシンを作る。 ここでは Ubuntu 20.04 LTS のホストを focal という名前で作成している。

$ multipass launch \
    --name focal \
    --cpus 2 \
    --mem 2048M \
    20.04

次のように仮想マシンが起動すれば良い。

$ multipass list       
Name                    State             IPv4             Image
focal                   Running           192.168.64.2     Ubuntu 20.04 LTS

仮想マシンに X Window System のアプリケーションをインストールする。 今回は例として x11-apps の xeyes(1) を使う。

$ multipass exec focal -- bash -c "sudo apt-get install x11-apps"

上記はワンライナーにしてあるけど、ログインした上で実行するのであれば次のようにする。 なお、ローカルのマシンと仮想マシンを区別するために、以降では仮想マシン上での操作はターミナルの先頭に (focal) とつけることにする。

$ multipass shell focal
(focal) $ sudo apt-get install x11-apps

公開鍵を仮想マシンに登録する

続いて、ローカルのマシンで生成した公開鍵を Multipass の仮想マシンに登録する。

もし、ローカルのマシンに公開鍵が無いときは、ssh-keygen(1) で作る。 オプションについてはお好みで。

$ ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa -P ''
$ ls ~/.ssh | grep id_rsa
id_rsa
id_rsa.pub

上記で作成した公開鍵を仮想マシンに登録する。 次のようなワンライナーで実行できる。 $(cat ~/.ssh/id_rsa.pub) の部分がローカルのマシンで生成した公開鍵にインラインで置換される。 <vm-name> の部分には仮想マシンの名前を入れる。

$ multipass exec <vm-name> -- bash -c "echo $(cat ~/.ssh/id_rsa.pub) >> ~/.ssh/authorized_keys"

今回であれば仮想マシンの名前は focal なので、次のとおり。

$ multipass exec focal -- bash -c "echo $(cat ~/.ssh/id_rsa.pub) >> ~/.ssh/authorized_keys"

ssh(1) で仮想マシンにログインする

公開鍵の登録ができたので、次は X11 Forwarding を有効にして ssh(1) で仮想マシンにログインする。

仮想マシンの IP アドレスは multipass info サブコマンドで取得できる。 ワンライナーで IP アドレスだけを抽出するには、次のようにすれば良い。

$ multipass info focal | grep IPv4 | awk '{print $2}'
192.168.64.2

上記の IP アドレスに ssh(1) でログインする。 このとき -X オプションを指定して X11 Forwarding する。

$ ssh -X \
    -o StrictHostKeyChecking=no \
    -o UserKnownHostsFile=/dev/null \
    ubuntu@$(multipass info focal | grep IPv4 | awk '{print $2}')

上記は仮想マシンのフィンガープリントをローカルのマシンに登録しない場合の例。 これは、Multipass を使っていると仮想マシンを作り直すことも多いため。

X Window System のアプリケーションを実行する

ログインできたら仮想マシン上で X Window System のアプリケーションを実行するだけ。

(focal) $ xeyes

上手くいけば次のようにウィンドウが表示されるはず。

xeyes(1) のウィンドウ

いじょう。

Vagrant の仮想マシンで X Window System のアプリケーションを使う

今回は Vagrant の仮想マシンで X Window System のアプリケーションを使う方法について。 これには、ローカルのマシンに X Server をインストールした上で、X11 Forwarding する必要がある。

使った環境は次のとおり。 Vagrant は ISA が x86 のマシンでしか動作しないので、ローカルが Intel Mac という状況は今後減っていくだろうけど。 ローカル環境ごとの違いは X Server のインストール方法くらいなので、特に支障はないはず。

$ sw_vers               
ProductName:    macOS
ProductVersion: 12.4
BuildVersion:   21F79
$ uname -srm
Darwin 21.5.0 x86_64
$ vagrant version | head -n 1
Installed Version: 2.2.19

もくじ

下準備

ローカルのマシンには X Server をインストールする。 macOS であれば XQuartz を入れれば良い。 下記は Homebrew を使って入れる場合のやり方。

$ brew install --cask xquartz

仮想マシンをセットアップする

適当なディレクトリに Vagrant の設定ファイルを作成する。 マシンイメージは、公式の Ubuntu 22.04 LTS を使った。

$ vagrant init ubuntu/jammy64

仮想マシンを起動する前に、設定ファイルに必要なオプションを指定する。 具体的には下記を Vagrantfile に追加する。 この設定がデフォルトの Vagrantfile にあればコメントアウトするだけで楽なんだけど、残念ながら無い。

config.ssh.forward_x11 = true

あとは仮想マシンを起動してログインする。

$ vagrant up && vagrant ssh

X Window System のアプリケーションを使う

仮想マシンにログインしたら、X Window System が必要になるので入れる。

$ sudo apt-get update
$ sudo apt-get -y install xserver-xorg

あとは X Window System のアプリケーションを使うだけ。 ここでは例として xeyes(1) を使う。

$ sudo apt-get -y install x11-apps
$ xeyes

うまくいけばアプリケーションのウィンドウが表示されるはず。

xeyes(1)

いじょう。

Ubuntu 22.04 LTS に後から GUI (X Window System) を追加する

サーバ版のインストールイメージを使ってセットアップした場合など、デフォルトで X Window System やデスクトップ環境が入っていないことがある。 しかし、後から必要になることも多い。 そこで、今回は Ubuntu 22.04 LTS にデスクトップ環境や X Window System を後から追加する場合のやり方を確認しておく。 なお、この確認は LTS 版のリリースが出る度に実施しているけど、やり方は Ubuntu 20.04 LTS と変わらなかった。

使った環境は次のとおり。 なお、下記は Vagrant で作成した仮想マシンを使っている。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04 LTS
Release:    22.04
Codename:   jammy
$ uname -srm
Linux 5.15.0-41-generic x86_64

もくじ

下準備

あらかじめリポジトリの情報を更新しておく。

$ sudo apt-get update

デスクトップ環境が必要な場合

デスクトップ環境が必要な場合は ubuntu-desktop パッケージをインストールする。

$ sudo apt-get -y install ubuntu-desktop

入るパッケージの数が多いので、相応に時間がかかる。

インストールが終わったらマシンを再起動する。

$ sudo shutdown -r now

再起動が終わると、グラフィカルモードでマシンが起動してくるはず。

Ubuntu 22.04 LTS のデスクトップ環境

X Window System だけで良い場合

デスクトップ環境は必要なくて、単に X Window System を使ったアプリケーションが使いたいだけという場合もある。 その場合は xserver-xorg パッケージをインストールすれば X Window System 関連の一式が入る。

$ sudo apt-get -y install xserver-xorg

後は X Window System を使ったアプリケーションを動かすだけ。 今回は試しに xeyes(1) を使ってみる。

$ sudo apt-get -y install x11-apps
$ xeyes

上手くいけば次のようにアプリケーションのウィンドウが表示されるはず。

xeyes(1)

補足

Vagrant を使って X Window System の動作確認をするには、ローカルのマシンに X Server が必要になる。

たとえば macOS を使っている場合には XQuartz をあらかじめインストールしておく。 以下は Homebrew を使った場合のインストール方法になる。

$ brew install --cask xquartz

また、Vagrant で X11 Forwarding をするには、Vagrantfile に下記の設定を入れておく必要がある。

config.ssh.forward_x11 = true

いじょう。

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

いじょう。