SE_BOKUのまとめノート的ブログ

SE_BOKUが知ってること・勉強したこと・考えたことetc

WSL2/Ubuntu Linux:パッケージ管理とカレントバージョン管理

目次

WSL2/Ubuntu Linux:パッケージ管理とカレントバージョン管理

WSL2上でUbuntuを使って遊ぶのに、最低限、知っておくべき知識の備忘録的整理の一環として、プログラムの「パッケージ管理」を整理します。

WSL上のUbuntu LinuxをWebサーバーなどで使うには、新たにソフトウェアをインストールしたり、バージョンアップする行為が当たり前のように必要ですから。

結構重要です。

ちなみに、この記事を書いている時点の僕の環境は「Windows11のWSL2上にインストールしたUbuntu 18.04LTS」です。

パッケージ管理の概要

ubuntuにインストール可能なソフトウェアは依存関係などが調整済の「パッケージ」として提供されます。

Ubuntuで公式に提供しているパッケージは公式リポジトリから提供されています。

公式リポジトリUbuntuコミュニティによってそのリリースごとにメンテナンスされているソフトウェアパッケージを提供するHTTPサーバーのことで、Ubuntuの パッケージ管理システム(apt) などを使って、求めるソフフトウェアのパッケージがないかを探したり、そこからインストールしたりするわけです。

パッケージ管理コマンド「apt」でインストールする基本的流れ

Ubuntu Linuxパッケージ管理コマンド「apt」を使って、パッケージを探して、インストールする基本的な流れです。

説明サンプルとしてphp7.2をインストールする体でやってます。

バージョンが古すぎて実用的でない点はすいません。

ただ、php7.2の部分を読み替えてもらえれば、流れとしてはほぼ同じです。

1.事前準備:パッケージ更新(apt update・apt upgrade)

インストールの前には必ず、現在の環境のパッケージを最新にします。

必要なコマンドは以下の2つです。

sudo apt update

sudo apt upgrade

です。

上の「update」はパッケージのメタデータを更新します。

実際のダウンロードや更新はしません。

下の「upgrade」はupdateで更新したメタデータに基づいて、更新されたパッケージがあるならそれを実際にダウンロード・更新します。

上記を「update→upgrade」の順番に実行してパッケージを最新にします。

2.パッケージがリポジトリに存在するかを確認

パッケージは「リポジトリ」からインストールします。

いろいろ、酒類がありますが、おおまかには、公式のレポジトリ(Ubuntuソフトウェアセンター)と非公式のレポジトリ(PPA=パーソナル・パッケージ・アーカイブ)があって、公式リポジトリは最初から使えますが、非公式リポジトリ(PPA)は必要に応じてUbuntuリポジトリを追加してやる必要があります。

まずは、標準のまま=公式リポジトリのみの状態でやります。

まずは、目指すパッケージがリポジトリにあるか確認します。

これはあることがわかっていれば、必要ありません。

apt search php7.2

3.パッケージ情報を確認

必要であれば、パッケージのもう少し詳しい情報を見ます。

必須ではありませんが。

apt show php7.2

4.インストール

インストールは以下のようにします。

sudo apt install php7.2 -y

「-y」をつけないで実行した場合は、途中で「続けるかどうか」をy/nで聞いてくるので、途中で「y」を入力する必要があります。

外部リポジトリ追加(apt-add-repository)の手順

公式リポジトリは上記例のように最新版が反映していない場合があります。

公式リポジトリにない新しいバージョンをインストールするには非公式リポジトリ「PPA」=外部リポジトリを使います。

手順をふんでやっていきます。

 

1.(準備)software-properties-commonのインストール

外部リポジトリを使用するには、リポジトリ管理に必要なsoftware-properties-commonをインストールする必要があります。

sudo apt install software-properties-common

ただ、僕の環境だとすでにに最新バージョンがインストール済でしたので、以下のようなメッセージでしたが、なければインストールされます。

 

2.apt-add-repository(リポジトリ追加)

非公式リポジトリ「PPA」を使います。

PPAは、一度信頼するソフトウェアの提供元として追加すると、公式のレポジトリからダウンロードしたソフトウェアと同様にアップデートがあるかどうか自動でチェックし、一括アップデートできます。

ですが、非公式・・つまりPersonal ・・なので、自己責任です。

今回の目的はPHPが7.2では古すぎるので、phpのもっと新しいバージョンをインストールしようということなので「ppa:ondrej/phpリポジトリを追加します。

sudo apt-add-repository ppa:ondrej/php

すると、パラパラと英語のメッセージがでて、最後にこんな感じで聞いてきます。

Press [ENTER] to continue or Ctrl-c to cancel adding it.

ここでEnterキーを押すと、リポジトリが追加されます。

 

3.apt update

リポジトリを追加したら、必ずupdateします。

sudo apt update

それでupgradeが必要とメッセージがでてきたらついでに

