WSL(Windows Subsystem for Linux)でLinux環境を使っている場合、アプリケーションのインストールやアップデートなどにはパッケージマネージャを利用するのが便利だ。MicrosoftがWindows向けに「Windows Package Manager(winget)」と呼ばれるパッケージ管理ソフトを開発中であることは第40回でも紹介したが、これはLinuxでは昔から使われていた方式をWindowsに取り込んだものと言える。
本連載では、これまでPowerShellやLinux自体の環境設定についてはあまり詳しく触れてこなかったが、Windows Terminalでの作業効率を上げていくためには、これらの環境自体の使い勝手も同時に向上させていく必要がある。そこで今回は、Linux環境のパッケージ管理システムの使い方についてあらためておさらいしておきたい。Linuxでデフォルトで使用できるパッケージ管理システムはディストリビューションごとに異なるが、今回はまずUbuntuやDebian Linuxで利用される「APT」について取り上げる。
主なディストリビューションとパッケージ管理システム
Linuxでは、ディストリビューションによってデフォルトで使用できるパッケージ管理システムが異なっている。主要なディストリビューションについて大きく分けると次の表のようになる。
ディストリビューション | 主なパッケージ管理システム |
---|---|
Ubuntu,Debian,Kali Linux | APT(apt,apt-getなど) |
RHEL,CentOS,Fedora | yum,dnf |
SUSE | Zypper |
ディストリビューション非依存 | Snap(Snappy) |
UbuntuやKali LinuxはもともとDebianから派生したディストリビューションであるため、Debianと同じパッケージ管理システムを持つ。CentOSとFedoraも同様に、RHEL(Red Hat Enterprise Linux)をベースに派生したディストリビューションであるため、こちらもパッケージ管理システムは同じものが使用される。SUSEにもRHELとCentOSの関係と同じように商用版のSLES(SUSE Linux Enterprise Server)とオープンソース版のopenSUZEが提供されているが、こちらもZypperと呼ばれる同じパッケージ管理システムを使う。
少し事情が異なるのがSnapで、これはもともとUbuntu向けに開発されたものではあるが、システムにインストールされたライブラリに依存しないように作られているため、さまざまな系統のディストリビューションで使うことができるようになっている。
「APT」とは
一般的に、Linuxではアプリケーションは「パッケージ」と呼ばれるかたちで配布/管理されている。UbuntuなどのDebian系のLinuxでは「deb形式」と呼ばれるフォーマットのパッケージが使用される。Debian系Linuxにはdeb形式のパッケージをインストールするための「dpkg」と呼ばれるツール群が用意されているが、このdpkgをベースとして配布パッケージの入手や依存関係の解決(依存している別のパッケージの自動インストール)を自動で行ってくれる「APT(Advanced Package Tool)」と呼ばれるパッケージ管理システムが広く使われている。
APTでは、パッケージを管理するためのいくつかのコマンドが提供されている。以前は「apt-get」や「apt-cache」といったコマンドを使ってパッケージのインストールなどを行っていたが、現在はこれらのコマンドを統合するかたちで再設計された「apt」コマンドが主流となっている。aptコマンドでもapt-get/apt-cacheコマンドもほぼ同じことができるが、aptのほうが新しく、設計が整理されているという利点がある。
aptコマンドによるパッケージ管理
さて、今回はこのaptコマンドの基本的な使い方について、WSL上にインストールしたUbuntu 20.04 LTSを例に挙げて解説しよう。
なお、コマンドの実行に管理者権限が必要な場合にはsudoコマンドを使うようにしている。sudoの実行権限がないユーザーは、それらのコマンドは実行することができない。
パッケージ情報の更新
一般的に、パッケージ管理システムはインストール可能なパッケージの一覧とそれぞれのバージョンなどの情報を内部に保持している。最新版のパッケージをインストールするためには、まずこの内部のパッケージ情報を最新のものに更新しておかなければならない。パッケージ情報の更新は次のように「apt update」コマンドで実施する。
パッケージ情報が古いままだと、古いバージョンのパッケージがインストールされてしまうかもしれない。新規に何かのパッケージをインストールしたい場合には、事前にこのコマンドを実行しておくのがいいだろう。
インストール済みパッケージの更新
パッケージ情報を更新しただけでは、既にインストール済みのパッケージは更新されない。次のコマンドを実行すると、インストール済みのアプリケーションのうち、バージョンアップが可能なもののリストを調べることができる。
このコマンドで表示されたパッケージは、すでに後継の新しいバージョンがリリースされており、更新の準備ができていることを意味している。
実際のインストール済みパッケージの更新は次のように「apt upgrade」コマンドで行う。
「update」と「upgrade」で名前が似ているので注意していただきたい。このコマンドを実行すると、更新の対象となるパッケージの一覧が表示され、更新を実行してよいかどうかの確認メッセージが表示される。ここでキーボードから「Y」と入力して「Enter」キーを押せば、対象のパッケージが一斉に最新のものにアップグレードされる(「n」を入力すると、更新はキャンセルされる)。
aptでは、基本的に更新可能なパッケージは全てまとめて更新する仕組みになっており、個別のアップデートやロールバック(古いバージョンに戻すこと)は行わない。
パッケージを更新すると、不要になったパッケージが出てくることがある。例えば、依存関係によってインストールされたものの、それがバージョンアップされたことで不要になったというようなケースだ。そのまま残しておいても問題はないのだが、次のように「apt autoremove」コマンドを使えば、不要なパッケージを削除してディスクスペースを節約することができる。このコマンドでも、途中で削除を実行してよいかどうかの確認メッセージが表示される。
インストール済みパッケージの一覧表示
すでにインストールされているパッケージとそのバージョンの一覧は、次のコマンドで表示させることができる。
実際には、「apt list」が利用可能なパッケージの一覧表示をするコマンドで、それに「—installed」というオプションを付けることで、インストール済みのパッケージだけを抽出している。
パッケージの検索とパッケージ情報の表示
任意のパッケージを検索したい場合には、次のように「apt search」コマンドを、探したいパッケージ名(の一部)を指定して実行する。この例の場合、「azure-cli」というパッケージを検索している。すると、「azure-cli」を名前の一部に含むパッケージが一覧表示される。
パッケージの詳細情報を知りたい場合には、「azure show」コマンドに対象のパッケージ名を指定して実行すればよい。「azure-cli」パッケージの詳細を知りたい場合は、次のようになる。
「azure show」は、「azure search」と違ってパッケージ名が(一部ではなく)完全に一致したパッケージの情報のみが表示される。バージョン情報のほかにも、依存するパッケージや配布元のURLなどの情報を知ることができる。
パッケージのインストール
パッケージを新規にインストールしたい場合には、「apt install」コマンドを使用する。次の図は、azure-cliパッケージをインストールした例である。コマンドを実行すると、まず同時にインストールされる依存するパッケージのリストや、インストールに必要なディスクサイズなどが表示され、本当にインストールを実行してよいかどうか確認される。ここでキーボードから「Y」と入力して「Enter」キーを押せば、インストールが実施される。
パッケージの削除
インストール済みのパッケージを削除したい場合には、次のように「apt remove」コマンドを実行する。
このコマンドを実行すると、依存関係で自動的にインストールされたパッケージのリストが表示され、続いて実際に削除される対象のパッケージが表示される。削除を実行するかどうかを確認するメッセージが表示されるので、「Y」と入力して「Enter」キーを押せば、削除が実施される。
依存関係でインストールされたものについては自動では削除されない。もし削除したい場合には、先ほど紹介したコマンド「apt autoremove」を実行すればよい。
パッケージ管理システムを利用すれば、新しいアプリケーションを探してインストールしたい場合でも、わざわざインストーラのファイルをどこかから持ってきて実行するというような手続きが必要なく、コマンドだけで全てを完結させることができる。最新版へのアップデートも簡単なので、定期的に「apt update」と「upt upgrade」を実行して、可能な限り全パッケージを最新の状態に保ち続けることをお勧めしたい。