author: 塩田紳二

  • Windows Subsystem for Linuxガイド 第21回 WSLのアップデート「アプリケーション編」

WSLのディストリビューションも日々更新されており、日常的に「アップデート」が必要になる。WSLの場合、Windowsの中で実行されるため、直接インターネットに接続しているシステムよりはセキュリティは高いものの、セキュリティに問題のあるプログラムには早期に対策しておくべきだ。

WSLディストリビューションでは、システムの標準的な「パッケージ管理システム」があり、これが、アプリケーションやシステムのアップデートを行うようになっているのが普通だ。

Linuxディストリビューションでは、基本的に「パッケージ管理システム」がアプリケーションやLinuxの標準的なパッケージのアップデートを管理する。ただし、ディストリビューション自体のバージョンアップに関しては、ディストリビューションにより方針が異なり、その周期や方法などは、それぞれで異なる。これについては次回解説する。

ここでは、WSLを使う場合のアップデートに関して基本的なところを解説する。なお、アップデートやバージョンアップといった用語には、若干混乱が見られる。本記事で使う用語については、(表01)にまとめてある。

  • ■表01

パッケージ管理システム

パッケージ管理システムとは、パッケージ化されたソフトウェアのインストールなどを行うための仕組みをいう。Linuxディストリビューションでは、システムの基本要素ともいえ、システム管理ツールに組み込まれる場合もある。

パッケージ管理システムは、大きく

  • パッケージ形式
  • リポジトリ
  • パッケージ管理ツール(コマンド)

から構成されている。

「パッケージ形式」は、パッケージの内部構造やファイル形式、含まれるべき情報などを定義し、ソフトウェアを単一ファイル形式などで配布することを目的としたものだ。

現在では、多くのディストリビューションがパッケージ管理システムにより、ディストリビューション自体のソフトウェアを管理しているため、ディストリビューションが決まれば、メインとなるパッケージ管理システムつまり、パッケージ形式が決まる。

「リポジトリ」は、パッケージを保存、配布するための「サイト」(あるいはサービス)で、通常は、ディストビューションのメーカーなどが運営する。

「パッケージ管理ツール」は、パッケージ管理システムを使う場合のコマンドである。基本的にパッケージ形式に固有のものだが、1つのパッケージ形式に複数の管理コマンドが存在する場合がある。また、ディストリビューションによっては、システム管理コマンドの一部になっていることもある。一般的にディストリビューションに付属のパッケージ管理ツールは、ディストリビューションのバージョン、アーキテクチャに適合したパッケージをインストールする。

Ubuntuのパッケージ管理ツール

ここでは、deb系のパッケージ管理システムを使うUbuntuのパッケージ管理ツールを解説する。基本的には、aptコマンドを使うが、過去には、「apt-get」などの複数のコマンドを使っていたこともある。また、Debianでdeb形式のために作られた「dpkg」コマンドも利用可能だ。

(表02)は、aptコマンドのサブコマンドと利用方法を示すものだ。基本的には、aptコマンドでほとんどの用途をカバーするが、aptコマンドは、スクリプトやパイプラインでのコマンド出力処理を想定したものでないため、必要に応じて他のコマンドを使う必要がある。ただし、コマンドラインからの管理作業に関しては、aptコマンドだけでほぼ行うことができる。

  • ■表02

基本となるのは、リポジトリの情報を更新し、ローカルにパッケージ名などのキャッシュ情報を保存する「apt update」コマンドである。

パッケージの検索

aptコマンドに限らず、パッケージ管理システムでは、対象となるパッケージが多数ある。このため、まずは、目的のパッケージを探すことが重要となる。そのためのサブコマンドはsearchとlistである。前者は、正規表現でパッケージを検索するもの、後者は、globパターンを使ってパッケージ名のリストを扱うものだ。どちらも、リポジトリを直接検索するのではなく、ローカルに存在するリポジトリのキャッシュ情報を検索する。

たとえば、パッケージ名や解説(後述のshowサブコマンドで表示できる)に含まれる単語で検索を行いたい場合には、「apt search」を使う。これに対して、パッケージ名のみで検索を行う場合にはapt listを使う。また、apt listには、リストの出力条件を指定するオプション、「-i、--installed」(インストール済みのパッケージ)、「-u、--upgradeable」(アップグレード可能なパッケージ)、「-a、--all-versions」(すべてのバージョン)がある。

これに対して、apt searchコマンドのオプションは多数ある。詳細は、「apt-cache」コマンドのmanページで調べることができる。比較的良く使うのは、検索をパッケージ名のみに限定する“-n”(--names-only)オプションである。

これらのサブコマンドに限らず、正規表現やワイルドカード(glob。man 7 glob参照)をコマンドラインで指定する場合には、必ずダブルクオート、シングルクオートで括る。そうしないと、bashのパス名展開機能が有効になり、コマンド実行前にパス名展開が行われてしまうことがある。

