aptとSnapは共存する
2つのパッケージ管理システムを同時に使用するとインストール物が衝突して使い物にならないような気がするが、Snapは単体での独立性が高く、aptなどのデフォルトのパッケージ管理システムと同時に利用できるという特徴がある。例えば、ユーティリティコマンドである「tree」は、次のようにaptコマンドからもsnapコマンドからもインストールできる。
■aptコマンドでtreeコマンドをインストール
sudo apt install tree
■snapコマンドでtreeコマンドをインストール
sudo snap install 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:~$
では、実際にどのような仕組みで区別されているのか、ちょっとだけ掘り下げてみよう。
Snapの仕組みをちょっとだけ掘り下げる
/usr/bin/treeと/snap/bin/treeは、単純に考えれば同じバイナリファイルがインストールされるのだろうと思うところだが、実際にはまるで別のバイナリになっている。実行してみると、どちらも同じバージョン番号を表示するものの、lddコマンドで依存してるライブラリを調べてみると、/snap/bin/treeは「libpthread」を使っていることがわかる。これは/usr/bin/treeでは使っていないものだ。
/snap/bin/treeを調べてみると、これは/usr/bin/snapへのシンボリックシンクになっていることがわかる。/snap/bin/treeはtreeコマンドのバイナリファイルではないわけだ。つまり、「/usr/bin/snapというバイナリが何かいろいろ処理をして、最終的にsnap版のtreeバイナリが実行される」という仕組みになっていることになる。
では、どこに本体があるのか。treeの場合は/snap/tree/current/bin/treeが本体になっている。
/snap/tree/current/bin/treeを実行すれば、treeコマンドとして動作していることを確認できる。
では、/usr/bin/treeと/snap/tree/current/bin/treeがまったく別物かと言うと、必ずしもそうとは限らない。例えば、執筆現在のSnap版treeコマンドには次のようにデバッグ情報が付いていて、さらにそのバイナリはストリップされていない状態になっている。Snap版treeパッケージの開発者が、デバッグ版として位置づけてビルドしているものであることがわかる。
では、なぜSnapのほうでは一旦/usr/bin/snapというバイナリを経由してtreeコマンドを実行しているのか。Snapとして機能するためにいろいろな前処理をやっているのがsnapコマンドということになる。次のように「strace」でシステムコールの呼び出しを追ってみても、/snap/bin/tree(つまり/usr/bin/snap)がtree本体を呼び出す前に複数の処理を行っていることを確認できる。
使う分にはこうした仕組みを知る必要はないのだが、まったく同じパッケージというわけではなく、別物だということを知っておいていただきたい。
aptを使うべきかSnapを使うべきか
aptは長い期間に渡って使われ続けており、ユーザー数も多い。逆にSnapはaptと比べれば若いパッケージ管理システムだ。まだSnapパッケージに移植されたばかりのツールやユーティリティ、アプリケーションも多く、作りが甘いものもある。Snapを使えば完璧に事が済むという状況でもないのが現実だ。
どちらを使っていくべきかは今のところケースバイケースだが、筆者としては気がついた範囲で徐々にSnapに移していくというのは悪くない方法ではないかと思っている。Snapが廃れる可能性がないわけでもないが、Linuxディストリビューションごとにパッケージを用意するというのは面倒だ。そう考えるとSnapはサードパーティベンダにとっては魅力的なので、今後も生き残り続ける可能性は高いように思う。今のうちから慣れておいて損はないパッケージ管理システムだろう。