Ubuntuで環境構築をしていると、ソフトを入れるコマンドがいくつか出てきます。
たとえば curl を入れるときは、こんなコマンドでした。
sudo apt install curl
一方で、Postmanを入れるときはこうでした。
sudo snap install postman
どちらも「何かをインストールしている」ことは分かります。
でも、片方は apt、もう片方は snap。
apt と snap では何が違うのでしょうか?
普段は気にせずに apt を使っていましたが、 snap というものに出会ったのでそちらを調べてみました。
ざっくり結論
apt と snap は、どちらもUbuntuでソフトをインストールするときに使うパッケージ管理ツールになります。
ただし、扱っているものや管理のされ方が違います。
| コマンド | 何をしているか | よく見る場面 |
|---|---|---|
sudo apt install curl |
APTの仕組みで curl を入れる |
CLIツール、サーバー系のソフト |
sudo snap install postman |
snapの仕組みでPostmanを入れる | GUIアプリ、単体アプリ |
CLI系なら必ず apt、GUI系なら必ず snap という話ではありませんが、
-
apt: Ubuntu/Debian系でよく使うパッケージ管理 -
snap: アプリをまとまった形で配布・管理する仕組み
くらいに捉えると分かりやすかったです。
そもそもパッケージ管理ツールとは
apt や snap は、どちらもパッケージ管理ツールになります。
| やりたいこと | 例 |
|---|---|
| ソフトを入れる |
curl を入れる |
| ソフトを消す | 使わなくなったアプリを消す |
| ソフトを更新する | 新しいバージョンにする |
| 必要な部品も一緒に扱う | そのソフトが動くためのライブラリも入れる |
なんらかのソフトをインストールする際に、そのソフトを入れる、更新する、削除するなどの操作をおこなうツールになります。
その代表的なものが apt で、Ubuntuでは snap もよく出てきます。
aptとは
apt は、UbuntuやDebian系のLinuxでよく使われるパッケージ管理ツールです。
たとえば、次のように使います。
sudo apt update
sudo apt install curl
sudo apt update は、インストールできるソフトの一覧を更新するコマンドです。
sudo apt install curl は、その一覧をもとに curl をインストールするコマンドです。
ここで出てくる curl は、ターミナルからHTTPリクエストを送ったり、APIの動作確認をしたりするときによく使うCLIツールです。
こういうコマンドラインで使う基本的なツールは、apt で入れる例が公式のドキュメントなどに書かれています。
snapとは
snap は、Canonicalが提供しているパッケージ管理の仕組みです。
CanonicalはUbuntuを作っている会社です。
snapは、アプリ本体と必要なものをまとめて配布しやすい形式です。
PostmanのようなGUIアプリでは、snapでインストールする手順を公式ドキュメントで見かけることがあります。
sudo snap install postman
apt と snap は別々のパッケージ管理ツールになります。
aptとsnapの違い
細かく見ればもっと違いはあるとは思いますが、おおよそ下記のような整理で私は理解しました。
| 観点 | apt | snap |
|---|---|---|
| 扱うもの | debパッケージ | snapパッケージ |
| ソフトの置き場 | APTに設定されたリポジトリ | 主にSnap Store |
| 更新 | 一覧更新は apt update、更新は apt upgrade
|
自動更新される。手動なら snap refresh
|
| よく見る例 |
curl, git, nginx
|
Postman, Slack, VS Code など |
| 初心者向けの見方 | Ubuntu標準寄りの入れ方 | アプリ単位でまとまった入れ方 |
この表で一番大事なのは、apt と snap は「同じ場所から同じ形式のものを取ってきているわけではない」という点です。
どちらもインストールコマンドではありますが、裏側の管理方法が異なっているようです。
仕組みの違いはどこか
apt で入れるdebパッケージは、アプリが必要とするライブラリをOS側の共有ライブラリに頼ることが多いです。
共有ライブラリというのは、複数のアプリが同じ部品を使い回すようなイメージです。
そのため、必要なものを全部アプリごとに抱え込まなくてよく、比較的軽く管理しやすいです。
一方で、アプリ同士が同じ部品を共有しているため、ライブラリのバージョン違いでうまく動かない、という問題が起きることもあります。
特に、外部リポジトリを追加したり、複数の入れ方が混ざったりすると、このあたりで詰まりやすくなります。
いわゆる「依存関係で詰まる」というやつです。
snap は少し考え方が違います。
snapパッケージは、アプリ本体と必要なものをまとめて配布しやすい形式です。
そのぶん容量は大きくなりやすいですが、環境による差を減らしやすくなります。
また、snapにはアプリをある程度隔離して動かす考え方があります。
かなりざっくり言うと、
-
apt: OS側の共有部品を使いながら入れる -
snap: アプリと必要なものをまとめて、隔離された形で入れる
という違いです。
図にすると、かなり単純化していますがこういうイメージです。
どう使い分けるか
curl や git、nginx のようなコマンドラインツールやサーバー用途のソフトは、apt で十分なことが多いようです。
OS標準のパッケージ管理に乗るので、軽く扱いやすく、Ubuntuの環境とも相性がよいです。
一方で、GUIアプリや、公式リポジトリにないアプリ、比較的新しいバージョンを使いたいアプリでは、snap が候補になります。
たとえば、Slack、VS Code、Chromiumのようなデスクトップアプリでは、snapでの配布を見かけることがあります。
なんにせよ、公式ドキュメントやチームの手順があるなら、それを優先するのが一番安全になりますね。特に公式ドキュメントの確認は必須です。
まとめ
apt と snap は、どちらもUbuntuでソフトをインストールするために使います。
ただし、扱っているパッケージの形式や、ソフトの配布元、更新のされ方が違います。
apt はOS側の共有部品を使いながら軽く管理しやすい。
snap はアプリと必要なものをまとめて、環境差を減らしやすい。
linuxはエンジニアであるならばほぼ必ず触るものだと思うので、少しずつ学習していきたいです。
また気になったことがあればlinux関係も記事を書いて、アウトプットしていこうと思います。