aptとSnapは共存する

2つのパッケージ管理システムを同時に使用するとインストール物が衝突して使い物にならないような気がするが、Snapは単体での独立性が高く、aptなどのデフォルトのパッケージ管理システムと同時に利用できるという特徴がある。例えば、ユーティリティコマンドである「tree」は、次のようにaptコマンドからもsnapコマンドからもインストールできる。

■aptコマンドでtreeコマンドをインストール

sudo apt install tree

■snapコマンドでtreeコマンドをインストール

sudo snap install tree

コマンド名だけで実行すると次のような結果が得られる。

treeコマンドの実行例

aptコマンドからインストールしたtreeとsnapコマンドからインストールしたtreeのどちらが使われているかは、環境変数PATHの設定によって変わってくる。この辺りはディストリビューションごとに変わる部分だ。例えば、Ubuntu 18.04 LTSだと次のようにaptコマンドからインストールしたtreeコマンドのほうが優先的に使われる設定になっている。

daichi@ubuntu1804:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
daichi@ubuntu1804:~$ whereis tree
tree: /usr/bin/tree /snap/bin/tree /usr/share/man/man1/tree.1.gz
daichi@ubuntu1804:~$ which -a tree
/usr/bin/tree
/snap/bin/tree
daichi@ubuntu1804:~$

Ubuntu 18.04 LTSでは/usr/bin/treeのほうが実行されている

では、実際にどのような仕組みで区別されているのか、ちょっとだけ掘り下げてみよう。

Snapの仕組みをちょっとだけ掘り下げる

/usr/bin/treeと/snap/bin/treeは、単純に考えれば同じバイナリファイルがインストールされるのだろうと思うところだが、実際にはまるで別のバイナリになっている。実行してみると、どちらも同じバージョン番号を表示するものの、lddコマンドで依存してるライブラリを調べてみると、/snap/bin/treeは「libpthread」を使っていることがわかる。これは/usr/bin/treeでは使っていないものだ。

/usr/bin/treeと/snap/bin/treeはもしかして別モノ?

/snap/bin/treeを調べてみると、これは/usr/bin/snapへのシンボリックシンクになっていることがわかる。/snap/bin/treeはtreeコマンドのバイナリファイルではないわけだ。つまり、「/usr/bin/snapというバイナリが何かいろいろ処理をして、最終的にsnap版のtreeバイナリが実行される」という仕組みになっていることになる。

/snap/bin/*は、全て/usr/bin/snapへのシンボリックリンク

では、どこに本体があるのか。treeの場合は/snap/tree/current/bin/treeが本体になっている。

snap版treeコマンドの本体は/snap/tree/current/bin/tree

/snap/tree/current/bin/treeを実行すれば、treeコマンドとして動作していることを確認できる。

/snap/tree/current/bin/treeがtreeコマンドとして機能している

では、/usr/bin/treeと/snap/tree/current/bin/treeがまったく別物かと言うと、必ずしもそうとは限らない。例えば、執筆現在のSnap版treeコマンドには次のようにデバッグ情報が付いていて、さらにそのバイナリはストリップされていない状態になっている。Snap版treeパッケージの開発者が、デバッグ版として位置づけてビルドしているものであることがわかる。

Snap版treeとaptのtreeは別ビルドのパッケージ

では、なぜSnapのほうでは一旦/usr/bin/snapというバイナリを経由してtreeコマンドを実行しているのか。Snapとして機能するためにいろいろな前処理をやっているのがsnapコマンドということになる。次のように「strace」でシステムコールの呼び出しを追ってみても、/snap/bin/tree(つまり/usr/bin/snap)がtree本体を呼び出す前に複数の処理を行っていることを確認できる。

/usr/bin/treeを実行

/snap/bin/treeを実行

使う分にはこうした仕組みを知る必要はないのだが、まったく同じパッケージというわけではなく、別物だということを知っておいていただきたい。

aptを使うべきかSnapを使うべきか

aptは長い期間に渡って使われ続けており、ユーザー数も多い。逆にSnapはaptと比べれば若いパッケージ管理システムだ。まだSnapパッケージに移植されたばかりのツールやユーティリティ、アプリケーションも多く、作りが甘いものもある。Snapを使えば完璧に事が済むという状況でもないのが現実だ。

どちらを使っていくべきかは今のところケースバイケースだが、筆者としては気がついた範囲で徐々にSnapに移していくというのは悪くない方法ではないかと思っている。Snapが廃れる可能性がないわけでもないが、Linuxディストリビューションごとにパッケージを用意するというのは面倒だ。そう考えるとSnapはサードパーティベンダにとっては魅力的なので、今後も生き残り続ける可能性は高いように思う。今のうちから慣れておいて損はないパッケージ管理システムだろう。