• Windows Subsystem for Linuxガイド 第22回 WSLのアップデート「ディストリビューション編」

今回は、ディストリビューション自体をバージョンアップ(システムアップデート)する方法を解説する。

ディストリビューションのシステムアップデート

Linuxディストリビューションのバージョンバージョンアップは、ベンダーごとにやりかたが異なる。このため、ディストリビューションによっては、複数あるリリースの中から適切なものを選択する必要がある。

一般的にLinuxディストリビューションには、以下のようなバージョンアップが存在する(表01)。

  • 「従来型」
  • 「LTS(Long Term Support)版」
  • 「ローリングアップデート」
  • ■表01

「従来型」は、原則、定期的に「安定版」をリリースし、安定版のリリースの間に「プレビュー版」や「開発版」などを出す方式である。リリース方針により安定版以外のリリースの位置づけが異なるが、基本的には「安定版」を選択する。

「LTS版」は、後継バージョンが出てもアップデート配布などのサポートが長期間継続するものをいう。従来型と併用されることもあり、安定版の1つがLTS版としてリリースされる場合がある。

「ローリングアップデート」とは、短期間でシステムのアップデートを継続して行うもの。このため、日々状態が更新され、システムとしては固定したバージョン番号を持たない場合がある。インストールイメージをファイルなどで配布している場合には、そのイメージにバージョン番号などを付けて区別することがある。

ディストリビューションのアップデートの実際

ディストリビューションのアップデートはおおまかに以下の手順で行う。

  1. 確認
  2. 準備
  3. バックアップ
  4. バージョンアップ

ここでは、WSL用としてMicrosoftストアで配布されている「Ubuntu」を対象として利用する。

まずは、対象のWSLディストリビューションのバージョンを確認する。それには、/etc/os-releaseファイルを確認する。リスト01は、Ubuntuの場合だ。これから現在のディストリビューションは、「22.04.3 LTS (Jammy Jellyfish)」でLTS版22.04.3であることがわかる。

■リスト01


PRETTY_NAME="Ubuntu 22.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy

ディストリビューションによっては、独自のバージョン確認手段を持っている場合があり、より正確な情報が得られる場合もあるが、それぞれ方法が異なる。しかし、この方法は、すべてのディストリビューションで利用できる。

次にバージョンアップ対象が存在するかどうかを確認する。Ubuntuの場合、システムバージョンアップを行う「do-release-upgrade」コマンドを使って、存在を確認できる。


do-release-upgrade -c

ただし、このコマンドは、「/etc/update-manager/release-upgrades」ファイルの設定に従って動作する。このファイルは、システムバージョンアップの対象を制限する機能がある。このファイルにある「Prompt=<設定値>」がdo-release-upgradeの動作を決める。ファイル中にも解説があるが、「<設定値>」は、(表02)にある3つから選択する。どの場合でも、バージョンアップ可能なリリースのみが選択され、バージョンが後戻りするようなアップグレードはできない。

  • ■表02

Ubuntuの場合、標準では“lst”が選択されている。また、WSL用のUbuntu LTS版では、“never”が初期値として設定されている。

ここでは、これを“normal”に書き換えて、以後の解説を行う。書き換えは、適当なテキストエディタなどを使うが、/etc/ディレクトリ内のファイルなのでsudoをつけてエディタを起動する。

書き換える前には、更新は表示されなかったが、Promptをnormalに書き換えると、新リリースである「23.04」が見つかる(写真01)。これは、確認した現在のバージョンよりも新しい通常版だがLTS版ではない。なお、normalにした場合、半年に一回バージョンアップが行われるが、LTSに変更した場合、現在のバージョンより先のLTSがリリースされるまでバージョンアップが行われない。

準備

準備では、WSL自体とディストリビューションを最新状態にする。まずは、WSL自体だが、Win32側で、「wsl.exe --update」を実行する。

次にWSLを起動し、Linux側でプログラムなどを最新の状態にしておく。システムのバージョンアップに関わるプログラムがアップデートされている可能性があるからだ。Ubuntuの場合、以下のコマンドを実行する。


sudo apt update
sudo apt upgrade
apt list --upgradable

最後のコマンドでパッケージが何も表示されなければ準備は終了である。そうでない場合には、表示されるパッケージを「sudo apt upgrade <パッケージ名>」などして、個別にアップデートするなどしてして対処する。環境依存の問題なので、一般的な対処方法を示せないが、表示される警告などを理解して対処を行う必要がある。

バックアップ