sudo apt upgrade

もやっといたら良いと思います。

 

4.パッケージが選択可能かをチェック

インストールは後でしますが、PHPの新しいバージョン(8.1にします)が選択可能かチェックします。

apt search php8.1

ありましたね。OKです。

 

なお、このPHPの例とは異なる方法でPPAリポジトリを追加するものもあります。

Googleで「ubuntu ppa インストールしたいソフトウエア名」みたいな感じで検索するとでてくるので、そこに書いてある手順通りにやればよいのですけど。

なお、サイトによっては、コマンド名が「apt-get」となっているものもあります。

このままやっても、ここを「apt」に読み替えてもいけるみたいです。

 

カレントバージョン管理(alternatives システム)

複数のバージョンをインストールして、特定のシンボリックリンク(例:python3とか)で実行されるバージョンを変更できるようにしたい場合に対応するため、ubuntuにはalternatives システムというものを持っていて、管理するツールとして「update-alternatives」があります。

manpages.ubuntu.com

この「alternatives システム」に登録しておけば、コマンドを使って、カレントバージョンを切り替えることができます。

具体例として、Python3.11をインストールしてalternatives システムを使って、Python3で「3.11」が実行されるようにしてみます。

ただ、これもあくまで説明サンプルです。

最後の「10.手順だけ確認したら戻しておこう」に書いていますが、Python3のシンボリックリンクの対象バージョンを変更すると、動かないコマンドがでてきますし、仮想環境を使わずにPythonの別のバージョンをインストールしても「pipの利用」や「VsCodeとの連携」とかで難しい部分がでてきたりします。

実際に使うつもりで、同じことをするのはおすすめしませんので、あしからず。

説明サンプル:Python3.11をインストールする

ubuntuに「Python3.11」をインストールする例をやります。

この時はUbuntu18.04LTSでした。

ここではalternativesシステムを使う例として適当なものが思い浮かばなかったので、Pythonを題材にしています。

上にも書いていますが、実用的ではありません。

もし、Pythonをデフォルト以外のバージョンに切り替えて開発したいという目的があるならば、迷わず、Python仮想環境を使うことをお勧めします(笑)。

 

手順をふんでやっていきます。

1.Python3のカレントバージョンの確認。

apt list -a --installed python3

upgradeしているので、今は3.6.7が動くようになってます。

2.Pythonのppaリポジトリを追加

Pythonの3.11を取得可能なリポジトリを追加します。

PPAを探すのは、僕はGoogleで「パッケージ名 PPA」で検索しています。

Pythonは「ppa:deadsnakes/ppa」でした。

sudo add-apt-repository ppa:deadsnakes/ppa

3.リポジトリ追加後update

必ず必要です。

sudo apt update

4.Python3.11の存在確認

python3.11がインストール可能かリポジトリを確認します。

apt search python3.11

5.Python3.11のインストール

以下のコマンドでインストールします。

sudo apt install python3.11 -y

6.Python3.11のインストールフォルダ確認

次の作業に必要なので、Python3.11のインストールフォルダを確認します。

 which python3.11

結果はこんな風に表示されるはずです。

/usr/bin/python3.11

これで「python3.11」とうてば実行できます。

python3.11 --version

ここまででインストールは終わりです。

7.alternatives システムの登録状況を確認する

リストを使います。

 update-alternatives --list python3

デフォルトだと、

update-alternatives: error: no alternatives for python3

みたいなエラーがでるかもしれませんが、その場合は登録がないということなので、いったんスルーします。

8.Python3をalternativesシステムに登録する

whitchが3.6と3.11のパスを確認したというていで登録します。

3.11のほうをプライオリティ1、3.6をプライオリティ2にしてみます。

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 2

インストールしたら「update-alternatives --list python3」で確認してみます。

登録できてます。

9.3.11をカレントに変更する(手順の確認のため)

続けてカレントの切り替え手順の確認のために3.11をカレントにしてみます。

以下のコマンドを実行します。

sudo update-alternatives --config python3

すると、以下ようにカレントにする「selection」を入力するよう問い合わせてきます。

ここで「1」を入力すると、3.11がカレントになります。

試しに「python3 --version」とうってみると。

いけてます。

これで手順確認はOKです。

10.手順だけ確認したら戻しておこう

手順の確認ができたら、Python3で元の3.6を指すように戻しておきます。

sudo update-alternatives --config python3

なんで、せっかく新しいバージョンにしたのに戻すのか?

それはPython3がデフォルトの3.6以外を指していると、「apt update」が以下のようなエラーメッセージでエラー終了するからです。

ModuleNotFoundError: No module named 'apt_pkg'

Python3みたいなシステムが使ってそうなシンボリックリンクは、下手に変更すると痛い目にあうよ・・ということなんですね。

とりあえず、このくらい知ってれば、なんとかなりそうです。

ではでは。