はじめに
先日、自宅PCの(おそらく)マザーボードが故障して起動できなくなってしまったので、以前使っていたノートPCをフォーマットして故障したPCの代わりにWindows11をセットアップしました。
その際、WSLのインストール・セットアップに色々あって手間取ったのと、そういえば最近のWSLは、以前のように追加パッケージをインストールしなくてもネイティブにSystemdを動かせるようになっていたなと思い、セットアップした結果を紹介します。
-
以前の記事
WSLの準備
WSLを実行するために必要となる事前の準備を行います。
手順は公式ドキュメントにまとまっているので、基本的な手順は以下に沿って進めます。
以下目次
Windowsターミナルの設定
WSLセットアップ時、何度かPowerShellを管理者モードで起動する必要があるため、WindowsターミナルでPowerShellの管理者モードを起動できるようにしておきます。
Windowsターミナルを起動し、メニューから「設定」を選択。
「新しいプロファイルを追加します」から、複製元のプロファイルで「Windows PowerShell」を選択して、「複製」を選択します。
「名前」を任意(今回は「Windows PowerShell (管理者)」)で入力して、「このプロファイルを管理者として実行する」のトグルスイッチをオンにして「保存」すれば、次からはPowerShellを管理者モードで簡単に起動することができます。
サービスの有効化
WSLを使えるようにするため、「Linux用Windowsサブシステム」と「仮想マシンプラットフォーム」の有効化を行います。
Windowsメニューより、「システム」→「システム」→「オプション機能」→「Windowsのその他の機能」からGUIでも設定できますが、今回は公式ドキュメント通りコマンドで実行します。
Windowsターミナルを起動して、「+」ボタンから先程設定した管理者モードで起動するPowerShellを選択して以下コマンドを実行します。
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
上記設定後、Windowsの再起動を行う必要があるので一度再起動しておきます。
再起動後、WSLのコマンドを実行して、以下のように出力されることを確認して、もし失敗するようであれば「エラーが発生した場合の対処」を実行してみてください。
PS C:\Users\username> wsl
Linux 用 Windows サブシステムには、ディストリビューションがインストールされていません。
ディストリビューションは Microsoft Store にアクセスしてインストールすることができます:
https://aka.ms/wslstore
Linuxカーネル更新プログラムパッケージのインストール
以下のページのリンクにある、「x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ」から最新パッケージをダウンロードしてインストールします。
WSLのデフォルトバージョン変更
WSLにはVersion1とVersion2がありますが、Version2をデフォルトにするため、以下コマンドを実行します。
wsl --set-default-version 2
Ubuntuのインストール
「Microsoft Store」から「Ubuntu」を検索してインストールします。
インストール後、作成するユーザ名とパスワードを聞かれるため、それぞれ任意のユーザ名、パスワードを入力します。
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: [ユーザ名を入力]
New password: [パスワードを入力]
Retype new password: [パスワードを入力]
passwd: password updated successfully
Installation successful!
Systemdの有効化
以下よりSystemdを有効化していきます。
Systemdも以下公式ドキュメントに沿って進めていきますが、公式ドキュメントによると、すでにinitシステムの既定値がSystemdに変更となっているとのことなので、私のように新たにWindowsをインストールした方は作業不要かもしれません。
今回私が実施した手順に沿って以下進めていきます。
WSLのアップデート
WSLのコマンドはそのままではバージョンが古い場合があり、そのままではwsl --versionといったいくつかのコマンドが実行できないことがあるようです。
そのため、PowerShellより、以下コマンドを実行してWSLをアップデートします。
wsl --update
アップデート後、もしWSLコマンドが実行できなくなったり、Ubuntuにログインできなくなってしまった場合は「エラーが発生した場合の対処」を参考にしてみてください。
Systemdの確認・有効化
Systemdの有効化は、今まで操作してきたPowerShellからではなく、Linux(今回の場合はUbuntu)側のコマンドラインを操作して有効化する必要があります。
今回の手順通りに進めている場合、「Windowsターミナル」からUbuntuを実行できるようになっているはずなので、Ubuntuを起動し、wsl.confファイルを確認します。
cat /etc/wsl.conf
ファイルを確認し、systemdの設定がtrueになっていればSystemdが有効になっています。
[boot]
systemd=true
もし上記の設定になっていないようであれば、vi等で編集した後、wsl --shutdownコマンドで停止します。
wsl --shutdown Ubuntu
停止後、WindowsターミナルからUbuntuのターミナルを起動すると停止したUbuntuが起動してくるので、Ubuntuのコマンドラインから、以下のようなSystemctlコマンドを実行して結果が表示されれば問題ありません。
systemctl list-unit-files --type=service
エラーが発生した場合の対処
通常、Windowsサブシステムと仮想マシンプラットフォームを有効化すれば、WSLのコマンドが実行できるようになるはずですが、私の環境では「クラスが登録されていません」と表示され、実行できませんでした。
PS C:\Users\username> wsl
クラスが登録されていません
Error code: Wsl/CallMsi/REGDB_E_CLASSNOTREG
wsl --updateでアップデート後にも上記のWSLエラーが再度出力されるようになったり、またUbuntuログインしようとした際にも以下のようなエラーが出力されるようになりました。
Installing, this may take a few minutes...
WslRegisterDistribution failed with error: 0x8007019e
Error: 0x8007019e Linux ? Windows ??????????????????
Press any key to continue...
その時の私の環境情報等も載せておきます。
| 項目 | パラメータ |
|---|---|
| エディション | Windows 11 Pro |
| バージョン | 23H2 |
| OS ビルド | 22631.3085 |
| エクスペリエンス | Windows Feature Experience Pack 1000.22684.1000.0 |
| プロセッサ | AMD Ryzen 7 3700U with Radeon Vega Mobile Gfx 2.30 GHz |
| 実装RAM | 16.0 GB |
私の環境だけではなく、同じような事象が報告されているようで、以下参考にさせて頂いたページを見ると、バージョンによるバグのようです。
中々現状のWSLのバージョンを確認する方法が見つかりませんでしたが、PowerShellの管理者モードで以下ディレクトリ名を見ることでなんとか確認しました。
> ls 'C:\Program Files\WindowsApps\microsoftCorporationii*'
ディレクトリ: C:\Program Files\WindowsApps
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2024/01/28 13:20 microsoftcorporationii.windowssubsystemforlinux_2.0.14.0_x64__8wekyb3d8bbwe
私の場合、作業実施時の安定リリース版最新となる2.0.14.0でしたが、サービスを入れ直したりしても変わらなかったため、以下Microsoft WSLのGitHubページより、作業時のプレリリース版最新となる2.1.1をインストールしたところ、問題が発生しなくなりました。
同じように失敗する方がいれば参考にしてもらえればと思います。
おわりに
今まではWSLでSystemdサービスを実行するためには、オープンソースのユーザパッケージをインストールしたりしないと使えなかったので、仮想Linuxとして使用するにはちょっと難しい部分がありましたが、ネイティブでSystemdが実行できるようになったことで、WSLでもかなり使えるようになったと感じました。
ただ、Systemdがネイティブで実行できるようになったからなのか、WSL自体のインストール・セットアップは以前より不安定になっているなと個人的に感じました。