次にバージョンアップに備えて、ディストリビューションをバックアップする。それには、wsl.exeコマンドの--exportオプションを使うのが簡単だ。ただし、コマンド実行前にWSLのウィンドウを閉じるなどして、セッションを終了させておく必要がある。


wsl.exe --terminate Ubuntu
wsl.exe --export Ubuntu C:\temp\UbuntuBackup.vhdx --vhd

2行目のコマンドは、バックアップファイルとして「C:\temp\UbuntuBackup.vhdx」が指定してある。ここは、各自の環境に合わせて書き直す必要がある。

なお、バックアップに関しては、「第16回 WSLのバックアップとリストア」、「第17回 WSLのバックアップとリストア 応用編」を参照していただきたい。

バージョンアップ

Ubuntuの場合、前述のようにdo-release-upgradeコマンドでアップデートを行う。これは単純にオプションを付けずに実行すればよい(写真02)。

  • 写真02: 更新可能なバージョンが存在している場合、オプションなしでdo-release-upgradeコマンドを起動する。確認ののち、バージョンアップが開始される

WSLでは1つのディストリビューションを複数のターミナルで開くことができるが、バージョンアップ中は、他のセッションはすべて閉じておく。

バージョンアップの途中で何回か確認が入る。場合によってはTabでYes/Noを選択する背景に色がついた画面が出ることもある。アップグレードが終了した旨のメッセージ(写真03)が表示されたら、ターミナルを閉じ、ディストリビューションを終了させる。その後再起動を行えば、バージョンアップは完了である。

  • 写真03: バージョンアップ処理が終了した旨のメッセージが表示されたら、ターミナルを閉じ、該当のディストリビューションを再起動する

LTS版のバージョンアップ

LTS版のバージョンアップも、基本的な手順は同じだが、WSLの場合、WSLディストリビューションの名前を変更できないという問題がある。たとえば、「Ubuntu-20.04」を同22.04LTSにアップグレードしても、外部から見えるディストリビューション名は「Ubuntu-20.04」のままである。これでは、バージョンを誤認しかねない。

そこで、バックアップを取ったWSLディストリビューションのローカルファイルイメージ(vhdxファイル)を使い、新たな名前でディストリビューションを登録し、これを使ってバージョンアップを行う。

なお、ここでは説明のため「Ubuntu-20.04」を「Ubuntu 22.04 LTS」にバージョンアップすると仮定する。なお、Ubuntuでは、LTS版のバージョンアップは段階的に行う必要があり、Ubuntu-18.04は、同20.04LTSにバージョンアップできるが、直接22.04LTSにはバージョンアップできない。

前述のバックアップまでの手順はほぼ同一である。ただし、/etc/wsl.exeにWSLデフォルトユーザーを登録しておく。具体的には、


[user]
default=<ユーザー名>

を追加する。WSLの標準のインストールでは、インストール時にデフォルトのユーザー名を登録するが、コピーしたWSLローカルファイルシステムを使って、インポートを行う場合には、ユーザー名がデフォルト登録されないからである。ローカルファイルイメージには、作成時に作られたユーザー登録は存在するため、上記の記述を追加しておけば、WSLのデフォルトユーザーを維持できる。

そのあと、バックアップしたローカルファイルイメージを使い、新規にバージョンアップ先のLTS名で、WSLディストリビューションを登録する。このため、適当な場所にフォルダを作りそこにバックアップを作る。これを「C:\wsl」とすると、


wsl.exe --terminate Ubuntu
cd c:\wsl
wsl.exe --export Ubuntu-20.04 UbuntuBackup.vhdx --vhd
wsl.exe --import-in-place Ubuntu-22.04 .\UbuntuBackup.vhdx

とする。これで、名称のみ「Ubuntu-22.04」となったディストリビューションが登録される。

ただし、WSLでは、同名のディストリビューションは1つだに限定される。Microsoftストアからディストリビューションをインストールする場合には、「Ubuntu-2x.04」という名前のものがなる。先にこれらがインストールしてあるときには別の名前を考える。また、上記のように名前を変えて登録したときに、後から同名のディストリビューションをMicrosoftストア(あるいはwsl.exe --installコマンド)でインストールしようとするとエラーになる。

このようにして、既存のWSLディストリビューションのコピーを作成してWSLに登録したら、これを起動し、前記のようにバージョンアップ作業を行えばよい。

ディトリビューションのバージョンアップは、ディストリビューションごとにリリース方針の違いがあり、また利用するコマンドなどにも違いがある点には注意されたい。

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