Fujitsu Cloud Direct ブログ

初心者エンジニア向け技術ブログ

Ubuntuについて知ろう 〜 もうひとつのパッケージシステム「Snap」を使いこなす

こんにちは。日本仮想化技術株式会社の水野です。

Ubuntuでは、Debian GNU/Linuxを起源とする「Deb」という形式のパッケージを採用しています。こちらのエントリーでパッケージとサポート期間について紹介しましたが、これはすべて、Deb形式で提供されているパッケージについての話となります。

実はUbuntuではDebの他にもうひとつ、Snapと呼ばれる新しいパッケージシステムが採用されています。今回はこのSnapの特徴やメリット、使い方について解説します。

Debパッケージが抱える問題とは

Ubuntuでは、OSを構成するあらゆるソフトウェアをパッケージの形式で提供しています。これらはすべて、いわば「OSの一部」として、Ubuntuの各リリースごとにビルドし直され、テストされた上でリリースされます。そしてUbuntuのサポート期間の間、セキュリティサポートやバグ修正といった対応が行われます。

パッケージは一旦リリースされると、一部の例外を除き、バージョンそのものは変更されません。具体的な例を挙げると、Ubuntu 20.04 LTSのPHPは、バージョン7.4が採用されています。2023年12月現在、PHPの最新安定板は8.3ですが、Ubuntu 20.04では7.4のままです。Ubuntu 20.04 LTSは通常サポートが2025年までありますが、いつまで経ってもPHPが7.4から上がることはありません。

これはこれでメリットでもあります。PHPの例で言えば、バージョン7.4は2022年11月に、既に開発元のサポートが終了しています。ですがUbuntuのパッケージを使っていれば、Canonicalがセキュリティアップデートをバックポートしてくれるため、2025年まで7.4を使い続けられるのです。「古いバージョンを安全に使い続けられる」というのは、サーバーにおいては必ずしもデメリットとは言えません。

ですが進化の早いデスクトップアプリでは、また事情が異なります。5年後も、今のバージョンのアプリを使い続けなければならないのは苦痛でしょう。

しかしOSが提供しているパッケージは、そう簡単に入れ替えることはできません。Ubuntuに限らずですが、この手のパッケージは「依存関係」を持っています。あるパッケージAが動作するには、パッケージBが必要で、パッケージBが動作するには、パッケージCが提供するライブラリが必要で……といった具合です。そのため迂闊にパッケージのバージョンを変更してしまうと、依存している他のアプリや、OSの機能を壊してしまうかもしれないのです。こうした理由により、リリース後にアプリの新バージョンを投入することは、基本的にはできません。

つまりOSのパッケージを使っていると、アプリのバージョンがOSのライフサイクルに縛られてしまい、自由なバージョンアップができないのです。

この原因はすべて、パッケージ間に依存関係があるせいです。パッケージが単独で完結し、副作用なしに入れ替えられるのであれば、こうした問題は発生しません。そこで依存関係をなくした、新しいパッケージシステムが考え出されました。こうしたパッケージは依存関係を持たないという特性上、Linuxシステムでありさえすれば、ベースOSの違いを意識せずに動かすことができます。そこから「ユニバーサルパッケージ」と呼ばれています。

Snapとは

ユニバーサルパッケージとは、簡単に言えば、AndroidやiOSに近い感覚でアプリを管理できるパッケージシステムです。ユニバーサルパッケージにはいくつかの実装があり、そのうちのひとつがUbuntuで採用されている「Snap」です*1

現在Ubuntuではサーバー/デスクトップを問わず、デフォルトでSnapが使えるようになっています。なおSnapはDebを完全に置き換えるものではなく、Debを補完するかたちで共存するものという立ち位置ですが、Sanpでしか提供されなくなったアプリも存在します。例えばUbuntuのデフォルトWebブラウザーであるFirefoxは、現在Snapでしか提供されていません。

snapコマンドの使い方

Snapはsnapコマンドで操作します。基本的な使い方を説明しましょう。

パッケージの検索

snapコマンドはaptと同様に、動作を指定するサブコマンドとセットで使います。まずはどんなパッケージが提供されているのか調べましょう。「snap find」コマンドは、引数に指定した検索ワードをもとに、パッケージを検索します。例えば以下のようにコマンドを実行すると、「emacs」に関連するパッケージを検索できます。

