パッケージ管理システム「Snap」(その3)

【連載】

にわか管理者のためのLinux運用入門

【第141回】パッケージ管理システム「Snap」(その3)

[2018/08/28 09:30]後藤大地 ブックマーク ブックマーク

サーバ/ストレージ

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はサードパーティベンダにとっては魅力的なので、今後も生き残り続ける可能性は高いように思う。今のうちから慣れておいて損はないパッケージ管理システムだろう。

※ 本記事は掲載時点の情報であり、最新のものとは異なる場合がございます。予めご了承ください。

関連リンク

この記事に興味を持ったら"いいね!"を Click
Facebook で IT Search+ の人気記事をお届けします
3993
2
【連載】にわか管理者のためのLinux運用入門 [141] パッケージ管理システム「Snap」(その3)
2つのパッケージ管理システムを同時に使用するとインストール物が衝突して使い物にならないような気がするが、Snapは単体での独立性が高く、aptなどのデフォルトのパッケージ管理システムと同時に利用できるという特徴がある。今回はSnapがどのような仕組みを使っているのか、ちょっとだけ入り口を覗いてみよう。
https://news.mynavi.jp/itsearch/files/mynavi20151210_linux_300-250.jpg
2つのパッケージ管理システムを同時に使用するとインストール物が衝突して使い物にならないような気がするが、Snapは単体での独立性が高く、aptなどのデフォルトのパッケージ管理システムと同時に利用できるという特徴がある。今回はSnapがどのような仕組みを使っているのか、ちょっとだけ入り口を覗いてみよう。

会員登録(無料)

注目の特集/連載
AI人材に必要なもの
DMM.make AKIBAから生まれたスタートアップたち
はじめてのRPA導入
教えてカナコさん! これならわかるAI入門
RPA入門
PowerShell Core入門
Swagger 3.0 入門
徹底研究! ハイブリッドクラウド
マイナビニュース スペシャルセミナー 講演レポート/当日講演資料 まとめ

一覧はこちら

今注目のIT用語の意味を事典でチェック!

一覧はこちら

ページの先頭に戻る