二年ぶりの長期サポートバージョン Ubuntu 24.04 LTS に続いて、最初のポイントリリースである 24.04.1 もリリースされたところで、Windows 環境で使っている WSL(Windows Subsystem for Linux) 2 の Ubuntu も長らく使い続けてきた 22.04 LTS から 24.04 LTS へアップグレードしようとしたときの話です。
do-release-upgrade …失敗!
WSL で Ubuntu を使う場合、Microsoft Store で 「Ubuntu」と検索するといろいろ出てきますが、バージョンなどが併記されていない単に「Ubuntu」 となっているものをインストールしておけば、今、一番安定している LTS 版をインストールしてくれますし、いざ、バージョンアップとなっても
> sudo do-release-upgrade
で OK! …のはずなのですが、今回、ずっと使い続けている WSL2 環境でこれを行ってみると、うまくアップデート出来ませんでした。
ただ、唯一、最近、ASRock DeskMeet X300 と AMD Ryzen 5 5600G で新規に Windows 11 Home をクリーンインストールしたサブ環境だと、何の問題もなく、24.04 LTS へアップグレードできました。
これが気持ち悪い!
他にメインで使っている Windows 10 環境のデスクトップはもちろん、同じ Windows 11 環境のノート PC でもうまくいかないのに、最新の環境だけはうまくいく…最初は、まだバグもあるかも知れないし、失敗した環境には何度かアップグレードを続けてきたクリーンとは言えない環境もありますし、特段、22.04 LTS でも問題なく使えているし…と思っていたのですが、気持ち悪さが勝って、ついに本腰入れて調べました。
snapd …動いてないよね
アップグレードに失敗したときに、出力されるのが以下のエラー。
error: cannot list snaps: cannot communicate with server...
調べてみると snapd デーモンが起動していないときにでるエラーなのですが、そりゃそうでしょう?と思って
> systemctl status snapd
としてみると、当然…
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: ホストが落ちています
というエラーが返ってきます。
これはなぜかというと、snapd は Ubuntu に常駐するプログラム(デーモン)で、Ubuntu の場合、常駐プログラムを動かすには systemd というプログラムが裏で動いている必要があるからです。
( snapd とはなんぞや systemd とはなんぞや…という話を説明すると脱線してしまうので、興味がある方は自分で調べて下さい)
そもそも WSL2 で systemd は動かないよね…と調べてみると…
というドキュメントが出てきて、しれっと「サポートされるようになりました」と書いてある。
うちにある環境で唯一、24.04 LTS へのアップルレードがうまくいった Windows 11 のサブ環境の WSL2 の環境には、さらっと /etc/wsl.conf ファイルがあって、上記のドキュメントにあるように
[boot]
systemd=true
と記載されていました。当然、うまくいかなかった他の環境には記載どころか /etc/wsl.conf ファイルそのものがありません。
そうです。いつの間にか、WSL2 環境でも systemd が動くというのがデフォルトになっていたようなのです。
解決!
そこでうまくアップグレードできなかった環境で、systemd を起動するための wsl.conf ファイルを作ってあげて、一度、WSL2 のターミナルをすべて exit してから、管理者権限で立ち上げた PowerShell から
> wsl --shutdown
として、WSL2 を再起動。
そうして do-release-upgrade を実行してみると、何事もなく 24.04 LTS にアップグレードできました。
WSL2 のデフォルト設定が変わってるなど、こういう大事なことはもっと大々的に周知してください> Microsoft さま
ちなみに、そもそも snapd を消すと言う方法を取っていらっしゃる方もお見受けしましたが、クリーンインストールした際にデフォルトが systemd を動かす( snapd も動く)ようになっていたので、今回はこちらを採用しました。( snapd を消してうまくいくかは確認していないので、あしからず m(_ _)m )