Windows Terminalの強みの一つは、WSL(Windows Subsystem for Linux)を活用してWindows上で複数のLinux環境を簡単に使い分けられることだ。ただし、それぞれのLinux環境は個別にアプリケーションのインストールやアップデートなどを行って適切に保守しなければならず、そのためには各ディストリビューションで利用されるパッケージマネージャを使い分ける必要がある。

そこで前回は、主要なパッケージ管理システムについて簡単に紹介した上で、UbuntuやDebian Linuxで利用される「APT」の使用方法について取り上げた。今回は複数のディストリビューションで利用可能な「Snappy(Snap)」について解説したい。

「Snappy」とは

「Snappy」は、Ubuntuの開発元であるCanonicalが設計/開発したパッケージ管理システムである。Debian系のAPTやRed Hat系のdnfなどと異なり、Snappyはシステムにインストールされているライブラリに依存しないため、ディストリビューションに関係なくさまざまな環境で利用できる点が大きな特徴となっている。

Snappyのパッケージは「Snap」と呼ばれ、Snapを扱うためのバックエンドのソフトウエアとして「snapd」が用意されている。コマンドラインインタフェースはsnapコマンドで、aptなどと同様にsnapコマンドにサブコマンドを組み合わせることでパッケージの管理を行う。

Snapパッケージはそれぞれが独立性の高い構成になっており、ほかのパッケージに依存せずに単体でインストール可能となっている。そのため、パッケージごとに個別にアップデートしたり、アップデート後にバージョンを差し戻したりといったことが簡単にできる。パッケージ間の依存関係を気にしなくて良いため、ディストリビューションの違いにも依存せず、容易に複数のディストリビューションに展開できるというメリットもある。

複数の種類のディストリビューションを併用しているユーザーにとっては、ディストリビューションごとにパッケージ管理システムを使い分ける必要がなくなるため、Snappyは非常に便利なツールとなるはずだ。ただし、APTやdnfなどとは基本的な考え方が異なるため、使い慣れるまでは違和感があるかもしれない。また、APTやdnfなどで利用できる全てのパッケージがSnapパッケージとして提供されているわけではないという点にも注意が必要だ。

WSL2環境でSnappyを使えるように設定する

Snappyは一度使い方を覚えてしまえば複数のディストリビューションで同じように利用できるため便利なのだが、残念ながら、2020年12月現在、WSL/WSL2のLinux環境ではそのままでは使用することができない。これは、snapdを使用するためにはシステム管理デーモンの「systemd」が必要だが、WSL版のLinuxではデフォルトでsystemdが無効化されているためである。

WSL2でsystemdを有効にする方法は一般的ではないため、常用するのは推奨されない。ここではSnappyを使ってみる目的で、WSL2上のUbuntu 20.04 LTSを例にして、systemdを有効にする方法を紹介する。

systemdは手動で有効にしたとしても、「PID 1」が取得できない場合は起動することができない。そこで、Linuxカーネルのコンテナの仕組みを利用してPID名前空間を新たに作成し、その中でsystemdを起動する。この方法であればPID 1が取得できるため、systemdを手動で起動できる。

この一連の操作は、次の1行のコマンドで実行できる。新しいPID名前空間の作成にはunshareコマンド使い、実行したコマンドをデーモン化するためにdaemonizeコマンドを使用している。

WSL2上のUbuntuにおけるsystemdの起動

daemonizeコマンドがインストールされていない場合は、aptを使ってインストールしておこう。

daemonizeのインストール

これでsystemdが起動できたが、Snappyを利用するためにはsystemdと同じPID名前空間で作業しなければならない。次のコマンドで、systemdと同じPID名前空間に入ることができる。

起動したsystemdと同じPID名前空間に入る

この状態で、次のようにsnap versionコマンドが実行できれば設定完了だ。

snapコマンドが使用できるようになった

なお、この設定は永続的なものではない。もし別のターミナルでWSL2のUbuntuに入り直した場合には、上のnsenterコマンドを再度実行する必要がある。また、Windowsを再起動するなどして結果的にUbuntuが再起動された場合には、最初のunshareコマンドを併用したsysrtemdの起動を再度行わなければならない。

snapコマンドによるパッケージ管理

Snappyによるパッケージ管理は、snapコマンドによって行う。ここからはこのsnapコマンドの基本的な使い方について紹介する。

インストール済みパッケージのアップデート