$ snap find  emacs
Name             Version                         Publisher        Notes    Summary
emacs            29.1                            alexmurray✪      classic  GNU Emacs is the extensible self-documenting text editor
emacs-tealeg     24.5                            tealeg           -        GNU Emacs 24.5
(...略...)

Ubuntu 22.04 LTSでは、UbuntuのリポジトリからDebで提供されているEmacsはバージョン27.1です。ですがSnapを使えば、最新の29.1をインストールできそうですね。

パッケージ情報の表示

「snap info」コマンドで、パッケージの詳細情報を表示できます。引数には対象とするパッケージ名を指定してください。例としてemacsパッケージの詳細情報を表示してみましょう。

$ snap info emacs   
name:      emacs
summary:   GNU Emacs is the extensible self-documenting text editor
publisher: Alex Murray (alexmurray✪)
store-url: https://snapcraft.io/emacs
contact:   https://github.com/alexmurray/emacs-snap/issues
license:   GPL-3.0+
description: |
  Emacs is the extensible, customizable, self-documenting real-time
  display editor.
(...略...)  

パッケージのインストール

パッケージのインストールには「snap install」コマンドを使います。これももちろん、対象のパッケージを引数に指定します。Emacsをインストールするには以下のように実行します。パッケージの検索等とは異なり、インストールにはroot権限が必要なため、sudoをつける点に注意してください。

$ sudo snap install emacs --classic

Snapパッケージでインストールされたアプリケーションは、セキュリティ上の理由から、サンドボックス内に隔離された状態で実行されます。そのため許可されていないリソースにはアクセスできません。ですがアプリケーションによっては、ホストが持つ様々なリソースにアクセスする必要があるでしょう。「--classic」オプションは、従来のDebパッケージと同様に、システムのリソースにアクセスできるようにする指定です。emacsパッケージのインストールにはこのオプションが必須となります。なおclassicオプションは、特別に承認されたパッケージにのみ許可されています。classicを指定すればどんなパッケージでもサンドボックスの外に出せる、というわけではありません。

パッケージのアップデート

「snap refresh」コマンドで、インストール済みのパッケージをアップデートできます。引数にパッケージ名を指定した場合はそのパッケージを、引数を省略した場合はすべてのパッケージが対象となります。

$ sudo snap refresh

ただしSnapはバックグラウドで自動アップデートを行っているため、明示的にrefreshしないといけないシーンは、後述するチャネルの切り替え以外ではほとんどないでしょう。

チャネルの変更

先ほど「snap info」した際、以下のような表示に気づいたでしょうか。

$ snap info emacs
(...略...)
channels:
  latest/stable:    29.1                   2023-09-23 (2249) 345MB classic
  latest/candidate: 29.1                   2023-09-23 (2249) 345MB classic
  latest/beta:      29.1                   2023-09-23 (2249) 345MB classic
  latest/edge:      30.0.50-master-cf11fdf 2023-12-04 (2300) 347MB classic
(...略...)

Snapには「リリースチャネル」という概念があります。簡単に言えば、同名パッケージの別バージョンを並行して提供し、自由に切り替えられる仕組みです。どのようなチャネルが用意されているかはパッケージごとに異なりますが、基本的に「latest/edge」「latest/stable」「latest/candidate」「latest/beta」の4つのチャネルは、どのパッケージにも用意されています。チャネルを特に指定しない場合は、デフォルトで「latest/stable」チャネルが使用されるため、ここで最新の安定板を配布するのが一般的です。それ以外のチャネルの使い方は、開発者に一任されているため、まったく使っていないパッケージも存在します。

上記のEmacsの例であれば、stable/candidate/betaチャネルはいずれも同じバージョン29.1を配布していますが、edgeチャネルでは開発中のバージョン30.0(の特定コミットのスナップショット)が配布されていることがわかります。インストール時に「--channel」オプションを指定すれば、stableチャネル以外からパッケージをインストールできます。以下のコマンドを実行して、開発版のEmacsをインストールしてみましょう。

$ sudo snap install emacs --channel=latest/edge

