目次
本記事について
本記事は wsl のディストリビューションで Fedora を使っている人に向けて、 Fedora のアップグレード方法を紹介します。
前提
この記事では Fedora36 で運用している wsl のディストリビューションを Fedora37 にアップグレードする方法を前提としています。どのような環境や条件下でも動作を保証するものではありませんが、参考としてご覧ください。
事前準備と Fedora のバックアップ
wsl ディストリビューション(Fedora)での操作
dnf のキャッシュデーターを削除しておきます。
sudo dnf clean all
現在のディストリビューションをアップデートしておきます。
sudo dnf upgrade --refresh
Windows PowerShell での操作
Windows PowerShell から現在の Fedora ディストリビューションをバックアップします。起動方法は任意ですが、Windows 「Windows + X」を押して「I(アルファベットのアイ)」ボタンで Windows PowerShell を起動します。特権ユーザーの起動は不要です。
wsl は Fedora からログアウトして停止しておき、Windows PowerShell から以下のコマンドを実行し、操作対象の Fedora ディストリビューションが停止していることを確認します。
PS C:\Users\admin> wsl.exe -l -v
NAME STATE VERSION
* Fedora Stopped 2
PS C:\Users\admin>
現在使用している Fedora のバックアップを取得します。以下のコマンドでユーザーのホームディレクトリ下に WSLBackUp というフォルダを作成します。
New-Item $env:USERPROFILE\\WSLBackUp -ItemType Directory
wsl コマンドでバックアップを取ります。この例での Fedora36 ディストリビューションの名前が “Fedora” であるため、wsl —export コマンドでその名前を指定しています。なお、使用している Fedora の状況によりますが、ディスクを多く使用しているディストリビューションはバックアップファイルも大きくなり、時間が掛かります。また、バックアップファイルが占めるディスク容量も大きくなるので、バックアップ先のディスク容量に注意してください。
wsl --export Fedora $env:USERPROFILE\\WSLBackUp\fedora.tar
WSL の Fedora をアップグレード
wsl ディストリビューションでの操作
アップグレード対象の Fedora ディストリビューションを起動し、アップグレード操作をしていきます。Fedora のアップグレードには、dnf-plugin-system-upgrade というプラグインを使います。これは Fedora などをアップグレードする際に有用なツールです。詳細はこちらを参照ください。はじめにこのツールを導入します。
sudo dnf install dnf-plugin-system-upgrade
次に以下のコマンドを実行して Fedora 37 のパッケージをダウンロードします。環境にもよりますが、この処理は時間が掛かります。なお、Fedora で利用しているリポジトリ環境によっては、Errors during downloading metadata for repository ‘リポジトリ名':
というエラーが出る場合があります。その場合は、sudo dnf config-manager --disable [リポジトリ名]
でいったん該当するリポジトリを無効にしてから作業をしてください。
sudo dnf system-upgrade -y download --releasever=37
コマンドが正常に終わると以下のような表示が出ます。
Complete!
Transaction saved to /var/lib/dnf/system-upgrade/system-upgrade-transaction.json.
Download complete! Use 'dnf system-upgrade reboot' to start the upgrade.
To remove cached metadata and transaction use 'dnf system-upgrade clean'
The downloaded packages were saved in cache until the next successful transaction.
You can remove cached packages by executing 'dnf clean packages'.
出力メッセージに「Use ‘dnf system-upgrade reboot’ to start the upgrade.」とありますが、wsl の kernel は Microsoft 社がカスタマイズした独自の init プロセスを使用しているため、ネイティブ Linux のように systemd の機能が使えません。そのため、このコマンドを実行すると以下のようになります。
$ sudo dnf system-upgrade reboot
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
$
そして、再度同じコマンドを実行すると upgrade はスケジュールされていることが示されますが、wsl を exit して再起動しても状況に変わりはありません。
$ sudo dnf system-upgrade reboot
Error: upgrade is already scheduled
$
そこで DNF_SYSTEM_UPGRADE_NO_REBOOT という環境変数を使用します。これを以下のように設定することで、system-upgrade で実行される再起動を無効化します。環境変数の詳細が知りたい方はパッチを参照ください。
export DNF_SYSTEM_UPGRADE_NO_REBOOT=1
次に以下のコマンドを実行しますが、この時点でまだ sudo dnf system-upgrade reboot
を実行していない人はいちど実行しておいてください。下記 sudo コマンドの -E オプションは --preserve-env
の省略形です。現在の環境変数(DNF_SYSTEM_UPGRADE_NO_REBOOT=1)をそのまま保持することを sudo セキュリティポリシーに伝えます。また、このコマンドで Fedora 37 にアップグレードされるため、処理にしばらく時間が掛かります。
sudo -E dnf system-upgrade upgrade
終わると以下のような表示が出ます。
Complete!
Cleaning up downloaded data...
Reboot turned off, not rebooting.
これで Fedora 37 へのアップグレードは終わりです。最後に Fedora37 のパッケージをアップデートしたり、アップデート時に使用した一時ファイルを削除しておきましょう。はじめに以下のコマンドでアップデートします。
sudo dnf upgrade --refresh
次にアップデート時に使用したダウンロードデータを以下のコマンドで削除します。
sudo dnf system-upgrade clean
sudo dnf clean packages
wsl の Fedora アップグレード作業は以上です。
wsl のバックアップから復元する場合
もし何らかのトラブルでバックアップした wsl の Fedora を復元する必要がある場合は、Windows PowerShell から wsl —import コマンドを使用して次のように戻します。
コマンド書式
wsl --import [WSLで使用するディストリビューションの名前] [インストール先] [バックアップファイル] --version 2
実行例です。この例では、$env:LOCALAPPDATA
というフォルダの下に wsl というフォルダを予め作成してあるため、インストール先にそれを指定しています。インストール先のフォルダは任意に指定ください。
wsl --import Fedora36 $env:LOCALAPPDATA\\wsl\\ $env:USERPROFILE\\WSLBackUp\fedora.tar --version 2
下記の Fedora36 がバックアップファイルから戻したディストリビューションになります。
PS C:\Users\admin> wsl -l -v
NAME STATE VERSION
* Fedora Running 2
Fedora36 Stopped 2
PS C:\Users\admin>