どちらのコマンドも、カラー表示が可能な端末では、パッケージ名部分が緑色で表示される(写真01)。その後ろのスラッシュに続くのが、パッケージが対象とするディストリビューションのリリース(バージョン)を区別するコード名である。この後、スペースで区切られて、パッケージのバージョン番号、対象アーキテクチャ名が続く。

  • 写真01: apt searchサブコマンドでは、検索条件に正規表現が利用でき、パッケージ名や概要を表示する。これに対してlistサブコマンドは、パッケージ名で検索を行い、同じパッケージのアップデートも表示できる

正確なパッケージ名が判明したら、「apt show」コマンドでパッケージの詳細情報を見ることができる。

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

パッケージのインストールには、「apt install」コマンドを使う。アンインストールは「apt remove」、または「apt purge」である。removeサブコマンドは、事故による削除に対応するため、ユーザー設定データを残す。これにより、installサブコマンドで、誤って削除したパッケージを元の状態に戻すことができる。

これに対してpurgeサブコマンドは、パッケージを完全に削除し、復元は不可能になる。このため、通常は、removeサブコマンドを使うことをお勧めする。

なお、aptコマンドでは、パッケージと依存関係が指定された他のパッケージを自動でインストールするが、該当のパッケージのアップデートなどで、他のパッケージとの依存関係を失うパッケージが出てくることがある。こうしたパッケージは、autoremoveサブコマンドで削除が可能だ。

なお、install/remove/purgeのパッケージ名指定では、正規表現やglobで複数のパッケージを同時に指定することも可能である。

アプリケーションのアップデート

インストールされているアプリケーションをアップデートするには、まず、パッケージ管理システムのリポジトリのデータベースを最新のものに更新する。それには、


sudo apt update

を使う。Systemdが動作しているときには省略可能だが、同時にアップデートが存在するパッケージに関するメッセージが最後に出るので、手動で実行するほうがいいだろう(写真02)。

  • 写真02: apt updateサブコマンドは、パッケージ情報をリポジトリから入手してローカルに保存する。最後に更新できるパッケージがあれば、その数を表示する

コマンドの実行後に以下のようなメッセージ(先頭のXXには数字が入る)が出たら、更新可能なパッケージがある。


XX packages can be upgraded. Run 'apt list --upgradable' to see them.

メッセージに従い、


apt list --upgradable

で更新可能なパッケージを表示させてみる(写真03)。このコマンドは書き込みを行わないのでsudoは不要である。

  • 写真03: 更新できるパッケージは、apt list --upgradableで表示できる

一覧に表示されるパッケージを更新しても問題なさそうであれば、


sudo apt upgrade

で更新を行わせる(写真04)。途中、更新を開始しても問題ないかどうかを確認してくる。このときは“y”を入力する。またコマンドに“-y”オプションを付けると確認を行わなくなる。

  • 写真04: apt upgradeサブコマンドは、システムを変更するので管理者権限での実行が必要になるため、sudoを先頭につけて実行する。途中で実行していいかを確認してくる

ただし、このコマンドではすべてのアップグレードが行われるとは限らない。なので、実行後に再度「apt list -u」でアップグレード可能なパッケージを表示させる。更新の結果新たなパッケージの導入が必要になるなど、依存関係が変化するような場合に、更新が保留される。このような場合、パッケージを個別に指定して、upgradeサブコマンドまたはinstallサブコマンドを実行する(写真05)。必要なだけこの作業を繰り返す。

  • 写真05: apt upgradeコマンドを実行しても、いくつかのパッケージが更新されないことがある。これは、依存関係で新規パッケージが必要になる場合などに起こる。この場合は、パッケージ名を指定してapt upgradeサブコマンドを実行する

基本的には、これらのコマンドをときどき実行すればよい。ただし、あまり長い間upgradeコマンドを実行しないと更新するパッケージが増えてしまい、作業に時間がかかってしまう。

また、前述のように、パッケージの依存関係でインストールされたのち、現在では、どのパッケージとも依存関係を持たないパッケージが出てくる可能性もある。これは、


apt autoremove

で削除が行える。ただし、最近のハードウェアでは、外部記憶に比較的余裕があることが多く、よほどストレージが緊迫していない限り、頻繁に行う必要はない。年に数回から半年に1回という周期でも問題ないだろう。

WSLでLinuxを使っていれば、パッケージインストールなどは、日常的に行うコマンドになる。このため、apt updateコマンドの実行で、更新が可能なパッケージのチェックも高い頻度で行われる。なので、通常の更新に関しては、あまり神経質になる必要はないだろう。WSLのコマンドプロンプトを数日程度利用しなかったときには、起動後にapt updateコマンドなどでリポジトリ情報を更新したほうがいいだろう。

次回は、WSLディストリビューションのバージョンアップについて解説を行う。

Windows Subsystem for Linuxガイド 連載バックナンバー
https://news.mynavi.jp/tag/winsubsystem/