Snappyでは、パッケージのアップデートを行う際に、APTのように手動で内部のパッケージ情報を更新する必要はない。パッケージ情報は自動で更新されるので、次のように「snap refresh —list」コマンドを実行するだけで、更新可能なパッケージの一覧を見ることができる。

アップデート可能なパッケージの表示

更新可能なパッケージがある場合、次のように引数なしで「snap refresh」コマンドを実行すれば、全てのパッケージが最新のバージョンにアップデートされる。

インストール済みパッケージの一括更新

Snappyの場合、パッケージを指定して個別にアップデートすることもできる。パッケージを個別にアップデートしたい場合には、次のように対象のパッケージ名を指定して「snap refresh」コマンドを実行すればよい。

パッケージを個別に指定してアップデート

上記の方法でパッケージを手動でアップデートすることもできるが、Snappyではデフォルトでパッケージの自動アップデートが有効になっている。したがって、基本的には指定した時間がくれば自動で最新のパッケージにアップデートされる。

パッケージの自動アップデート時間の設定

パッケージが自動アップデートされる時間は次のコマンドで確認できる。

自動アップデートされる時間の確認

上図の「timer」の項目がその設定値で、デフォルトでは4時間間隔で行われる設定になっている。

自動アップデートの時間を変更したい場合には、次のように「snap set system」コマンドを使って「system.timer」の値を変更する。この例では、2時間間隔でアップデートが行われるように設定している。

自動アップデートされる時間を2時間間隔に変更

毎日午前5時にアップデートが行われるようにしたい場合は、次のように設定すればよい。

毎日午前5時に自動アップデートされるように設定

インストール済みパッケージの一覧表示

すでにインストールされているパッケージとそのバージョンの一覧は、次のコマンドで表示することができる。

インストール済みパッケージの一覧表示

注目してほしいのは、同じパッケージが複数存在している点である。Snappyでは、パッケージをアップデートした場合、古いバージョンはすぐに削除されるのではなくステータスが無効(disabled)にされ、その上で新しいバージョンがインストールされる。アップデートごとにリビジョン番号が割り振られ、アップデートの履歴が全て残ることになる。

アップデートしたパッケージのリビジョンを元に戻す

Snappyでは、パッケージをアップデートした後で、アップデート前のバージョンに戻すこともできる。前のバージョンに戻すには「snap revert」コマンドを使用する。次の例では、lxdを1つ前のリビジョンに戻している。

パッケージを1つ前のリビジョンに戻す

次のように、任意のリビジョン番号を指定してバージョンを戻すこともできる。

パッケージを指定したリビジョンに戻す

パッケージの検索とパッケージ情報の表示

任意のパッケージを検索したい場合には、次のように「snap find」コマンドを、探したいパッケージ名(の一部)を指定して実行する。この例の場合、「azure-cli」というパッケージを検索している。すると、「azure-cli」を名前の一部に含むパッケージが一覧表示される。

パッケージの検索

パッケージの詳細情報を知りたい場合には、次のように「snap info」コマンドに対象のパッケージ名を指定して実行すればよい。

パッケージ情報の表示

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

パッケージを新規にインストールしたい場合には、「snap install」コマンドを使用する。次の図は、azure-cliパッケージをインストールした例である。

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

パッケージの無効化/有効化

上でも触れたように、Snappyにはパッケージのインストールや削除のほかに、有効(enabled)、無効(disabled)のステータスを設定することができる。例えばazure-cliパッケージを無効化するには、次のように「snap disable」コマンドを実行する。

パッケージの無効化

無効化すると、そのパッケージは使用できなくなる。再度有効化するには、次のように「snap enable」コマンドを実行すればよい。

パッケージの有効化

パッケージの削除

無効化ではなくパッケージを完全に削除したい場合には、次のように「snap remove」コマンドを実行する。

パッケージの削除

まとめ

SnappyおよびSnapパッケージは、パッケージ管理の基本的な考え方自体がAPTやdnfなどのほかのパッケージ管理システムとは異なるため、最初は違和感があるかもしれない。しかしそれを差し引いても、ディストリビューションに依存せずに利用できるというメリットは大きい。

惜しむべくは、その仕組み上、WSL環境では通常の方法ではSnappyが利用できないという点である。WSLでももう少し手軽に使えるようになれば、Windows Terminalユーザーにとっては最適なツールとなり得るだろう。

参考資料