インストール済みのパッケージのチャネルを変更したい場合は、refreshコマンドを使います。

$ sudo snap refresh emacs --channel=latest/edge

このように手軽にバージョンを入れ替えられるのも、パッケージが自己完結しているSnapのメリットです。もちろんstableチャネルに切り戻して、バージョンをロールバックすることも簡単です。

パッケージのアンインストール

パッケージのアンインストールには「snap remove」コマンドを使います。インストールは「install」なのに、アンインストールは「uninstall」でない点に気をつけましょう。

$ sudo snap remove emacs

Nextcloudサーバーを秒速で構築する

NextcloudというWebアプリがあります。一言で言えば、Dropboxのようなファイル共有サービスをセルフホストできるオープンソースソフトウェアです。

NextcloudはPHP製のWebアプリです。そのためNextcloudを動かすには、WebサーバーとPHPが必要です。またそれ以外にも、バックエンドとしてデータベースやキャッシュサーバーも必要です。Webアプリのセットアップをしたことがある人なら理解できると思いますが、これらのミドルウェアをそれぞれインストールし、適切に設定して連携させるのは結構面倒な作業です。またアプリのバージョンアップといった今後の運用も、考えるだけで頭が痛くなりますよね。

そこでSnapパッケージです。Snapのnextcloudパッケージには、Apache HTTPサーバー、PHP、MySQL、Redisなど、必要なミドルウェアがすべて含まれており、このパッケージをインストールするだけでNextcloudを動かすことができます。もちろんパッケージをアップデートすれば、これらのコンポーネントすべてが更新されます。nextcloudパッケージはSnapパッケージの最高傑作のひとつだと、筆者は思っています。

まず以下のコマンドでパッケージをインストールします。

$ sudo snap install nextcloud

以上です。これでもうNextcloudが起動しています。WebブラウザーからサーバーのIPアドレスにアクセスすると、初期セットアップ画面が表示されますので、管理者アカウントを作成してください。

ちなみに初期セットアップ画面は誰でもアクセスできてしまうため、完了するまでサーバーをインターネットには公開しないようにしよう。

アカウントを作成したら、もう使いはじめることができます。クライアントをインストールすれば、自動でファイルの同期が行われます。

Nextcloudのファイルブラウザー画面。拍子抜けするくらい簡単に動かすことができた。

今時のWebアプリでしたら、当然SSL/TLSに対応したいですよね。なんとこれも、専用のコマンドを実行するだけで完了します。以下のコマンドを実行すると、Let's EncryptによるSSL証明書の取得とデプロイ、Webサーバーの再起動が行われます*2

$ sudo nextcloud.enable-https lets-encrypt

コマンドひとつでSSL/TLS化も完了する。

なお実際にNextcloudサーバーをインターネットに公開するには、ファイアウォール等のセキュリティ対策をしっかり行ってください。本記事ではこのあたりを省略しているため、ご注意ください。

まとめ

Snapはユニバーサルパッケージの実装のひとつです。パッケージ間の依存関係をなくしてポータビリティを向上させることで、ベースOSに縛られず、自由にアプリケーションを利用できます。

こう聞くと、気づいた人もいるでしょう。アプリケーション実行環境をカプセル化することで、OSのライフサイクルとアプリケーションの分離を可能にする。そう、ユニバーサルパッケージの発想自体は、コンテナとまったく同じなのです。そして複雑なアプリを自己完結させられるメリットは、Nextcloudの例の通りです。

また繰り返しになりますが、SnapはDebを完全に置き換えるものではありません。Snapには仕様上の制限もあり、Debとまったく同じユーザビリティを提供できるとも限りません。SnapはUbuntuのリリースサイクルと噛み合わないアプリを使いたい場合に、Debを補完するかたちで、適材適所で利用するのがお勧めです。

最後に宣伝です。 今なら、最大半年無料でサーバー主になれるチャンスです。 ぜひ、FJCloud-Vをお試しください。Ubuntuもイメージ提供中です。
こちらをクリック↓↓↓↓↓↓↓

*1:他にはAppImageやFlatpakといったものがあります。

*2:事前にDNSレコードを登録したり、インターネットからサーバーにHTTPでアクセスできるようにする必要がありますが、詳細は省略します。